Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何枚举PropertyGrid项?_C#_.net_Winforms_Propertygrid - Fatal编程技术网

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                         
            }
        }
    }
}