2011-03-02 89 views
8

我有一個PropertyGrid與分配給它的一些對象。如何枚舉PropertyGrid項目?

var prpGrid = new PropertyGrid(); 
prp.SelectedObject = myObject; 

我想所有網格項目,如我可以得到selectedGridItem屬性:

var selectedProperty = prpGrid.SelectedGridItem; 

我能做到這一點?

+0

令人驚訝的是,這似乎是完全不可能的。 – SLaks 2011-03-02 15:03:44

回答

5

下面是一段代碼,將檢索屬性網格的所有的GridItem對象:

public static GridItemCollection GetAllGridEntries(PropertyGrid grid) 
{ 
    if (grid == null) 
     throw new ArgumentNullException("grid"); 

    object view = grid.GetType().GetField("gridView", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(grid); 
    return (GridItemCollection)view.GetType().InvokeMember("GetAllGridEntries", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, view, null); 
} 

當然,因爲這是使用屬性網格的一個未公開的私人領域,不能保證工作,未來:-)

一旦你有了所有的GridItems,你可以使用GridItem.GridItemType屬性來過濾它們。

2

如果你只需要對象的屬性,你可以得到那些通過反思:

PropertyDescriptorCollection myObjectProperties = TypeDescriptor.GetProperties(myObject); 

如果沒有隱藏的一些屬性與BrowsableAttribute(false),您可以使用GetProperties(Type, Attribute[])來過濾那些的。

我不知道返回GridItem集合的方法。

更新
當然,你也可以得到字符串PropertyGrid中用來通過反射的標籤。
如果您確實使用DisplayNameAttribute("ABC")裝飾了酒店,您應該可以通過GetCustomAttributes(Type, Boolean)訪問DisplayName。否則,只需使用PropertyDescriptor的名稱即可。

+0

我需要獲取所有網格項目才能顯示文本...我有很多TypeConverters,並且有些項目是動態顯示/隱藏的...您的建議可以解決此問題,但也許是其他解決方案...謝謝爲答案! – Yuriy 2011-03-02 15:12:37

+0

作爲大多數通用用戶界面元素,PropertyGrid使一些事情變得非常簡單,有些事情是不可能的。但是,如果您只需要訪問該對象的屬性名稱(或顯示名稱),則可以通過Reflection直接從該對象中獲取這些名稱。 (查看更新後的答案) – 2011-03-02 15:47:33

相關問題