Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#方法通过字符串动态生成表单_C#_.net_Winforms_Visual Studio 2010 - Fatal编程技术网

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

C#方法通过字符串动态生成表单,c#,.net,winforms,visual-studio-2010,C#,.net,Winforms,Visual Studio 2010,第一次在这里发布,如果我在发布中犯了任何错误,请告诉我,这样我就可以修复它 所以我尝试创建类来处理大部分代码,我想做的一件事是让一个类来处理表单实例的所有打开和创建。正在执行.Show()对于已经存在的实例来说很简单,因为我知道它们的创建顺序,所以我只需要Form\u Form=Application.OpenForms[I]抓住实例,但当它还没有创建时,我找不到处理它的方法,我读了一点它,但找不到真正适合我想做的事情,关于反射的一些事情似乎是正确的途径,但无法使它工作,因此,对这件事的一些了解

第一次在这里发布,如果我在发布中犯了任何错误,请告诉我,这样我就可以修复它

所以我尝试创建类来处理大部分代码,我想做的一件事是让一个类来处理表单实例的所有打开和创建。正在执行
.Show()对于已经存在的实例来说很简单,因为我知道它们的创建顺序,所以我只需要
Form\u Form=Application.OpenForms[I]抓住实例,但当它还没有创建时,我找不到处理它的方法,我读了一点它,但找不到真正适合我想做的事情,关于反射的一些事情似乎是正确的途径,但无法使它工作,因此,对这件事的一些了解将非常感激

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


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

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

    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();


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

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