2011-03-02 87 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

相关问题