Как перечислить элементы PropertyGrid? - PullRequest
8 голосов
/ 02 марта 2011

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

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

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

var selectedProperty = prpGrid.SelectedGridItem;

Можно лисделать это?

Ответы [ 4 ]

5 голосов
/ 03 марта 2011

Вот фрагмент кода, который будет извлекать все объекты 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.

2 голосов
/ 02 июля 2011
2 голосов
/ 02 марта 2011

Если вам нужны только свойства объекта, вы можете получить их через Reflection:

PropertyDescriptorCollection myObjectProperties = TypeDescriptor.GetProperties(myObject);

Если вы скрыли некоторые свойства с помощью BrowsableAttribute(false), вы можете использовать GetProperties(Type, Attribute[]) чтобы отфильтровать их.

Мне неизвестен метод, который возвращает коллекцию GridItem.

Обновление
Конечно, вы также можете получить строку, которую PropertyGrid использует для меток с помощью Reflection.
Если вы украсили свойство с помощью DisplayNameAttribute("ABC"), вам следуетиметь доступ к DisplayName через GetCustomAttributes(Type, Boolean).В противном случае просто используйте имя PropertyDescriptor.

0 голосов
/ 03 августа 2018

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

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

...