如何枚举PropertyGrid项?

时间:2011-03-02 14:49:39

标签: c# .net winforms propertygrid

我为PropertyGrid分配了一些对象。

var prpGrid = new PropertyGrid();
prp.SelectedObject = myObject;

我想得到所有网格项,比如我可以获得selectedGridItem属性:

var selectedProperty = prpGrid.SelectedGridItem;

我可以这样做吗?

4 个答案:

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

当然,此示例可以与仅具有一个类别级别的简单属性网格一起使用。