2009-06-25 13 views
9

में विरासत नियंत्रणों तक पहुंच कैसे प्राप्त करें मैं कुछ नियंत्रण कर रहा हूं जो सभी को समान दिखने और कुछ सामान्य व्यवहार साझा करना है, हालांकि वे विभिन्न प्रकार के इनपुट के लिए हैं। इसलिए मैंने बेस क्लास बनाया जो उपयोगकर्ता नियंत्रण से प्राप्त होता है, और मेरे सभी नियंत्रण बेस क्लास से प्राप्त होते हैं।Winforms डिजाइनर

हालांकि, अगर मैं डिज़ाइनर में बेस क्लास के लिए नियंत्रण जोड़ता हूं, जैसे कि TableLayoutPanel, जब मैं विरासत कक्षाओं को डिज़ाइन कर रहा हूं तो मैं उन तक नहीं पहुंच सकता। मैं TableLayoutPanel देखता हूं, लेकिन भले ही वह "संरक्षित" है, मैं इसे संशोधित नहीं कर सकता या डिजाइनर के माध्यम से इसमें नियंत्रण नहीं डाल सकता। मुझे कोड द्वारा इसे accesing कोई परेशानी नहीं है, लेकिन मैं डिजाइनर का उपयोग करने की क्षमता खोना नहीं चाहता।

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

पर्यावरण: सी #, .NET 3.5, विजुअल स्टूडियो 2008

संपादित SLaks के सुझाव जवाब देने के लिए। मैंने एक संपत्ति स्थापित करने की कोशिश की, और हालांकि मुझे उनका उपयोग करने के लिए उपयोग नहीं किया जाता है, यह काम नहीं कर रहा है। यहां कोड मैंने कोशिश की है:

public partial class UserControl1 : UserControl 
    { 
      public UserControl1() 
      { 
        InitializeComponent(); 
      } 

      public TableLayoutPanel TableLayoutPanel1 
      { 
        get { return tableLayoutPanel1;} 
        set { tableLayoutPanel1 = value;} 
      } 
    } 

    public partial class UserControl2 : UserControl1 
    { 
      public UserControl2() 
      { 
        InitializeComponent(); 
      } 
    } 
+0

क्या आप टेबललेआउट पैनेल से ही उत्तराधिकारी बन सकेंगे? – SLaks

+0

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

+0

और बीटीडब्ल्यू, एक विनफॉर्म नियंत्रण से विरासत में डिज़ाइनर काट देगा, आमतौर पर, बिंदु केवल एक विशिष्ट व्यवहार को लागू करने के लिए है, न कि नियंत्रण को फिर से डिजाइन करना। – Ksempac

उत्तर

11

जब आप डिज़ाइनर के साथ विरासत नियंत्रण से पहुंचने का प्रयास करते हैं तो बेसले नियंत्रण में घोषित टेबललेआउट पैनेल में, आप "विजुअल इनहेरिटेंस" नामक WinForms में एक सुविधा का उपयोग कर रहे हैं।

दुर्भाग्य TableLayoutPanel दृश्य विरासत का समर्थन नहीं करता: http://msdn.microsoft.com/en-us/library/ms171689%28VS.80%29.aspx

है यही कारण है कि TableLayoutPanel विरासत में मिला नियंत्रण में अवरुद्ध प्रकट होता है।

+0

मैं सीधे इस समस्या में भाग गया। एफटीए: "TableLayoutPanel नियंत्रण का उपयोग कम से कम करें।" –

+0

हां यह एक मृत अंत की तरह दिखता है। मैं टेबललेआउट और डिजाइनर के लिए अधिकांश सी # स्रोत ढूंढने में सक्षम था लेकिन ऐसा लगता है कि मुझे इस नियंत्रण से जुड़े FlowPanelDesigner.uex फ़ाइलों को कभी नहीं मिलेगा – garaber

0

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

+0

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

+0

व्युत्पन्न नियंत्रण को डिजाइन करते समय आप मूल नियंत्रण को संशोधित नहीं कर सकते हैं। वैसे भी आसानी से नहीं। यदि आपने "खाली रिक्त स्थान" सार्वजनिक (उदा।, खालीपन 1, खालीप्लान 2, ...) बनाया है, तो उनके लिए अपना स्वयं का टाइप एडिटर प्रदान किया गया है, आप कम से कम नियंत्रण को सेट करने की अनुमति दे सकते हैं। एक प्रकार का संपादक बनाना हालांकि कुछ काम है। –

1

पैनल की परिभाषा से इस विशेषता को जोड़ने (यह या मदद नहीं हो सकता है) की कोशिश:

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
+0

नहीं, यह काम नहीं करता है। – Ksempac

+0

फ़ील्ड को निजी बनाने का प्रयास करें, और इसे उस संपत्ति को जोड़कर सार्वजनिक संपत्ति में जोड़ दें। – SLaks

+0

स्प्लिटकॉन्टेनर – SLaks

0

अपने नियंत्रण के लिए एक ParentControlDesigner बनाने, InternalControlDesigner अधिभावी, और (designerHost.GetDesigner(tableLayoutPanel) as ControlDesigner) लौटने का प्रयास करें। designerHost(IDesignerHost) component.Site.GetService(typeof(IDesignerHost)) है।

0

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