我有一个PropertyGrid
与分配给它的一些对象。如何枚举PropertyGrid项目?
var prpGrid = new PropertyGrid();
prp.SelectedObject = myObject;
我想所有网格项目,如我可以得到selectedGridItem属性:
var selectedProperty = prpGrid.SelectedGridItem;
我能做到这一点?
我有一个PropertyGrid
与分配给它的一些对象。如何枚举PropertyGrid项目?
var prpGrid = new PropertyGrid();
prp.SelectedObject = myObject;
我想所有网格项目,如我可以得到selectedGridItem属性:
var selectedProperty = prpGrid.SelectedGridItem;
我能做到这一点?
下面是一段代码,将检索属性网格的所有的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属性来过滤它们。
如果你只需要对象的属性,你可以得到那些通过反思:
PropertyDescriptorCollection myObjectProperties = TypeDescriptor.GetProperties(myObject);
如果没有隐藏的一些属性与BrowsableAttribute(false)
,您可以使用GetProperties(Type, Attribute[])
来过滤那些的。
我不知道返回GridItem集合的方法。
更新
当然,你也可以得到字符串PropertyGrid中用来通过反射的标签。
如果您确实使用DisplayNameAttribute("ABC")
装饰了酒店,您应该可以通过GetCustomAttributes(Type, Boolean)
访问DisplayName。否则,只需使用PropertyDescriptor的名称即可。
我需要获取所有网格项目才能显示文本...我有很多TypeConverters,并且有些项目是动态显示/隐藏的...您的建议可以解决此问题,但也许是其他解决方案...谢谢为答案! – Yuriy 2011-03-02 15:12:37
作为大多数通用用户界面元素,PropertyGrid使一些事情变得非常简单,有些事情是不可能的。但是,如果您只需要访问该对象的属性名称(或显示名称),则可以通过Reflection直接从该对象中获取这些名称。 (查看更新后的答案) – 2011-03-02 15:47:33
还检查出使用Parent属性的解决方案@C# Selecting first row in CategorizedAlphabetical sorted ProperyGrid
使用'GridItem.Parent'是一个非常优雅的解决方案。干得不错! – culix 2014-04-10 02:33:18
令人惊讶的是,这似乎是完全不可能的。 – SLaks 2011-03-02 15:03:44