【问题标题】:C# Method makes forms dynamically via stringC# 方法通过字符串动态生成表单
【发布时间】:2021-06-04 02:55:52
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c# .net winforms visual-studio-2010


    【解决方案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();
    
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-14
        • 2021-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-24
        • 2022-11-26
        • 2015-11-04
        相关资源
        最近更新 更多