如何设置属性网格的列宽?

Ali*_*adi 11 .net c# propertygrid winforms

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

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

Nic*_*Nic 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 });
}
Run Code Online (Sandbox Code Playgroud)

  • 这确实有效,但是当PropertyGrid已经可见而不仅仅是加载时需要调用它.我已将此代码绑定到Resize事件,该事件在按钮单击显示控件后发生. (2认同)
  • 您可以使用新的C#6空传播语法将其大大缩短:http://pastebin.com/3TEHBPYs (2认同)

Jam*_*oux 8

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 });
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

在 Form_Load() 事件中,直接在属性网格上调用它,如下所示:

myPropertyGrid.SetLabelColumnWidth(值);

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


ham*_*med 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();
}
Run Code Online (Sandbox Code Playgroud)

并用你想要的大小来命名它。像这样:

SetLabelColumnWidth(propertyGrid1, 100);
Run Code Online (Sandbox Code Playgroud)