簡體   English   中英

以編程方式隱藏 PropertyGrid 中的字段

[英]Programmatically Hide Field in PropertyGrid

使用

<System.ComponentModel.TypeConverter(GetType(System.ComponentModel.ExpandableObjectConverter))> _

在由數字屬性組成的 class (這是另一個類的屬性)的聲明上。

我簡單地加載了這個 class 的實例......

PropertyGrid1.SelectedObject = oColumn

顯然我不想在代碼中手動構建 propertygrid,我知道該怎么做。

但這就是問題所在。 根據屬性的值,某些其他屬性不應該是可見的,就好像我使用了

<System.ComponentModel.Browsable(False)> _

屬性聲明上的屬性。

無論如何以編程方式執行此操作,而無需手動處理屬性網格的所有構建>

其實這完全有可能。 第一種也是最簡單的方法是設置網格的 BrowsableAttributes 屬性:

propGraph.BrowsableAttributes = new AttributeCollection(
    new Attribute[] 
    { 
        new CategoryAttribute("Appearance")
    });

這將過濾掉所有與您提供的屬性類型不匹配的屬性。 不幸的是,這是一個積極的過濾器,而不是一個消極的過濾器,這使得它不太有用恕我直言。

其次,同樣容易,您可以在要在 PropertyGrid 中顯示的 object 周圍創建一個簡單的包裝器,並重新定義要隱藏/等的任何屬性。 作為直通屬性:

public class MyDerivedControl : public TextBox
{
    [Browsable(false)]
    [Category("MyCustomCategory")]
    public new bool Enabled
    {
         get { return base.Enabled }
         set { base.Enabled = value; }
    }
}

將其彈出到屬性網格中,啟用屬性將被隱藏。

第三,您可以自定義 PropertyGrid 本身並進入類型描述符的世界等等,但如果您只想隱藏幾個屬性,那就太過分了。

希望這可以幫助。

如果您希望使用 gridItem.Hide() 那么答案是否定的。 在 MS PropertyGrid 中實現這一點的唯一方法是通過 TypeConverter 或自定義類型描述符(實現 ICustomTypeDescriptor)的 GetProperties 方法動態發布您的屬性。 我會先嘗試使用 TypeConverter(特別是如果您要檢查的屬性值處於同一級別),需要做的編碼更少。

至於 C++,這是在propertyGrid中顯示所選類別的簡單解決方案。

cli::array<Attribute^,1>^ attrs = {gcnew CategoryAttribute("Appearance")};
this->PropertyGrid->BrowsableAttributes = gcnew AttributeCollection(attrs);
this->PropertyGrid->SelectedObject = this->SelectedControl;

這將僅在 propertyGrid 中顯示“外觀”類別並隱藏所有其他類別。 假設您可以自己翻譯 C# 中的代碼。

這個問題類似,但答案更完整。 有些人可能希望交叉引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM