2011-08-14 8 views
6

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

उत्तर

9

उपयोग की तरह कुछ देखने वाले उपयोगकर्ताओं उलझन में होगा:

[Browsable(false)] 
public bool AProperty {...} 

विरासत में मिला के लिए गुण:

:

[Browsable(false)] 
public override bool AProperty {...} 

एक और विचार (आप सभी आधार वर्ग के सदस्यों को छिपाने की कोशिश कर रहे हैं के बाद से)

और उसके बाद अपनी संपत्ति ग्रिड के लिए:

MyCtrl tx = new MyCtrl(); 
    pg1.SelectedObject = tx.ExtraProperties; 

नीचे की ओर यह आपकी पहुँच

tx.ExtraProperties.PropertyA = "foo"; 
+0

यह के बारे में वर्ग विरासत में मिला नहीं है, मैं आधार वर्ग के गुणों को छिपाना चाहते हैं। उस मामले में: टेक्स्टबॉक्स प्रोप। बेस क्लास प्रोप कैसे छिपाना है? यही तो प्रश्न है। –

+0

हां, यह काम करता है, मुझे पता है। आप मेरे प्रश्न में यह बयान देखेंगे: "उस मामले में कौन सी तकनीक लागू है? छिपाना? बेस क्लास का प्रत्येक प्रोप?" ... मैं बस सोच रहा हूं कि मैं गुणों को फ़िल्टर कर सकता हूं ... लेकिन लगता है कि रनटाइम के दौरान यह नहीं है संभव है, क्योंकि सभी गुण संकलित असेंबली के लिए स्थिर हैं। –

+0

लार्स, कृपया मेरा उत्तर पढ़ें। यही वही था जो मुझे चाहिए ... –

6

करने से

tx.PropertyA = "foo"; 

उन गुणों का स्तर बदल जाता MyCtrl गुण को छुपाने के लिए है, का उपयोग करें संपत्ति पर [Browsable(False)] विशेषता।

[Browsable(false)] 
public bool AProperty { get; set;} 

को छुपाने के लिए विरासत में मिला proeprties, आप आधार ओवरराइड और ब्राउज़ करने योग्य विशेषता लागू करने की जरूरत है।

[Browsable(false)] 
public override string InheritedProperty { get; set;} 

नोट: आप virtual या new कीवर्ड परिस्थितियों के आधार पर जोड़ने की जरूरत हो सकती है।

ControlDesigner का उपयोग करने के लिए एक बेहतर तरीका होगा। डिजाइनर के पास PreFilterProperties नामक एक ओवरराइड है जिसका उपयोग PropertyGrid द्वारा निकाले गए संग्रह में अतिरिक्त विशेषताओं को जोड़ने के लिए किया जा सकता है।

Designer(typeof(MyControlDesigner))] 
public class MyControl : TextBox 
{ 
    // ... 
} 

public class MyControlDesigner : ... 
{ 
    // ... 

    protected override void PreFilterProperties(
          IDictionary properties) 
    { 
     base.PreFilterProperties (properties); 

     // add the names of proeprties you wish to hide 
     string[] propertiesToHide = 
        {"MyProperty", "ErrorMessage"}; 

     foreach(string propname in propertiesToHide) 
     { 
      prop = 
       (PropertyDescriptor)properties[propname]; 
      if(prop!=null) 
      { 
       AttributeCollection runtimeAttributes = 
              prop.Attributes; 
       // make a copy of the original attributes 

       // but make room for one extra attribute 

       Attribute[] attrs = 
        new Attribute[runtimeAttributes.Count + 1]; 
       runtimeAttributes.CopyTo(attrs, 0); 
       attrs[runtimeAttributes.Count] = 
           new BrowsableAttribute(false); 
       prop = 
       TypeDescriptor.CreateProperty(this.GetType(), 
          propname, prop.PropertyType,attrs); 
       properties[propname] = prop; 
      }    
     } 
    } 
} 

आप proeprties आप propertiesToHide जिसमें अधिक स्पष्ट अलग होने के लिए अनुमति देता है के लिए छिपाने के लिए इच्छा के नाम जोड़ सकते हैं।

क्रेडिट जहां कारण: http://www.codeproject.com/KB/webforms/HidingProperties.aspx#

+0

यह सही है .. धन्यवाद। का क्या अर्थ है ("<{0}: MyControl runat =" server ">")? क्या यह एएसपी से है? मैं WinForms का उपयोग कर रहा हूँ ... –

+0

हां। आप Winforms के लिए उस हिस्से को अनदेखा कर सकते हैं। मैं अपना जवाब अपडेट करूंगा। – Mrchief

+0

मैंने कोशिश की, लेकिन इससे मदद नहीं मिली। क्या यह RUNTIME के ​​दौरान काम करता है? –