[编辑] 需要明确的是,我知道如何通过反射获取表单列表。我更关心设计时属性网格。
我有一个具有 Form 类型公共属性的用户控件。
我希望能够在设计时从下拉列表中选择一个表单。
我想从一组命名空间填充表单下拉列表:UI.Foo.Forms
如果您拥有 Control 的公共财产,这将起作用。在设计时,该属性将自动填充表单上所有控件的下拉列表,供您选择。我只想用命名空间中的所有表单填充它。
我该怎么做呢?我希望我说得足够清楚,以免造成混乱。如果可能的话,我正在寻找一些代码示例。当我还有其他截止日期要满足时,我会尽量避免在这方面花费太多时间。
提前感谢您的帮助。
您可以通过反射轻松获取类:
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;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)