我在应用程序中使用属性网格来显示对象属性的名称和值。
默认情况下,列的宽度(名称和属性)的比例为50:50。 我们可以选择滑动分离器来改变这个宽度。 我想知道如何以编程方式调整此宽度,以便可以设置为25:75。
答案 0 :(得分: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 });
}
答案 1 :(得分:3)
正如在this中提到的回答:
没有财产可以做到这一点,你必须破解控制。首先添加此代码:
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 :(得分: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 });
}
答案 3 :(得分:0)
我在http://www.codeproject.com/Articles/13630/Add-Custom-Properties-to-a-PropertyGrid找到的开源扩展PropertyGrid取得了成功。它有两种你感兴趣的方法:
AutoSizeProperties - 自动移动分割器以更好地适应所有分割器 显示的属性。 MoveSplitterTo - 按指示移动拆分器 由用户在参数。
您可以计算PropertyGrid的Width
的25%,并设置MoveSplitterTo
。
我实际上使用AutoSizeProperties
,因为它会自动移动分割器以贴合标签。请注意,您需要在设置AutoSizeProperties
后设置SelectedObject
。
答案 4 :(得分:0)
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(value);
您无需在其他任何地方调用它。致电一次即可享受。
答案 5 :(得分: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 });
}
答案 6 :(得分:-3)
您可以使用Smart PropertyGrid.Net代替propertygrid,并使用以下代码更改比率:
propertyGrid1.LabelColumnWidthRatio = 0.25;