如何通过窗体对象的名称(字符串)调用窗体对象

本文关键字:对象 窗体 字符串 调用 何通过 | 更新日期: 2023-09-27 18:12:16

通常我们创建一个像;

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数据库的窗体

如何通过窗体对象的名称(字符串)调用窗体对象

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

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

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