C# 如何枚举PropertyGrid项?
我有一个C# 如何枚举PropertyGrid项?,c#,.net,winforms,propertygrid,C#,.net,Winforms,Propertygrid,我有一个PropertyGrid,它被分配了一些对象 var prpGrid = new PropertyGrid(); prp.SelectedObject = myObject; 我希望获得所有网格项,就像我可以获得selectedGridItem属性一样: var selectedProperty = prpGrid.SelectedGridItem; 我可以这样做吗?如果您只需要对象的属性,可以通过反射获得这些属性: PropertyDescriptorCollection myOb
PropertyGrid
,它被分配了一些对象
var prpGrid = new PropertyGrid();
prp.SelectedObject = myObject;
我希望获得所有网格项,就像我可以获得selectedGridItem属性一样:
var selectedProperty = prpGrid.SelectedGridItem;
我可以这样做吗?如果您只需要对象的属性,可以通过反射获得这些属性:
PropertyDescriptorCollection myObjectProperties = TypeDescriptor.GetProperties(myObject);
如果确实使用BrowsableAttribute(false)
隐藏了某些属性,则可以使用来过滤掉这些属性
我不知道有哪个方法返回GridItem集合
更新当然,您也可以通过反射获取PropertyGrid用于标签的字符串。
如果您确实使用
DisplayName属性(“ABC”)
装饰了该属性,您应该能够通过访问DisplayName。否则,只需使用PropertyDescriptor的名称。以下是一段代码,用于检索属性网格的所有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属性对其进行筛选。我知道这是一个老问题,但我刚刚遇到了相同的问题,并使用此代码解决了它(假设
PropertyGrid
变量名为grid
):
当然,这个例子可以用于只有一个类别级别的简单属性网格。令人惊讶的是,这似乎是完全不可能的。我需要获取所有网格项以获取显示的文本。。。我有很多类型转换器,有些项目是动态显示/隐藏的。。。你提出的解决这个问题的建议是可以接受的,但也许是另一个解决方案。。。谢谢你的回答!作为大多数通用UI元素,PropertyGrid使一些事情变得非常简单,而有些事情则不可能。但是,如果您只需要访问对象的属性名称(或显示名称),则可以通过反射直接从对象获取这些名称。(见最新答案)
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
}
}
}
}