【问题标题】:How to call a Widows Form Object over it's name (string)?如何通过名称(字符串)调用 Windows 窗体对象?
【发布时间】:2015-12-08 02:50:55
【问题描述】:

通常我们创建一个像;

MainForm form1 = new MainForm();
form1.show();

但我想通过它的名字来调用这个 form1;

string FormName = "MainForm";

// a method should be here that gives us form1 from FormName
// then;

form1.show();

我该怎么做? 事实上,我的目标是通过来自 sql 数据库的字符串名称显示一个表单。因为我的项目中有太多的windows窗体,所以我更喜欢通过sql数据库调用窗体

【问题讨论】:

  • 类似form1 = GetForm(FormName)? (显然不是真正的代码)

标签: c# string winforms object methods


【解决方案1】:

这可以通过Type.GetTypeActivator.CreateInstance 方法来实现。 Activator 方法将为您返回一个 object 类型的返回值,它代表您新创建的对象。

string FormName = "MainForm";
Type t = Type.GetType(FormName);
Form f = Activator.CreateInstance(t) as Form;
f.show();

【讨论】:

  • Activator.CreateInstance(assemblyName, typeName)
  • 那么如何将其转换为 Forms.Form 并调用 show() 方法?我试过这个,Type t = Type.GetType(FormName);表单 form1 = (Form)Activator.CreateInstance(t); form1.Show(); // 但它没有工作
【解决方案2】:

选项 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);
}

【讨论】:

  • 然后我尝试了这个 System.Windows.Forms.Form form1 = CreateFormByName("MyFormName"); form1.Show(); // 它工作!非常感谢。
猜你喜欢
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 2022-01-15
相关资源
最近更新 更多