13

我在我的应用程序中使用属性网格来显示对象属性的名称和值。

默认情况下,列(名称和属性)的宽度为 50:50。我们可以选择滑动分割器来改变这个宽度。我想知道如何以编程方式调整此宽度,以便可以将其设置为 25:75。

4

7 回答 7

15

我发现 hamed 的解决方案不能可靠地工作。我已经通过以编程方式模拟用户拖动列拆分器来解决它。以下代码使用反射来执行此操作:

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 });
}
于 2013-01-23T08:28:36.383 回答
6

2019答​​案

此页面上的其他答案包含对 C# 版本和用户评论过程的临时改进。

我选择了最好的工作解决方案并创建了一个扩展方法。

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(值);

您不需要在其他任何地方调用它。调用一次即可享受。

于 2019-10-08T01:17:21.687 回答
4

正如在这个答案中提到的:

没有属性可以做到这一点,您必须破解控件。首先添加此代码:

    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);
于 2012-09-16T14:03:18.113 回答
2

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 });
}
于 2015-05-13T04:37:01.393 回答
0

我在开源扩展 PropertyGrid 上取得了成功,您可以在http://www.codeproject.com/Articles/13630/Add-Custom-Properties-to-a-PropertyGrid找到。它有两种你会感兴趣的方法:

AutoSizeProperties - 自动移动拆分器以更好地适应所有显示的属性。MoveSplitterTo - 按照用户在参数中的指示移动拆分器。

您可以计算WidthPropertyGrid 的 25% 并MoveSplitterTo使用它进行设置。

我实际上使用AutoSizeProperties了,因为它会自动移动分离器以贴合标签。请注意,您需要在AutoSizeProperties设置SelectedObject.

于 2012-09-16T15:36:27.823 回答
0

一个可能对某人有用的特殊用例:我正在使用带有 DesignSurface 的 PropertyGrid,并且每次编辑值时标签列的宽度都会变窄。在以下对我有用之前,要保持用户设置的标签列宽度:

public UcPropertyGridHost(...)
        {
            ...
            propGrid.PropertyValueChanged += OnPropertyValueChanged;
        }

private void OnPropertyValueChanged(object p_s, PropertyValueChangedEventArgs p_e)
        {
            var iWidth = GetLastLabelWidth();

            //do other things you want to

            SetLabelColumnWidth(propGrid, (int)iWidth);
        }

private int GetLastLabelWidth()
        {
            var iDefaultLabelColumnWidth = propGrid.Width / 2;

            var oFieldInfo = propGrid.GetType().GetField("gridView", BindingFlags.Instance | BindingFlags.NonPublic);
            if (oFieldInfo == null) return iDefaultLabelColumnWidth;

            if (!(oFieldInfo.GetValue(propGrid) is Control oView)) return iDefaultLabelColumnWidth;

            var oFileInfo = oView.GetType().GetField("labelWidth", BindingFlags.Instance | BindingFlags.NonPublic);
            if (oFileInfo == null) return iDefaultLabelColumnWidth;

            return (int)oFileInfo.GetValue(oView);
        }

和取自这里的代码:

private void SetLabelColumnWidth(PropertyGrid p_oGrid, int p_iWidth)
    {
        if (p_oGrid == null) return;

        var oFieldInfo = p_oGrid.GetType().GetField("gridView", BindingFlags.Instance | BindingFlags.NonPublic);
        if (oFieldInfo == null) return;

        if (!(oFieldInfo.GetValue(p_oGrid) is Control oView)) return;

        var oMethodInfo = oView.GetType().GetMethod("MoveSplitterTo", BindingFlags.Instance | BindingFlags.NonPublic);
        if (oMethodInfo == null) return;

        oMethodInfo.Invoke(oView, new object[] { p_iWidth });
    }
于 2020-05-04T12:16:56.203 回答
-3

您可以使用Smart PropertyGrid.Net代替 propertygrid 并使用以下代码更改比率:

propertyGrid1.LabelColumnWidthRatio = 0.25;
于 2012-09-16T15:16:26.397 回答