通常我们会创建一个像
这样的表单MainForm form1 = new MainForm();
form1.show();
但我想把这个形式1称为它的名字,就像这样;
string FormName = "MainForm";
// a method should be here that gives us form1 from FormName
// then;
form1.show();
我该怎么做? 事实上,我的目标是通过字符串名称显示一个表单,该表单来自sql数据库。因为我的项目中有太多的窗体,所以我更喜欢在sql数据库上调用窗体
答案 0 :(得分:1)
选项1:
如果名称与示例中的类型名称相同,则可以使用反射:
private static string namespacePrefix = "MyNamespace.";
public static Form CreateFormByName(string formName)
{
Assembly myAssembly = Assembly.GetExecutingAssembly();
Type formType = myAssembly.GetType(namespacePrefix + formName);
if (formType == null)
throw new ArgumentException("Form type not found");
return (Form)Activator.CreateInstance(formType);
}
选项2:
当类型名称和表单名称不同时,您应该使用字典映射:
private static Dictionary<string, Type> mapping = new Dictionary<string, Type>
{
{ "MainForm", typeof(Form1) },
{ "frmOptions", typeof(OptionsForm) },
// ...
}
public static Form CreateFormByName(string formName)
{
Type formType;
if (!mapping.TryGetValue(formName, out formType))
throw new ArgumentException("Form type not found");
return (Form)Activator.CreateInstance(formType);
}
答案 1 :(得分:0)
这可以通过Type.GetType
和Activator.CreateInstance
方法实现。 Activator
方法将返回表示新创建对象的object
类型。
string FormName = "MainForm";
Type t = Type.GetType(FormName);
Form f = Activator.CreateInstance(t) as Form;
f.show();