Как установить ширину столбца Property Grid?
Я использую сетку свойств в своем приложении для отображения имени и значения свойств объекта.
По умолчанию ширина столбцов (имя и свойство) составляет 50:50.
и у нас есть возможность сдвинуть сплиттер, чтобы изменить эту ширину.
Я хотел бы знать, как эта ширина может быть скорректирована программно, так что ее можно установить в 25:75.
Ответы
Ответ 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();
}
и назовите его размером, который вы хотите. например:
SetLabelColumnWidth(propertyGrid1, 100);
Ответ 2
Я обнаружил, что решение хамеда не работает надежно. Я решил это путем программного моделирования пользователя, перетаскивающего разделитель столбцов. Следующий код использует отражение для этого:
public static void SetLabelColumnWidth(PropertyGrid grid, int width)
{
if(grid == null)
return;
FieldInfo fi = grid.GetType().GetField("gridView", BindingFlags.Instance | BindingFlags.NonPublic);
if(fi == null)
return;
Control view = fi.GetValue(grid) as Control;
if(view == null)
return;
MethodInfo mi = view.GetType().GetMethod("MoveSplitterTo", BindingFlags.Instance | BindingFlags.NonPublic);
if(mi == null)
return;
mi.Invoke(view, new object[] { width });
}
Ответ 3
Версия для Framework 4.0 (мне пришлось использовать BaseType). Метод используется в классе, унаследованном от PropertyGrid:
private void SetLabelColumnWidth(int width)
{
FieldInfo fi = this.GetType().BaseType.GetField("gridView", BindingFlags.Instance | BindingFlags.NonPublic);
object view = fi.GetValue(this);
MethodInfo mi = view.GetType().GetMethod("MoveSplitterTo", BindingFlags.Instance | BindingFlags.NonPublic);
mi.Invoke(view, new object[] { width });
}
Ответ 4
У меня был успех с расширенным исходным кодом PropertyGrid, который вы можете найти в http://www.codeproject.com/Articles/13630/Add-Custom-Properties-to-a-PropertyGrid. У вас есть два метода, которые вас интересуют:
AutoSizeProperties - автоматически перемещает сплиттер, чтобы он лучше соответствовал всем показанные свойства. MoveSplitterTo - перемещение сплиттера, как указано пользователем в параметре.
Вы можете вычислить 25% от Width
PropertyGrid и установить с ним MoveSplitterTo
.
Я действительно использую AutoSizeProperties
, хотя, поскольку он автоматически перемещает сплиттер, чтобы плотно подгонять метки. Обратите внимание, что вам нужно установить AutoSizeProperties
после установки SelectedObject
.
Ответ 5
2019 Ответ
Другие ответы на этой странице содержат специальные улучшения по сравнению с версиями С# и комментариями пользователей.
Я выбрал лучшее рабочее решение и создал метод расширения.
public static class PropGridExtensions
{
public static void SetLabelColumnWidth(this PropertyGrid grid, int width)
{
FieldInfo fi = grid?.GetType().GetField("gridView", BindingFlags.Instance | BindingFlags.NonPublic);
Control view = fi?.GetValue(grid) as Control;
MethodInfo mi = view?.GetType().GetMethod("MoveSplitterTo", BindingFlags.Instance | BindingFlags.NonPublic);
mi?.Invoke(view, new object[] { width });
}
}
Использование:
В событии Form_Load() вызовите его непосредственно в вашей сетке свойств следующим образом:
myPropertyGrid.SetLabelColumnWidth (значение);
Вам не нужно звонить куда-либо еще. Позвони один раз и наслаждайся.
Ответ 6
вы можете использовать Smart PropertyGrid.Net вместо свойстваgrid и изменить соотношение с этим кодом:
propertyGrid1.LabelColumnWidthRatio = 0.25;