アプリケーションでプロパティグリッドを使用して、オブジェクトのプロパティの名前と値を表示しています。
デフォルトでは、列の幅(名前とプロパティ)は50:50の比率です。スプリッターをスライドさせてこの幅を変更するオプションがあります。この幅をプログラムで調整して、たとえば25:75に設定できるようにする方法を知りたいです。
アプリケーションでプロパティグリッドを使用して、オブジェクトのプロパティの名前と値を表示しています。
デフォルトでは、列の幅(名前とプロパティ)は50:50の比率です。スプリッターをスライドさせてこの幅を変更するオプションがあります。この幅をプログラムで調整して、たとえば25:75に設定できるようにする方法を知りたいです。
私は、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 });
}
2019回答
このページの他の回答には、C#バージョンとユーザーコメントの過程でのアドホックな改善が含まれています。
最適なソリューションを選択し、Extensionメソッドを作成しました。
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);
他の場所で呼び出す必要はありません。一度電話してお楽しみください。
この答えのように言及されています:
それを行うためのプロパティはなく、コントロールをハックする必要があります。最初にこのコードを追加します:
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);
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 });
}
http://www.codeproject.com/Articles/13630/Add-Custom-Properties-to-a-PropertyGridにあるオープンソースの拡張PropertyGridで成功しました。それはあなたが興味を持っているであろう2つの方法を持っています:
AutoSizeProperties-表示されているすべてのプロパティに合うように、スプリッターを自動的に移動します。MoveSplitterTo-パラメーターでユーザーが指定したようにスプリッターを移動します。
Width
PropertyGridの25%を計算し、それを設定MoveSplitterTo
することができます。
AutoSizeProperties
スプリッターを自動的に動かしてラベルにぴったりとフィットさせるので、実際に使用します。AutoSizeProperties
を設定した後に設定する必要があることに注意してくださいSelectedObject
。
誰かに役立つかもしれない特別なユースケース:私は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 });
}
propertygridの代わりにSmartPropertyGrid.Netを使用して、次のコードで比率を変更 できます。
propertyGrid1.LabelColumnWidthRatio = 0.25;