2011-06-09 14 views
6

पर फेंकता है मैं एक सार UserControl, BaseControl रखना चाहता हूं, जो एक इंटरफ़ेस IBaseControl लागू करता है। हालांकि, सार टूटता VisualStudio डिजाइनर के लिए कक्षा की स्थापना (यह इस के आसपास काम करने के लिए दृश्य स्टूडियो (जैसे, अधिक जानकारी के लिए this StackOverflow posting देखें), और जहाँ तक मुझे पता है, वहाँ no change expected in the near futureविजुअलस्टूडियो 2010 डिज़ाइनर लागू वर्चुअल विधि

तो, के साथ एक ज्ञात मुद्दा है, । मैं BaseControl सार नहीं है, और IBaseControl तरीकों आभासी की इसके कार्यान्वयन हालांकि, बाद से इन तरीकों एक BaseControl (जैसे, सभी घटकों को अभी तक जोड़ा गया है नहीं) के लिए कोई अर्थ नहीं है, मैं उन्हें फेंक कर:

public class BaseControl : UserControl, IBaseControl 
{ 
    /// <summary> 
    /// This IBaseControl method is not abstract because 
    /// that breaks the Designer 
    /// </summary> 
    public virtual void LoadSettings() 
    { 
     throw new NotImplementedException("Implement in derived class."); 
    } 

    private void BaseControl_Load(object sender, EventArgs e) 
    { 
     // intention: derived methods automagically load their settings 
     this.LoadSettings(); 
    } 
} 

में व्युत्पन्न नियंत्रण, मेरे पास संबंधित ओवरराइड है:

public partial class DerivedControl : BaseControl 
{ 
    public override void LoadSettings() 
    { 
     // load settings 
    } 
} 

इसके बावजूद, जब मैं डिजाइनर में नियंत्रण खोलने का प्रयास करता हूं, तो मुझे एक त्रुटि मिलती है जो BaseControl.LoadSettings ने अपवाद फेंक दिया है।

अब, LoadSettings याद आधार वर्ग में कहा जाता है, इसलिए जब डिजाइनर लोड करता है DerivedControl, यह बदले में BaseControl, जो फेंकता के लिए लोड प्रणाली को बुलाती है।

क्या आपको ऐसी ही समस्या का सामना करना पड़ा है? आपने इससे कैसे निपटाया है? यदि संभव हो, तो मैं एक सुरुचिपूर्ण समाधान करना चाहता हूं।

+0

कोई रेपो नहीं, मुझे उम्मीद नहीं थी। टूलबार पर आपके पास दो नियंत्रण हैं, गलत मत चुनें। लोड ईवेंट का उपयोग करने के बजाय आपको वास्तव में ऑनलोड को ओवरराइड करना चाहिए। –

उत्तर

6

अपवाद फेंकने का कारण यह है कि, अजीब रूप से पर्याप्त, डिज़ाइनर उस श्रेणी को संकलित या तत्काल नहीं करता है जिसे आप पर डिज़ाइन कर रहे हैं! यह केवल आपके द्वारा डिजाइन किए जा रहे नियंत्रण के आधार वर्ग को संकलित और त्वरित करता है।

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

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

  • नहीं आधार वर्ग से अपवाद फेंक, या
  • सशर्त है कि क्या यह डिजाइन समय या नहीं है के आधार पर अपवाद फेंक नहीं: केवल व्यावहारिक समाधान करने के लिए या तो है।

या तो काम करेगा; जो भी आप पसंद करते हैं उसका उपयोग करें या अपने डिजाइन के लिए सबसे अच्छा काम करता है। डिजाइनर काम करता है और जैसा कि आप उल्लेख करते हैं, यह बदलने की संभावना नहीं है।

+1

बहुत बढ़िया, यह है! अब मैं सशर्त रूप से फेंकने के लिए 'if (! DesignMode) 'का उपयोग कर रहा हूं। –

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

  • कोई संबंधित समस्या नहीं^_^