5

[編集]明確にするために、私はリフレクションを介してフォームのリストを取得する方法を知っています。デザイン時のプロパティグリッドにもっと関心があります。

Form型のパブリックプロパティを持つユーザーコントロールがあります。
ドロップダウンからデザイン時にフォームを選択できるようにしたい。
設定された名前空間からフォームのドロップダウンリストにデータを入力したい:UI.Foo.Forms

これは、Controlのパブリックプロパティがある場合と同じように機能します。設計時に、プロパティは、フォーム上のすべてのコントロールをドロップダウンに自動的に入力し、そこから選択できるようにします。名前空間内のすべてのフォームを入力したいだけです。

どうすればこれを行うことができますか?混乱がないように、十分に明確になっていることを願っています。可能であれば、いくつかのコード例を探しています。他の締め切りがあるときに、これに多くの時間を費やす必要がないようにしています。

よろしくお願いします。

4

2 に答える 2

7

クラスはリフレクション経由で簡単に取得できます。

var formNames = this.GetType().Assembly.GetTypes().Where(x => x.Namespace == "UI.Foo.Forms").Select(x => x.Name);

フォームと同じアセンブリ内のコードからこれを呼び出すと仮定すると、"UI.Foo.Forms" 名前空間にあるすべての型の名前が取得されます。次に、これをドロップダウンに表示し、最終的に、リフレクションを介してユーザーが選択したものをもう一度インスタンス化できます。

Activator.CreateInstance(this.GetType("UI.Form.Forms.FormClassName"));

[編集] 設計時のコードの追加:

コントロールで Form プロパティを次のように作成できます。

[Browsable(true)]
[Editor(typeof(TestDesignProperty), typeof(UITypeEditor))]
[DefaultValue(null)]
public Type FormType { get; set; }

定義する必要があるエディターの種類を参照します。コードはかなり自明であり、微調整を最小限に抑えるだけで、必要なものを正確に生成できるようになる可能性があります。

public class TestDesignProperty : UITypeEditor
{
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
    {
        return UITypeEditorEditStyle.DropDown;
    }

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
    {
        var edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));

        ListBox lb = new ListBox();
        foreach(var type in this.GetType().Assembly.GetTypes())
        {
            lb.Items.Add(type);
        }

        if (value != null)
        {
            lb.SelectedItem = value;
        }

        edSvc.DropDownControl(lb);

        value = (Type)lb.SelectedItem;

        return value;
    }
}
于 2010-05-06T01:30:45.823 に答える
2

項目をクリックして選択してもドロップダウンは閉じないため、次のようにすると便利です。

リストボックスのクリックイベントハンドラーを割り当て、イベントハンドラー関数を追加します

public class TestDesignProperty : UITypeEditor
{

    // ...

    IWindowsFormsEditorService editorService;

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
        {
            // ...
            editorService = edSvc ; // so can be referenced in the click event handler

            ListBox lb = new ListBox();
            lb.Click += new EventHandler(lb_Click);
            // ... 
        }



    void lb_Click(object sender, EventArgs e)
    {
        editorService.CloseDropDown();
    }

}
于 2013-02-05T02:44:46.247 に答える