2008-09-15 18 views
9

लघु संस्करण: मैं फ़ॉर्म को दिखने के बिना Form_Load() ईवेंट ट्रिगर करना चाहता हूं। यह काम नहीं करता क्योंकि शो() दर्शनीय संपत्ति के वर्तमान मूल्य पर ध्यान नहीं देता:इसे दिखाए बिना एक फॉर्म लोड करें

tasksForm.Visible = false; 
tasksForm.Show(); 

लांग संस्करण: मुख्य और कार्यों: मैं दो रूपों के साथ एक WinForms आवेदन किया है। मुख्य रूप हमेशा प्रदर्शित होता है। उपयोगकर्ता या तो कार्य प्रपत्र खोलने के लिए एक बटन क्लिक कर सकते हैं, या कुछ बटन क्लिक कर सकते हैं जो कार्य फ़ॉर्म खोलने के बिना सीधे कार्य चलाते हैं।

जब कोई उपयोगकर्ता सीधे कार्य चलाने के लिए कहता है, तो मैं इसे बिना किसी दिखाए कार्य कार्यों पर कुछ सार्वजनिक तरीकों को कॉल करना चाहता हूं। दुर्भाग्यवश, कार्य तर्क Form_Load() ईवेंट में होने वाली सामग्री पर निर्भर करता है। Form_Load() को ट्रिगर करने के लिए मुझे ढूंढने का एकमात्र तरीका शो() को कॉल करना है। सबसे अच्छा मैं ऐसा करने में सक्षम किया गया है कम से कम राज्य में रूप को दिखाने के लिए है:

tasksForm.WindowState = FormWindowState.Minimized; 
tasksForm.Show(); 

मुझे लगता है साफ समाधान कार्य रूप से बाहर है और एक नियंत्रक वर्ग में कार्य तर्क को खींचने के लिए किया जाएगा। फिर मैं उस वर्ग को मुख्य रूप से और कार्य प्रपत्र से उपयोग कर सकता हूं, और केवल उपयोगकर्ता के लिए दृश्यमान होने पर कार्य फ़ॉर्म लोड कर सकता हूं। हालांकि, अगर इसे प्रदर्शित किए बिना फॉर्म लोड करना एक आसान बात है, तो यह एक छोटा बदलाव होगा।

+0

मैं आपको सबसे स्वच्छ समाधान के साथ जाने के लिए प्रोत्साहित करता हूं। बाद में इसे बनाए रखना आपके लिए आसान होगा। –

+0

जैसा कि मैंने अपने उत्तर में कहा है और मैं स्कॉट के साथ सहमत हूं, आपको इसे फिर से करने और नियंत्रक वर्ग मार्ग पर जाने की आवश्यकता है। यह अच्छा अभ्यास है। –

उत्तर

7

मैं रिच बी के साथ पूरी तरह से सहमत हूं, आपको यह देखने की आवश्यकता है कि आप WinForms तंत्र को समझने की बजाय अपने एप्लिकेशन तर्क कहां रख रहे हैं। उन सभी परिचालनों और डेटा जो आपके कार्य प्रपत्र का खुलासा कर रहे हैं, वास्तव में एक अलग वर्ग में होना चाहिए, किसी प्रकार का एप्लिकेशन कंट्रोलर या आपके मुख्य रूप से आयोजित कुछ और फिर अपने कार्यों के रूप में उपयोग किए जाने पर डेटा को पढ़ने और प्रदर्शित करने के लिए उपयोग किया जाता है लेकिन नहीं अस्तित्व में आने के लिए एक फॉर्म की आवश्यकता है।

यह शायद यह rework करने के लिए एक दर्द लगता है, लेकिन आप अनुप्रयोग की संरचना में सुधार हो जाएगा और इसे और अधिक पोषणीय बनाने आदि

+1

* श्वास * ठीक है, मैं अच्छा होगा। प्रतिक्रिया के लिए धन्यवाद, सबको। –

9

यह मुझे लगता है जैसे आपको बैठने और फिर अपना दृष्टिकोण फिर से सोचने की आवश्यकता है। मैं कल्पना नहीं कर सकता कि आपके सार्वजनिक तरीकों को एक रूप में होना चाहिए यदि आप इसे दिखाने के लिए नहीं जा रहे हैं। बस एक नई कक्षा बनाओ।

+0

अपने बिंदु पर extrapolate करने के लिए, कार्य के लिए मॉडल वर्ग है, और दृश्य/नियंत्रक वर्ग जो टास्कफॉर्म है। – user7116

+0

