2010-07-07 6 views
8

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

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

+0

की संभावित डुप्लिकेट [Winforms पर्चा निर्माता लोड घटना बनाम] (http://stackoverflow.com/questions/264396/winforms-form-constructor-vs-load-event) –

उत्तर

8

हां, यह एक बहुत दुखद है कि यह इस तरह से काम करता है। उस समय 10 साल पहले यह बहुत समझ में आया था। विंडोज फॉर्म को उस समय वीबी 6, प्रमुख पॉइंट-एंड-क्लिक यूआई डिजाइनर के प्रतिस्थापन के लिए लक्षित किया गया था। और V_6 में Form_Load महत्वपूर्ण था, जहां आपने फ़ॉर्म व्यू को कस्टमाइज़ किया था।

यह जाने-माने से वास्तव में उपयुक्त नहीं था, फॉर्म क्लास में एक सच्चा खून वाला कन्स्ट्रक्टर है। और वास्तविक देशी विंडो नियंत्रण बनने से पहले आप कन्स्ट्रक्टर में नियंत्रण गुण सेट कर सकते हैं। उस काम को करने के लिए डब्ल्यूएफ में कोड का एक टन है। कोड जो डिजाइनर निर्भर करता है, यह लोड ईवेंट आग से पहले इन गुणों को सेट करता है। ऐसा करने में बहुत ही कुशलता है, कई नियंत्रण बहुत धीमे होते हैं जब उन्हें अपनी विंडो के निर्माण के बाद अद्यतन करने की आवश्यकता होती है। ListView और TreeView की तरह।

डिजाइनर की तरह खुद को कन्स्ट्रक्टर का उपयोग न करने के कुछ कारण हैं, खासकर जब से सी # आईडीई कन्स्ट्रक्टर को छिपाने की कोशिश नहीं करता है। एक को छोड़कर: आप लोड ईवेंट की आवश्यकता होती है जब आप उस प्रकार का कोड लिखते हैं जिसके लिए वास्तविक रूप आकार जानने की आवश्यकता होती है। वह आकार तब तक ज्ञात नहीं है जब तक कि खिड़की वास्तव में बनाई जाती है, लोड घटना उसके बाद सबसे पुरानी है। यह दुर्लभ होना चाहिए।

और निश्चित रूप से, यदि आप लोड का उपयोग करना चाहते हैं तो लोड लोड का उपयोग करने के बजाय आप ऑनलोड को ओवरराइड करते हैं। वह एक और होगा।

2

जब आप डिज़ाइनर (किसी फ़ॉर्म सहित) में किसी भी नियंत्रण को डबल-क्लिक करते हैं, तो आप उस नियंत्रण के लिए सबसे आम ईवेंट हैंडलर पर कूद जाते हैं। इसका मतलब यह नहीं है कि वहां कुछ भी करना बेहतर है - बस किसी ने इसे सबसे अधिक संभावित ईवेंट हैंडलर समझा है।

एक फॉर्म का Load ईवेंट आमतौर पर सभी नियंत्रणों के निर्माण के बाद होता है। कन्स्ट्रक्टर पहले से होता है। जिस तर्क को आप कार्यान्वित कर रहे हैं उसके आधार पर कुछ तरीकों को एक विधि या दूसरे में संभालने के लिए फायदेमंद हो सकता है। उदाहरण के लिए, कन्स्ट्रक्टर में कई मानों को प्रारंभ करना बेहतर होता है: यदि मान प्रपत्र के लेआउट या सामग्री को प्रभावित करते हैं, तो आप पाएंगे कि आप "बर्बाद" नियंत्रण पदानुक्रम बना रहे हैं जो आपके मानों को बदलते समय पुनर्निर्मित किया जाता है। कन्स्ट्रक्टर में प्रारंभिकरण को रखकर फ़ॉर्म को पहली बार सही तरीके से निर्माण करने दे सकता है - जो अधिक निष्पादक है और कुछ त्रुटियों से बच सकता है।

आखिरकार, उन दोनों विधियों का उपयोग होता है - देखें कि आपका कोड क्या कर रहा है और उचित है।

1

मैं हमेशा कन्स्ट्रक्टर का उपयोग करता हूं और लगभग कभी भी फॉर्म नहीं करता हूं। लोड ईवेंट जब तक मैं बिना दूर नहीं जा सकता। इसका कारण यह है कि जब लोड ईवेंट वास्तव में नहीं हो सकता है तो निर्माता पैरामीटर प्राप्त कर सकता है।

यह है इतना अधिक उपयोगी

+0

पैरामीटर के साथ आप कन्स्ट्रक्टर में आंतरिक फ़ील्ड प्रारंभ कर सकते हैं। उसके बाद आप इसे फॉर्म के लोड में उपयोग कर सकते हैं ... – serhio

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