Как перечислить элементы PropertyGrid?

у меня есть PropertyGrid с присвоенным ему каким-то объектом.

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

Я хочу получить все элементы сетки, как я могу получить свойство selectedGridItem:

var selectedProperty = prpGrid.SelectedGridItem;

могу я это сделать?

4 ответов


вот фрагмент кода, который будет извлекать все объекты 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"), вы должны иметь доступ к DisplayName через GetCustomAttributes(Type, Boolean). В противном случае просто используйте имя PropertyDescriptor.


также проверьте решение с помощью родительского свойства @ C# выбор первой строки в CategorizedAlphabetical сортированный ProperyGrid


Я знаю, что это старый вопрос, но я только что столкнулся с той же проблемой и решил ее с помощью этого кода (предположим 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                         
            }
        }
    }
}

конечно, этот пример можно использовать с простой сеткой свойств, которая имеет только один уровень категорий.