【问题标题】:Can you use generic forms in C#?你可以在 C# 中使用泛型表单吗?
【发布时间】:2021-05-17 09:28:04
【问题描述】:

您应该能够创建通用表单:

public partial class MyGenericForm<T> :
    Form where T : class
{
    /* form code */
    public List<T> TypedList { get; set; }
}

是有效的 C#,并且可以编译。但是,如果您有任何图像表明它无法找到资源,则设计器将无法工作,并且表单将引发运行时异常。

我认为这是因为 Windows 窗体设计器假定资源将存储在简单类型的名称下。

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

    是的,你可以!这是我不久前用这个技巧写的一篇博文:

    Designing Generic Forms

    编辑:看起来你已经这样做了。这种方法效果很好,所以我不会认为它太 hacky。

    【讨论】:

    • 如果你有 3 个表格呢?我想要Form3:Form2。这包括 Form2 中的泛型类型参数 + 控件。有什么想法吗?
    【解决方案2】:

    我有一个办法可以解决这个问题,但效果并不理想:

    向项目中添加一个新类,该类以其简单的名称继承表单。

    internal class MyGenericForm:
        MyGenericForm<object> { }
    

    这意味着尽管设计者仍然错误,但仍然可以找到预期的简单类型(即没有&lt;&gt;)。

    【讨论】:

      【解决方案3】:

      您可以分三步完成。

      1) 在 Form1.cs 文件中替换

      public partial class Form1<TEntity, TContext> : Formbase // where....
      

      2) 在 Form1.Designer.cs 中替换

       partial class Form1<TEntity, TContext>
      

      3) 创建新文件:Form1.Generic.cs(用于打开设计)

      partial class Form1
      {
      }    
      

      【讨论】:

      • 1) 这只有 2 个步骤,b) *.Designer.cs 中的任何内容都是由 VS 自动生成的,并且可以随时被覆盖
      • 在运行的时候,并没有什么问题,但是在设计阶段表单就出现了问题。对于这个 System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));编辑行后必须重新添加。
      • 是的,这就是我的观点 - VS 可能随时撤消您的工作,并且每次都依靠手动过程来修复它只是在询问错误。在某些时候,您(或使用您的代码的人)会忘记并且您会遇到运行时错误,因为它找不到资源。
      • 我添加了新文件部分类 Form1{} 它的工作,设计师打开了。
      【解决方案4】:

      如果旧石器时代的代码不让你害怕

          public  static MyForm GetInstance<T>(T arg) where T : MyType
      {
          MyForm myForm = new MyForm();
      
          myForm.InitializeStuffs<T>(arg);
          myForm.StartPosition = myForm.CenterParent;
      
          return myForm;
      }
      

      使用它

      var myFormInstance = MyForm.GetInstance<T>(arg);                                                                      myFormInstance.ShowDialog(this);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-05
        • 2011-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-28
        相关资源
        最近更新 更多