1

PropertyGridクラスを使用して、アプリケーション内のオブジェクトを編集しています。これらは、関連するクラス(または、その簡略化)です。

public class Inner
{
    public int A { get; set; }
    public string B { get; set; }
}

public class Outer
{
    public List<Inner> InnerData { get; set; }
    public int Id { get; set; }
}

プロパティグリッドのSelectedObjectフィールドとしてOuterタイプのオブジェクトを設定します。この問題は、OuterオブジェクトのInnerDataプロパティがnullに設定されている場合に発生します。InnerDataプロパティは「オプションの」データを表し、指定しないことは空のリストを指定することと同じではないため、Nullはこのプロパティの許容値と見なされます。理想的には、ユーザーが新しいリストのコンポーネントを指定してnullのInnerDataプロパティを実際の値に置き換え、既存のnull以外のInnerData値を変更し、既存のInnerData値をnullに置き換えることができるようにしたいと思います。

誰かがこれを実現する方法を知っていますか?

4

2 に答える 2

1

UITypeEditorの作成を見てください。エディターを使用すると、リストをより細かく制御でき、現在の値がnullかどうかを判断できるようになります。nullの場合は、エディターに空白のグリッドなどを表示させることができます。リストアイテムは追加または削除できます。また、チェックボックスを追加して、エディターにnullを再度返し、プロパティにnullを設定するように指示することもできます。エディターは基本的にWinFormであるため、ほとんどすべての操作を実行できます。

internal class GenericTypeEditor : UITypeEditor
{
    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
    {
        IWindowsFormsEditorService winFormEditorSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));

        using (MyForm editorForm = new MyForm())
        {
            if (winFormEditorSvc.ShowDialog(editorForm) == System.Windows.Forms.DialogResult.OK)
                value = editorForm.ReturnObject;
        }

        return value; //this can be null if you wish
    }

    public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context)
    {
        return UITypeEditorEditStyle.Modal;
    }
}

次に、プロパティに属性を設定します

[EditorAttribute(typeof(GenericTypeEditor), typeof(System.Drawing.Design.UITypeEditor))]
public List<Inner> InnerData { get; set; }

この記事は過去に私を助けました、多分それはあなたに役立つでしょう:http: //msdn.microsoft.com/en-us/library/ms171840 (v=vs.100).aspx

于 2012-10-24T01:27:47.847 に答える
0

プロパティグリッドは新しい内部アイテムをInnerDataオブジェクトに追加しようとしますが、初期化していないため、プロパティグリッドには追加されたアイテムを保存する場所がありません。新しいリストと同じようにInnerDataを初期化するOutterのコンストラクターが必要です。アイテムを入れる必要はありません。ユーザーは実行時にこれを行うことができ、それらを空に戻すこともできますが、InnerDataリストオブジェクトを初期化する必要があります。

プロパティとしてInnerが必要な場合は、System.ComponentModelを用途に追加して、これを試してください。

[TypeConverter(typeof(ExpandableTypeConverter))]
public Inner DefaultInner { get; set; }

これにより、オブジェクトがプロパティグリッドで展開可能になり、ネストされたプロパティを設定できるようになります

PropertyGrid.SelectedGridItemChangedイベントを処理してみてください。

private void propertyGrid1_SelectedGridItemChanged(object sender, SelectedGridItemChangedEventArgs e)
{
    if ((e.NewSelection.Label == "InnerData") && (_outter.InnerData == null)) _outter.InnerData = new List<Inner>();
}

次に、InnerDataアイテムが選択されるたびに、コレクションがnullの場合、そのコレクションは新しいリストに初期化されます。

于 2012-10-23T23:58:17.853 に答える