Как установить ширину столбца 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;