質問

私が財産を持っているとします Foo タイプの SomeType タイプのクラスで SomeClass カスタムエディターで編集されています SomeTypeEditor:

[EditorAttribute(typeof(SomeTypeEditor), ...)]
public SomeType Foo
{
    get
    {
        return BuildFooFromInternalRepresenation();
    }
    set
    {
        UpdateInternalRepresentation(value);
    }
}

SomeTypeEditor.EditValue 関数は次のように見えます:

public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
{
    IWindowsFormsEditorService edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
    if (null == edSvc)
    {
        return null;
    }
    var form = new SomeTypeEditorForm(value as SomeType);
    if (DialogResult.OK == edSvc.ShowDialog(form))
    {
        var someClass = context.Instance as SomeClass;
        someClass.Foo = form.Result;
        return someClass.Foo;
    }
    else
    {
        return value;
    }
}

別のプロパティを追加したいと思います Baz, 、タイプの SomeType, 、 に SomeClass. 。このプロパティを編集したいと思います SomeTypeEditor しかし、ライン

someClass.Foo = form.Result;

EditValue ネクタイ SomeTypeEditor この特定のプロパティに。それは単に重複するだけでは簡単です SomeTypeEditor 編集 Baz 代わりに、可能であればそれを避けたいと思います。とにかく私を作るためにありますか SomeTypeEditor ジェネリック(単語の意味で)を使用して両方を編集するために使用できます FooBaz?

役に立ちましたか?

解決 2

私はちょうど私が許すならば、私はちょうどそれを見つけました EditValue 別のものを返します object よりも value, set 編集が発生したプロパティで呼び出されるので、ただ行うだけです。

if (DialogResult.OK == edSvc.ShowDialog(form))
{
    var someClass = context.Instance as SomeClass;
    return form.Result;
}

作品(SomeTypeEditor 入力値をクローンし、クローンを編集します)。

他のヒント

使用できます provider プロパティグリッドで編集されているプロパティの名前を取得します。これを見るには、編集ルーチンのブレークポイントを設定する EditValue、次にホバリングします provider 財産。それを拡張すると、編集されているFoo/Bazの名前のプロパティが含まれていることがわかります。これが情報を取得するための推奨される方法であるかどうかはわかりませんが、機能しているようです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top