2012-09-16 52 views
9

我在我的應用程序中使用屬性網格來顯示對象的屬性的名稱和值。如何設置屬性網格的列寬?

默認情況下,列(名稱和屬性)的寬度比例爲50:50。 ,我們可以選擇滑動分離器來改變這個寬度。 我想知道如何以編程方式調整此寬度,以便可以設置爲25:75。

回答

2

正如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); 
+1

字段名稱「labelWidth」不存在!不過,大小是50:50! –

+1

我在我的項目中使用.Net 4.5,代碼沒有問題。 – hamed

+0

如何更改.Net 4的代碼?在.Net 4中,代碼不能更改列的寬度! –

-3

可以使用Smart PropertyGrid.Net代替PropertyGrid中以及與此代碼更改的比率:

propertyGrid1.LabelColumnWidthRatio = 0.25; 
+1

請猜我自由組件! –

0

我已經與開源擴展PropertyGrid中,你可以找到在http://www.codeproject.com/Articles/13630/Add-Custom-Properties-to-a-PropertyGrid成功。它有兩種方法你會感興趣:

AutoSizeProperties - 自動移動分離器,以更好地適應所有顯示的屬性 。 MoveSplitterTo - 在參數中由用戶按照指示 移動分離器。

您可以計算PropertyGrid的Width的25%,並設置MoveSplitterTo

雖然我實際上使用AutoSizeProperties,因爲它會自動移動分隔符以貼合標籤。請注意,在設置SelectedObject之後,您需要設置AutoSizeProperties

13

我發現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 }); 
} 
+0

感謝爲我工作 –

+0

工程,但必須在窗體建立後(在Form_Load事件或更高版本中)調用。 – NightElfik

+2

這不起作用,但它需要在PropertyGrid已經可見時調用,而不僅僅是加載。我已將此代碼綁定到Resize事件,該事件在通過單擊按鈕顯示控件後發生。 – ygoe

1

版本爲框架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 }); 
} 
相關問題