13

アプリケーションでプロパティグリッドを使用して、オブジェクトのプロパティの名前と値を表示しています。

デフォルトでは、列の幅(名前とプロパティ)は50:50の比率です。スプリッターをスライドさせてこの幅を変更するオプションがあります。この幅をプログラムで調整して、たとえば25:75に設定できるようにする方法を知りたいです。

4

7 に答える 7

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 });
}
于 2013-01-23T08:28:36.383 に答える
6

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);

他の場所で呼び出す必要はありません。一度電話してお楽しみください。

于 2019-10-08T01:17:21.687 に答える
4

この答えのように言及されています

それを行うためのプロパティはなく、コントロールをハックする必要があります。最初にこのコードを追加します:

    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);
于 2012-09-16T14:03:18.113 に答える
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 });
}
于 2015-05-13T04:37:01.393 に答える
0

http://www.codeproject.com/Articles/13630/Add-Custom-Properties-to-a-PropertyGridにあるオープンソースの拡張PropertyGridで成功しました。それはあなたが興味を持っているであろう2つの方法を持っています:

AutoSizeProperties-表示されているすべてのプロパティに合うように、スプリッターを自動的に移動します。MoveSplitterTo-パラメーターでユーザーが指定したようにスプリッターを移動します。

WidthPropertyGridの25%を計算し、それを設定MoveSplitterToすることができます。

AutoSizePropertiesスプリッターを自動的に動かしてラベルにぴったりとフィットさせるので、実際に使用します。AutoSizePropertiesを設定した後に設定する必要があることに注意してくださいSelectedObject

于 2012-09-16T15:36:27.823 に答える
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 });
    }
于 2020-05-04T12:16:56.203 に答える
-3

propertygridの代わりにSmartPropertyGrid.Netを使用して、次のコードで比率を変更 できます。

propertyGrid1.LabelColumnWidthRatio = 0.25;
于 2012-09-16T15:16:26.397 に答える