2011-01-14 21 views
13


क्या "ब्राउज़ करने योग्य" विशेषता सशर्त बनाने का कोई तरीका है, इसलिए यह लागू करने वाली संपत्ति कभी-कभी गुण पृष्ठ में दिखाई देगी और कभी-कभी नहीं?
धन्यवाद :)सशर्त "ब्राउज़ करने योग्य" विशेषता

उत्तर

7

जैसी कोई आसान तरीका नहीं है।

आप संभवतः ICustomTypeDescriptor को लागू करके इसे बाहर कर सकते हैं। यहां implementing ICustomTypeDescriptor के बारे में एक अच्छा लेख है।

या आप अपनी कक्षा के साथ अपने ControlDesigner को जोड़ सकते हैं और संपत्ति ग्रिड में देखी गई संपत्तियों को जोड़ने या हटाने के लिए PreFilterProperties विधि को ओवरराइड कर सकते हैं।

Removing certain properties from property grid.

+2

ICustomTypeDescriptor.got को लागू करने के लिए लिंक https://msdn.microsoft.com/magazine/msdn-magazine-issues को इंगित करता है मुझे लगता है कि उन्होंने मूल पृष्ठ – gg89

6

आप कस्टम प्रकार-मॉडल प्रदान करके ऐसा कर सकते हैं; पर सबसे सरल स्तर पर, आप ExpandableObjectConverter से प्राप्त अपने प्रकार के लिए एक कस्टम TypeDescriptor प्रदान कर सकते हैं, और बस दिए गए प्रॉपर्टी को शामिल/बहिष्कृत करें - लेकिन यह केवल PropertyGrid के साथ काम करता है - गुण पृष्ठ द्वारा उपयोग किया जाता है। ICustomTypeDescriptor/TypeDescriptionProvider का उपयोग करने के लिए एक और जटिल दृष्टिकोण है - यह DataGridView

0

मैं एक तरह से दृश्य या IntelliSense में छिपा हुआ कुछ सदस्यों की घोषणा और यह सब संकलन समय पर छिपा हो करने के लिए आवश्यक है कि के लिए एक बार बदलने के लिए सक्षम होने के लिए की तलाश में इस बारे में जाना। मैं यह नहीं बता सकता कि क्या आप यही खोज रहे थे या नहीं, लेकिन मुझे अपने प्रश्न का उत्तर मिला ... लगा कि यह साझा करने में चोट नहीं पहुंचा सकता है।

#if IS_VIS 
    public const System.ComponentModel.EditorBrowsableState isVis = 
     ComponentModel.EditorBrowsableState.Always; 
#else 
    public const System.ComponentModel.EditorBrowsableState isVis = 
     ComponentModel.EditorBrowsableState.Never; 
#endif 
:

मैं एक सशर्त संकलन प्रतीक (परियोजना संपत्तियों के टैब बिल्ड में पाया) IS_VIS (मान हमेशा सही किया जा रहा है, तो आप कुछ सदस्यों को दिखाना चाहते हैं, यदि आपका चाहते हैं उन्हें छिपाने के लिए गलत) और फिर सेट

आप तो विशेषता में संदर्भ isVis चर:

[EditorBrowsable(isVis)] 
public string myMethod... 

मैं VB में ऐसा किया है और इस जल्दबाजी ग # करने के लिए परिवर्तित कर दिया गया। अगर कुछ सही काम नहीं करता है, तो मुझे बताएं।

8

मुझे यकीन नहीं है कि यह आपकी स्थिति पर लागू होता है, लेकिन आप नीचे दिए गए फ़ंक्शन को कॉल करके रन-टाइम पर "ब्राउज़ करने योग्य" सजावट समायोजित कर सकते हैं।

