Как сделать урезанную PropertyGrid
Я создаю приложение, в котором я показываю данные в древовидном представлении, и когда пользователь дважды щелкает элемент в древовидном представлении, узел, на который он нажал, заменяется редактируемой версией узла. Способ редактирования различных узлов сильно различается, поэтому использование встроенной возможности изменения текста узла недопустимо. Вместо этого мне нужно использовать сетку свойств и определить атрибуты [Editor].
Единственная проблема заключается в том, что в сетке свойств отображаются два столбца: один с именем свойства, а другой с его значением. Мне нужно только показать столбец значений (часть, которую пользователь может редактировать). Есть ли какой-то способ удалить первый столбец или использовать функциональность сетки свойств в другом, настраиваемом классе, который показывает только один столбец?
1 ответ
Это невозможно без взлома сетки свойств. Вот код, который может изменить ширину столбца метки:
public static void SetLabelColumnWidth(PropertyGrid grid, int width)
{
if (grid == null)
throw new ArgumentNullException("grid");
// get the grid view
Control view = (Control)grid.GetType().GetField("gridView", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(grid);
// set label width
FieldInfo fi = view.GetType().GetField("labelWidth", BindingFlags.Instance | BindingFlags.NonPublic);
fi.SetValue(view, width);
// refresh
view.Invalidate();
}
public static void ResetLabelColumnWidth(PropertyGrid grid)
{
SetLabelColumnWidth(grid, -1);
}
Используйте его так же, как это, чтобы удалить столбец метки:
SetLabelColumnWidth(propertyGrid1, 0);
Функция сброса восстанавливает столбец метки.
Конечно, это взлом, поэтому он может не сработать в будущем. Есть также проблемы:
- Курсор v-сплиттера отображается, когда мышь перемещается в левую сторону сетки, и пользователь может выбрать его и сбросить столбец метки, если щелкнет.
- Некоторые действия сетки могут также восстановить столбец метки (например, используя панель инструментов сетки свойств).
Надеюсь это поможет!