我在我的應用程序中使用屬性網格來顯示對象的屬性的名稱和值。如何設置屬性網格的列寬?
默認情況下,列(名稱和屬性)的寬度比例爲50:50。 ,我們可以選擇滑動分離器來改變這個寬度。 我想知道如何以編程方式調整此寬度,以便可以設置爲25:75。
我在我的應用程序中使用屬性網格來顯示對象的屬性的名稱和值。如何設置屬性網格的列寬?
默認情況下,列(名稱和屬性)的寬度比例爲50:50。 ,我們可以選擇滑動分離器來改變這個寬度。 我想知道如何以編程方式調整此寬度,以便可以設置爲25:75。
正如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);
可以使用Smart PropertyGrid.Net代替PropertyGrid中以及與此代碼更改的比率:
propertyGrid1.LabelColumnWidthRatio = 0.25;
請猜我自由組件! –
我已經與開源擴展PropertyGrid中,你可以找到在http://www.codeproject.com/Articles/13630/Add-Custom-Properties-to-a-PropertyGrid成功。它有兩種方法你會感興趣:
AutoSizeProperties - 自動移動分離器,以更好地適應所有顯示的屬性 。 MoveSplitterTo - 在參數中由用戶按照指示 移動分離器。
您可以計算PropertyGrid的Width
的25%,並設置MoveSplitterTo
。
雖然我實際上使用AutoSizeProperties
,因爲它會自動移動分隔符以貼合標籤。請注意,在設置SelectedObject
之後,您需要設置AutoSizeProperties
。
我發現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 });
}
感謝爲我工作 –
工程,但必須在窗體建立後(在Form_Load事件或更高版本中)調用。 – NightElfik
這不起作用,但它需要在PropertyGrid已經可見時調用,而不僅僅是加載。我已將此代碼綁定到Resize事件,該事件在通過單擊按鈕顯示控件後發生。 – ygoe
版本爲框架4.0(我不得不使用BASETYPE)。方法用於繼承自PropertyGrid的類:
private void SetLabelColumnWidth(int width)
{
FieldInfo fi = this.GetType().<strong>BaseType</strong>.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 });
}
字段名稱「labelWidth」不存在!不過,大小是50:50! –
我在我的項目中使用.Net 4.5,代碼沒有問題。 – hamed
如何更改.Net 4的代碼?在.Net 4中,代碼不能更改列的寬度! –