2009-09-17 15 views
5

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

जब आप इसके बारे में सोचते हैं, तो फॉर्म या उपयोगकर्ता नियंत्रण के रचनाकारों में कोड केवल उस राज्य से निपटना चाहिए जिसके लिए फ़ॉर्म को लोड करने की आवश्यकता नहीं है। यूआई ऑब्जेक्ट्स प्रारंभिकरण से निपटने वाला कोड नियंत्रण के लिए लोड इवेंट हैंडलर में स्थित होना चाहिए। और उस समारोह में, DesignMode संपत्ति काम करता है। डिजाइनर उस समय अपने उचित मूल्य का उपयोग करेगा।

सिद्धांत रूप में, InitializeComponent() विधि को कॉल किया गया है, लेकिन वास्तव में, जब आप डिज़ाइन व्यू में नियंत्रण दिखाते हैं, तो डिज़ाइनर केवल उस कार्य को पार करता है, यह इसे नहीं चलाता है। हालांकि, डिजाइनर नेस्टेड नियंत्रण के निर्माता को चलाता है। यदि आपको पूरी तरह से कन्स्ट्रक्टर में प्रारंभिक कोड डालना होगा, तो System.ComponentModel.LicenseManager क्लास का उपयोग करें, इसमें एक स्थिर संपत्ति है जिसे UsageMode कहा जाता है जो DesignTime या RunTime के मान लेता है। आप उस संपत्ति को अपने नियंत्रण के निर्माता में पूरी तरह से भरोसा कर सकते हैं - लेकिन केवल निर्माता में!

मैं इस समय काम कर रहा हूं कि ऐप में उस छोटी सी सूक्ष्मता को भूल गया था। इस मुद्दे को हल करने के लिए, मैं इस पैटर्न का पालन कर रहा हूं कि सभी नियंत्रण और रूप जिन्हें अतिरिक्त प्रारंभिकता की आवश्यकता है, को लोड ईवेंट के लिए एक हैंडलर लागू करना होगा। वहां, DesignMode प्रॉपर्टी ठीक काम करती है, और मुझे डिजाइनर में अपने उपयोगकर्ता नियंत्रण और फॉर्म खोलने में कभी परेशानी नहीं होती है।

यदि मेरे पास कक्षा पदानुक्रम है, तो मैं कभी-कभी उस ईवेंट हैंडलर वर्चुअल संरक्षित करता हूं, और जब मैं सबक्लास को अतिरिक्त प्रारंभिकता की आवश्यकता होती है तो मैं इसे केवल ओवरराइड करता हूं।

मैं कर रहा हूँ सोच रहा है, हालांकि, अगर वहाँ बेहतर तरीकों सारे हैं, या अगर कोई इस पैटर्न के बारे में कुछ बदबूदार (अन्य है कि एक लोड ईवेंट हैंडलर कई बार लागू करने के लिए हो रही है?)

+0

बहुत उपयोगी, धन्यवाद। –

उत्तर

2

साथ मुद्दों के कारण है नेस्टेड नियंत्रण (और संबंधित समस्याओं) के साथ DesignMode प्रॉपर्टी का उपयोग करके, इस समस्या का मेरा सामान्य दृष्टिकोण यह है कि मेरे कस्टम UserControls को डिज़ाइन मोड में कार्य करने का प्रयास न करें। आम तौर पर मेरे नियंत्रण बहुत जटिल और मालिक-तैयार होते हैं, इसलिए यदि डिज़ाइनमोड नेस्टेड नियंत्रणों के साथ काम किया है, तो भी उन्हें डिज़ाइन मोड में सार्थक कुछ भी दिखाने के लिए प्रोग्रामिंग प्रयास का एक बड़ा सौदा होगा (और यह विकास कार्य को धीमा कर देगा, क्योंकि नियंत्रणों को प्रारंभिकरण और सेटअप समय की एक महत्वपूर्ण मात्रा की आवश्यकता होती है)।

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

मुझे यह देखने में दिलचस्पी है कि क्या आपको इस प्रश्न का कोई अन्य जवाब मिलता है, हालांकि, यह आपकी समस्याओं का समाधान कर सकता है।

+0

यह डिज़ाइन व्यू में आपके नियंत्रण को देखने में सक्षम होने के लिए एक वास्तविक सुविधा है, खासकर यदि आप उन्हें उप-श्रेणी बनाना चाहते हैं। यदि आप नहीं करते हैं, तो कम से कम एक रूप में नियंत्रण के लेआउट के लिए एक फ्रेम ठीक है (जैसे आप कर रहे हैं)। यदि नियंत्रण बहुत मानक का उपयोग करता है और आपको स्थिति, गुणों या नियंत्रण के घटकों के ईवेंट हैंडलर के साथ टिंकर करने की आवश्यकता होती है, तो यथार्थवादी दिखने वाला डिज़ाइन दृश्य महत्वपूर्ण हो जाता है। इसके अलावा, मुझे लगता है कि यह जानना फायदेमंद है कि मेरा नियंत्रण किसी ऐसे व्यक्ति द्वारा उपयोग किया जा सकता है जिसके पास कोड नहीं हो सकता :)। –

+0

@ सैम: मैं जो कुछ भी कहता हूं उससे पूरी तरह से सहमत हूं, और कभी-कभी मैं अपने नियंत्रण को डिज़ाइन मोड में काम करने की कोशिश करने में आकर्षित होता हूं। जैसे ही मैं गंभीर समस्याओं में भाग लेता हूं, हालांकि, मैं आमतौर पर छोड़ देता हूं, हालांकि कभी-कभी पर्याप्त नहीं होता। – MusiGenesis

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