您可以輕鬆地通過反射獲取類:
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-06 01:33:57
更新我的答案以解決設計時要求。 – CMerat 2010-05-06 02:01:37
謝謝梅拉特,我必須再等14個小時才能接受(去土耳其狩獵,所以可能需要幾天:),但工作完美。 – 2010-05-06 11:13:25