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