8

プロパティの 1 つとして別のクラスのリスト/コレクションを持つクラスにプロパティ グリッド コントロールを組み込もうとしています。それらをクラス A と呼びましょう。リストには参照用のクラス B が含まれます。

リスト ボックスが 2 つあるフォームを組み込みたいと考えていました。左側のリスト ボックスには、現在右側のリストにないプログラム内のすべてのクラス B のリストが含まれます。右側のリストには、現在クラス A に関連付けられているすべてのクラス B が含まれます。2 つのリスト間でアイテムを移動するために、間にボタンが必要です。

これは簡単に設計できますが、コレクション エディターとして使用するフォームを設定する方法が正確にはわかりません。

誰かが私を正しい方向に向けることができますか?

また、誰かがこれを達成するための方向性を教えてくれる場合、選択する ID のリストを含むプロパティのドロップダウンを設定するにはどうすればよいですか。

4

2 に答える 2

17

さて、私はついにこれを達成する方法を突き止めることができました.

CollectionEditor.CollectionForm必要に近いカスタムを作成しようとしましたが、それは正しい方向ではありませんでした。

まず、コレクションを編集するための GUI を含む通常の Windows フォームを作成します。次に、DialogResult を返すボタンをフォームに含めるだけです。

今、私が探していたものを達成するための鍵は、CollectionEditor.CollectionForm私が思っていた正しいアプローチではなく、UITypeEditor.

そこで、UITypeEditor を継承したクラスを作成しました。次に、次のように肉付けするだけです。

public class CustomCollectionModalEditor: UITypeEditor
{
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
    {
        if (context ==null || context.Instance == null)                
            return base.GetEditStyle(context);

        return UITypeEditorEditStyle.Modal;
    }

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
    {
        IWindowsFormsEditorService editorService;

        if (context == null || context.Instance == null || provider == null)
            return value;

        editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));

        CForm CollectionEditor = new CForm();

        if (editorService.ShowDialog(CollectionEditor) == System.Windows.Forms.DialogResult.OK)
            return CollectionEditor.Programmed;

        return value;
        //return base.EditValue(context, provider, value);
    }
}

注意すべき重要な部分は、関数GetEditStyleEditValueです。コレクションを編集するために作成したフォームを起動する部分は、EditValueオーバーライド関数にあります。

CFormコレクションを編集するために、このテストで設計したカスタム コレクション エディター フォームです。コレクションを編集するために設計したフォームを表示するには、 にIWindowsFormsEditorService関連付けられているを取得し、のIServiceProviderを呼び出すだけです。次に、フォームから返された値を取得し、必要なカスタム処理を実行できます。.ShowDialog(formVariable)IWindowsFormsEditorServicecatchDialogResult

これを組み込む正しい方法を決定するためにかなりの掘り下げが必要だったので、これが誰かの助けになることを願っています.

于 2011-09-27T13:28:35.087 に答える