我为PropertyGrid
分配了一些对象。
var prpGrid = new PropertyGrid();
prp.SelectedObject = myObject;
我想得到所有网格项,比如我可以获得selectedGridItem属性:
var selectedProperty = prpGrid.SelectedGridItem;
我可以这样做吗?
答案 0 :(得分: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);
}
当然,由于这是使用Property Grid的未记录的私有字段,因此无法保证将来可以使用: - )
获得所有GridItem后,可以使用GridItem.GridItemType属性过滤它们。
答案 1 :(得分:2)
如果您只需要对象的属性,可以通过Reflection获取这些属性:
PropertyDescriptorCollection myObjectProperties = TypeDescriptor.GetProperties(myObject);
如果您确实使用BrowsableAttribute(false)
隐藏了某些属性,则可以使用GetProperties(Type, Attribute[])
过滤掉这些属性。
我不知道返回GridItem集合的方法。
<强>更新强>
当然,您也可以通过Reflection获取PropertyGrid用于标签的字符串
如果您确实使用DisplayNameAttribute("ABC")
修饰了该属性,则应该可以通过GetCustomAttributes(Type, Boolean)
访问DisplayName。否则只需使用PropertyDescriptor的名称。
答案 2 :(得分:2)
还可以使用父属性@ C# Selecting first row in CategorizedAlphabetical sorted ProperyGrid
查看解决方案答案 3 :(得分:0)
我知道这是一个老问题,但是我刚刚遇到了相同的问题,并使用以下代码解决了这个问题(假设PropertyGrid
变量称为grid
):
public void IteratePropertyGrid()
{
GridItemCollection categories;
if (grid.SelectedGridItem.GridItemType == GridItemType.Category)
{
categories = grid.SelectedGridItem.Parent.GridItems;
}
else
{
categories = grid.SelectedGridItem.Parent.Parent.GridItems;
}
foreach (var category in categories)
{
if (((GridItem)category).GridItemType == GridItemType.Category)
{
foreach (GridItem gi in ((GridItem)category).GridItems)
{
// Do something with gi
}
}
}
}
当然,此示例可以与仅具有一个类别级别的简单属性网格一起使用。