你可以在 C# 中使用泛型表单吗?
Posted
技术标签:
【中文标题】你可以在 C# 中使用泛型表单吗?【英文标题】:Can you use generic forms in 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 窗体设计器假定资源将存储在简单类型的名称下。
【问题讨论】:
【参考方案1】:是的,你可以!这是我不久前用这个技巧写的一篇博文:
Designing Generic Forms
编辑:看起来你已经这样做了。这种方法效果很好,所以我不会认为它太 hacky。
【讨论】:
如果你有 3 个表格呢?我想要Form3:Form2。这包括 Form2 中的泛型类型参数 + 控件。有什么想法吗?【参考方案2】:我有一个办法可以解决这个问题,但效果并不理想:
向项目中添加一个新类,该类以其简单的名称继承表单。
internal class MyGenericForm:
MyGenericForm<object>
这意味着尽管设计者仍然错误,但仍然可以找到预期的简单类型(即没有<>
)。
【讨论】:
【参考方案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如果旧石器时代的代码不让你害怕
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);
【讨论】:
以上是关于你可以在 C# 中使用泛型表单吗?的主要内容,如果未能解决你的问题,请参考以下文章
我可以从 c# 表单运行 windows 命令吗? [复制]
如果应用程序使用任务管理器关闭,c# 表单关闭事件会起作用吗?