2011-01-14 68 views

回答

7

有沒有簡單的方法。

你可以通過實現ICustomTypeDescriptor來解決這個問題。這裏有一篇關於implementing ICustomTypeDescriptor的好文章。

或者您可以將您自己的ControlDesigner與您的課程關聯,並覆蓋PreFilterProperties方法以添加或刪除在屬性網格中查看的屬性。

Removing certain properties from property grid.

+2

實現ICustomTypeDescriptor的鏈接指向https://msdn.microsoft.com/magazine/msdn-magazine-issues我認爲他們已經刪除了原始頁面 – gg89 2016-12-05 04:59:40

6

您可以通過提供自定義類型模型來實現此目的;在最簡單的級別,你可以爲你的類型提供一個自定義的TypeDescriptor,從ExpandableObjectConverter衍生而來,只需簡單地包含/排除給定的屬性 - 但這隻適用於屬性頁面使用的PropertyGrid。一個更復雜的方法是使用ICustomTypeDescriptor/TypeDescriptionProvider - 這可以然後內部工作,如DataGridView

0

我碰到這在尋找一種方式來聲明某些成員可見或隱藏在智能感知,並能夠一次所有需要在編譯時被隱藏改變它來了。我不知道你是否在尋找,但我找到了我的問題的答案......認爲它不會傷害分享。

我設置條件編譯符號(項目屬性的生成選項卡中找到)IS_VIS(如果你想某些成員顯示,如果你想隱藏他們是假值爲真),然後:

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

你再引用isVis變量屬性:

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

我這樣做在VB中,這被匆匆轉化爲C#。如果有什麼不對,請告訴我。

8

我不確定這是否適用於您的情況,但您可以通過調用以下函數在運行時調整「Browsable」裝飾。

/// <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

嗨。我正在尋找這樣的東西。當我使用你的代碼時,我在第一行'PropertyDescriptor theDescriptor = TypeDescriptor.GetProperties(this.GetType())[strPropertyName];`中得到一個nullValue異常。我想知道在哪裏可以把這個功能和它如何反映在房產網(沒看到在功能的PropertyGrid的對象)。 – 2017-03-15 06:32:33

0

上@ neoikon的回答以上,避免了Ganesh在評論中提到的例外,這裏的改進是使用泛型要獲得類型的一個版本:

/// <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="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); 
    }