2009-11-21 22 views
14

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

क्या प्रीप्रोसेसर प्रतीक की तरह कुछ है जो मैं अपने कोड को चिह्नित कर सकता हूं ताकि विजुअल स्टूडियो उस समय कोड को उस समय निष्पादित करने का प्रयास नहीं करेगा?

+0

क्या यह एक अच्छा डिजाइन है? आईएमओ, किसी को कन्स्ट्रक्टर में बहुत कुछ नहीं करना चाहिए (डेटाबेस से कनेक्ट करना, अपने मामले में)। मुझे यह देखना अच्छा लगेगा कि विशेषज्ञों को क्या कहना है। – shahkalpesh

उत्तर

26

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

मैं बस इस blog entry पर चला गया जो वर्णन करता है कि System.ComponentModel.LicenseManager.UsageMode संपत्ति का उपयोग उसी चीज़ के लिए कैसे करें। नेस्टेड नियंत्रण से निपटने के दौरान ब्लॉग DesignMode संपत्ति की अतिरिक्त कमी का वर्णन करता है। जाहिर है, UsageMode संपत्ति में समान कमीएं नहीं हैं और यह कन्स्ट्रक्टर में उपयोग के लिए उपलब्ध है। मैं व्यक्तिगत रूप से इसके लिए झुकाव नहीं कर सकता, लेकिन यह सार्थक लग सकता है।

+0

आपके द्वारा लिंक किया गया ब्लॉग पोस्ट पूरी तरह से मेरे लिए काम करता है! (कम से कम अब तक) – polyglot

+0

यह जानना अच्छा है। अगली बार जब मुझे कस्टम नियंत्रण की आवश्यकता होती है तो मैं उस तकनीक का लाभ उठा सकता हूं। –

+6

ब्लॉग अब मर चुका है लेकिन मूल रूप से यह केवल है: 'अगर (System.ComponentModel.LicenseManager.UsageMode == System.ComponentModel.LicenseUsageMode.Designtime) ' – Gareth

10

विंडोज़ फॉर्म में?

if (!DesignMode) 
{ 
    // code that shouldn't be executed at design time 
} 

जैसा कि अन्य ने उल्लेख किया है, यह कन्स्ट्रक्टर में काम नहीं करेगा। यह अक्सर Form.Load घटना में उपयोग किया जाता है।

+3

शानदार, बिल्कुल एक ही समय एक्स-) –

+0

बिंदु के लिए त्वरित और दाएं! मैं कुछ प्रीप्रोसेसर प्रतीक की उम्मीद कर रहा था क्योंकि संकलन के बाद कार्यक्रम को प्रभावित नहीं करेगा, लेकिन इस छोटी जांच का प्रभाव निश्चित रूप से न्यूनतम है;) – polyglot

+2

कृपया सावधान रहें! DesingMode संपत्ति में कुछ समस्याएं हैं जिन पर विचार किया जाना चाहिए। आप यहां एक लेख पा सकते हैं: http://weblogs.asp.net/fmarguerie/archive/2005/03/23/395658।एएसपीएक्स – Beatles1692

0

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

उदाहरण:

public SomeViewModel() 
{ 
    if (!IsInDesignMode) 
    { 
     DoWork(); 
    } 
} 
0
public SomeViewModel() 
{ 
    if (!IsInDesignMode) 
    { 
     DoWork(); 
    } 
} 

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

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