/// <summary> 
    /// Set the Browsable property. 
    /// NOTE: Be sure to decorate the property with [Browsable(true)] 
    /// </summary> 
    /// <param name="PropertyName">Name of the variable</param> 
    /// <param name="bIsBrowsable">Browsable Value</param> 
    private void SetBrowsableProperty<T>(string strPropertyName, bool bIsBrowsable) 
    { 
     // Get the Descriptor's Properties 
     PropertyDescriptor theDescriptor = TypeDescriptor.GetProperties(typeof(T))[strPropertyName]; 

     // Get the Descriptor's "Browsable" Attribute 
     BrowsableAttribute theDescriptorBrowsableAttribute = (BrowsableAttribute)theDescriptor.Attributes[typeof(BrowsableAttribute)]; 
     FieldInfo isBrowsable = theDescriptorBrowsableAttribute.GetType().GetField("Browsable", BindingFlags.IgnoreCase | BindingFlags.NonPublic | BindingFlags.Instance); 

     // Set the Descriptor's "Browsable" Attribute 
     isBrowsable.SetValue(theDescriptorBrowsableAttribute, bIsBrowsable); 
    } 

फिर आप भी जोड़ सकते हैं:

/// <summary> 
/// Set the Browsable property. 
/// NOTE: Be sure to decorate the property with [Browsable(true)] 
/// </summary> 
/// <param name="PropertyName">Name of the variable</param> 
/// <param name="bIsBrowsable">Browsable Value</param> 
private void setBrowsableProperty(string strPropertyName, bool bIsBrowsable) 
{ 
    // Get the Descriptor's Properties 
    PropertyDescriptor theDescriptor = TypeDescriptor.GetProperties(this.GetType())[strPropertyName]; 

    // Get the Descriptor's "Browsable" Attribute 
    BrowsableAttribute theDescriptorBrowsableAttribute = (BrowsableAttribute)theDescriptor.Attributes[typeof(BrowsableAttribute)]; 
    FieldInfo isBrowsable = theDescriptorBrowsableAttribute.GetType().GetField("Browsable", BindingFlags.IgnoreCase | BindingFlags.NonPublic | BindingFlags.Instance); 

    // Set the Descriptor's "Browsable" Attribute 
    isBrowsable.SetValue(theDescriptorBrowsableAttribute, bIsBrowsable); 
} 
+0

हाय हटा दिया है। मैं इस तरह कुछ ढूंढ रहा हूँ। जब मैं आपके कोड का उपयोग करता हूं, तो मुझे पहली पंक्ति 'प्रॉपर्टी डिस्क्रिप्टर द डिस्क्रिप्टर = टाइपडिस्क्रिप्टर.गेटप्रॉपर्टीज (यह। गेट टाइप()) [strPropertyName];' 'में पहली बार' nullValue अपवाद मिल रहा है; '।मैं जानना चाहता हूं कि यह फ़ंक्शंस कहां रखना है और यह संपत्ति ग्रिड पर कैसा दिखता है (फ़ंक्शन में कोई संपत्ति ग्रिड ऑब्जेक्ट नहीं देखी गई)। –

+1

आपके समाधान के लिए बहुत बहुत धन्यवाद, मैंने लाइन को 'PropertyDescriptor theDescriptor = TypeDescriptor.GetProperties (vObject.GetType()) [strPropertyName];' में बदल दिया है, जहां vObject ऑब्जेक्ट है जिसे मैं बदल रहा हूं। –

0

ऊपर और अपवाद गणेश टिप्पणी में उल्लेख किया है से बचने के लिए @ neoikon का जवाब है, यहाँ पर एक सुधार के रूप में एक संस्करण जेनरिक का उपयोग करता है प्रकार प्राप्त करने के लिए है एक संस्करण है कि एक उदाहरण लेता है:

/// <summary> 
    /// Set the Browsable property. 
    /// NOTE: Be sure to decorate the property with [Browsable(true)] 
    /// </summary> 
    /// <param name="obj">An instance of the object whose property should be modified.</param> 
    /// <param name="PropertyName">Name of the variable</param> 
    /// <param name="bIsBrowsable">Browsable Value</param> 
    private void SetBrowsableProperty<T>(T obj, string strPropertyName, bool bIsBrowsable) 
    { 
     SetBrowsableProperty<T>(strPropertyName, bIsBrowsable); 
    } 

उपयोग:

class Foo 
    { 
     [Browsable(false)] 
     public string Bar { get; set; } 
    } 
    void Example() 
    { 
     SetBrowsableProperty<Foo>("Bar", true); 
     Foo foo = new Foo(); 
     SetBrowsableProperty(foo, "Bar", false); 
    } 
संबंधित मुद्दे