@sixlettervariables: उसे एक दृश्य की आवश्यकता क्यों होगी? उन्होंने कहा कि वह वैसे भी फॉर्म लोड नहीं करेगा। लगता है जैसे उसे सिर्फ कक्षा की जरूरत है। – GEOCHET

+0

मुझे उस हिस्से को याद आया जहां वह डेटा देखने के लिए भी नहीं जा रहा था। गैर-स्टार्टर प्रश्न की तरह यदि यह एकमात्र प्रश्न है ... – user7116

0

यदि आप विधि को सार्वजनिक करते हैं, तो आप इसे सीधे एक्सेस कर सकते हैं .... हालांकि, जब आप इसे कॉल करते हैं तो कुछ अप्रत्याशित दुष्प्रभाव हो सकते हैं। लेकिन इसे सार्वजनिक बनाना और इसे सीधे कॉल करना स्क्रीन को आकर्षित नहीं करेगा या फॉर्म खोल देगा।

0

Load ईवेंट हैंडलर से बाहर प्रपत्र में फॉर्म क्लास के लिए अनिवार्य प्रारंभिक कोड ले जाएं। एक फॉर्म क्लास के लिए, एक इंस्टेंसेशन (कन्स्ट्रक्टर के माध्यम से) का तात्कालिकता, फॉर्म लोडिंग और फॉर्म दृश्यता तीन अलग-अलग चीजें हैं, और एक ही समय में होने की आवश्यकता नहीं है (हालांकि उन्हें स्पष्ट रूप से उस क्रम में होने की आवश्यकता है)।

4

MSDN से:

Form.Load
किसी फ़ॉर्म को पहली बार प्रदर्शित होने से पहले होता है।

मतलब केवल एक चीज है जो फ़ॉर्म को लोड करने का कारण बनती है, जब यह प्रदर्शित होती है।
Form.Show(); और Form.Visible = true; एक ही चीज़ हैं। असल में, दृश्यों के पीछे, विभिन्न स्थितियों के लिए चेक दिखाएं, फिर सत्य को दृश्यमान सेट करें। तो जाहिर है, फॉर्म दिखाने से पहले झूठी (जो पहले से ही है) को दृश्यमान करना अर्थहीन है।

लेकिन चलिए तकनीकी भूल जाते हैं। मैं रिच बी और शॉन ऑस्टिन से पूरी तरह से सहमत हूं - तर्क उस रूप में वैसे भी नहीं होना चाहिए।

11

शायद यह ध्यान दिया जाना चाहिए कि फ़ॉर्म को दिखाए बिना फॉर्म की विंडो बनाई जा सकती है। मुझे लगता है कि ऐसा करने के लिए वैध स्थितियां हो सकती हैं।

वैसे भी

, अच्छा या नहीं डिजाइन, आपको लगता है कि इस तरह से कर सकते हैं:

MyForm f = new MyForm(); 
IntPtr dummy = f.Handle; // forces the form Control to be created 

मुझे नहीं लगता कि इस Form_Load() का कारण होगा के नाम से जाना है, लेकिन आप f.Invoke कॉल करने के लिए सक्षम हो जाएगा() इस बिंदु पर (जो मैं इस SO सवाल पर ठोकर खा रहा था)।

+0

इस उत्तर ने मुझे बहुत मदद की। – Kelsie

+0

एक कारण है कि ऐप को एक सेवा की तरह चलाना है –

1

कभी-कभी यह खराब डिज़ाइन के बिना उपयोगी होगा। कभी-कभी यह देशी से प्रबंधित में माइग्रेशन की शुरुआत हो सकती है।

यदि आप उदाहरण के लिए .NET में एक C++ ऐप माइग्रेट कर रहे थे, तो आप बस अपने यूहोल ऐप को .NET फॉर्म या पैनल की एक बाल विंडो बना सकते हैं, और धीरे-धीरे अपने सी ++ ऐप मेनू से छुटकारा पाने के द्वारा .NET पर माइग्रेट कर सकते हैं। , स्टेटस बार, टूलबार और मैपिंग टीएच। प्लेटफ़ॉर्म इनवॉक इत्यादि का उपयोग करके अपने ऐप पर ...

आपके सी ++ ऐप को लोड करने में कुछ समय लग सकता है, लेकिन .NET form doesn't..in जो आपको पसंद हो सकता है .NET फॉर्म को छिपाने के लिए जब तक आपके C++ ऐप ने स्वयं को प्रारंभ नहीं किया है।

मैं शो कॉल करने के बाद अस्पष्टता = 0 और दृश्य = झूठी झूठी सेट करता हूं, फिर जब आपका सी ++ ऐप लोड होता है, तो उलट जाता है।

संबंधित मुद्दे