C# 方法通过字符串动态生成表单

C# Method makes forms dynamically via string

提问人:Amy 提问时间:3/5/2021 最后编辑:Uwe KeimAmy 更新时间:3/5/2021 访问量:926

问:

第一次在这里发帖,如果我在帖子中犯了任何错误,请告诉我,以便我修复它

因此,我正在尝试创建类来处理大部分代码,我想做的一件事是让类处理表单实例的所有打开和制作。对已经存在的实例进行操作很简单,因为我知道它们的创建顺序,我只能获取该实例,但是当它尚未创建时,我找不到处理它的方法,我阅读了一下,但找不到真正适合我想做的事情, 关于反射的东西似乎是正确的道路,但无法让它发挥作用,所以对此事的一些了解将不胜感激。.Show();Form _form = Application.OpenForms[i];

简而言之,我正在尝试制作类似的东西: (我知道类似的事情是不可能的,但我认为这是准确解释我所寻求的最简单方法。我做的一个解决方法是将每个表单生成到一个开关中并发送它们的编号,所以如果我找不到更好的解决方案,这就是我将使用的,但我想学习一种“正确/更干净”的方法来实现这一目标)

static public bool MakeForm(string name)
{
   name _name = new name();
   _name.Show();
}

[编辑:我意识到这与我的项目无关,因为我可以在登录时准备好每个表格,但我仍然希望知道如何做到这一点,如果你们中的任何人可以告诉我如何/在哪里阅读]

C# .NET Winforms 可视化工作室 2010

评论


答:

1赞 Serdar 3/5/2021 #1

我不确定我是否正确理解了你,但我认为你需要一个工厂类。

    public static class Factory
    {
        public static Form Create(string name)
        {
            switch (name)
            {
                case "FormA":
                    return new FormA();
                case "FormB":
                    return new FormB();
            }
        }
    }

您可以按名称创建表单。

  Factory.Create("FormA").Show();

0赞 Idle_Mind 3/5/2021 #2

下面是一个使用 Reflection 方法的简单示例:

private void button1_Click(object sender, EventArgs e)
{
    Form f2 = TryGetFormByName("Form2");
    if (f2 != null)
    {
        f2.Show();
    }
}

public Form TryGetFormByName(string formName)
{
    var formType = System.Reflection.Assembly.GetExecutingAssembly().GetTypes()
        .Where(T => (T.BaseType == typeof(Form)) && (T.Name == formName))
        .FirstOrDefault();
    return formType == null ? null : (Form)Activator.CreateInstance(formType);
}

下面是一个替代版本,用于检查表单是否已打开:

public Form TryGetFormByName(string formName)
{
    // See if it's already open:
    foreach (Form frm in Application.OpenForms)
    {
        if (frm.Name == formName)
        {
            return frm;
        }
    }

    // It's not, so attempt to create one:
    var formType = System.Reflection.Assembly.GetExecutingAssembly().GetTypes()
        .Where(T => (T.BaseType == typeof(Form)) && (T.Name == formName))
        .FirstOrDefault();
    return formType == null ? null : (Form)Activator.CreateInstance(formType);
}