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)
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(值);
您不需要在其他地方调用它。拨打一次即可享受。
正如这个答案中提到的:
没有属性可以做到这一点,你必须破解控件。首先添加此代码:
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)