C# WinForm中如何同时实现动态创建窗体与参数传递?
解决C# WinForm动态创建窗体并传递参数的问题
方案1:利用Form自带的Tag属性(最简单实现)
Form类原生自带的Tag属性支持存储任意类型对象,适合快速传递少量参数,无需修改窗体类。
操作步骤:
- 定义参数存储类(参数多的时候用,少量参数也可以直接传字符串/对象):
public class FormParams { public string ReturnValue1 { get; set; } public string ReturnValue2 { get; set; } // 可按需添加更多参数字段 }
- 创建窗体时赋值参数:
// 动态创建窗体实例 Form aForm = new Form(); // 将参数对象赋值给Tag aForm.Tag = new FormParams { ReturnValue1 = "测试参数1", ReturnValue2 = "测试参数2" }; // 显示窗体 aForm.Show();
- 在窗体内部获取参数(比如在
Load事件中):
private void Form_Load(object sender, EventArgs e) { if (Tag is FormParams param) { // 直接使用参数 MessageBox.Show($"收到参数:{param.ReturnValue1}, {param.ReturnValue2}"); } }
方案2:用扩展方法+ConditionalWeakTable实现动态属性
如果担心Tag被其他逻辑占用,可通过ConditionalWeakTable为Form实例绑定独立的参数存储,避免内存泄漏。
实现扩展方法:
using System.Runtime.CompilerServices; public static class FormExtensions { private static readonly ConditionalWeakTable<Form, Dictionary<string, object>> _formParams = new(); // 设置动态参数 public static void SetParam(this Form form, string key, object value) { var paramsDict = _formParams.GetOrCreateValue(form); paramsDict[key] = value; } // 获取动态参数 public static T GetParam<T>(this Form form, string key) { if (_formParams.TryGetValue(form, out var paramsDict) && paramsDict.TryGetValue(key, out var value)) { return (T)value; } return default; } }
使用方式:
// 动态创建窗体并传参 Form aForm = new Form(); aForm.SetParam("ReturnValue1", "动态参数1"); aForm.SetParam("ReturnValue2", "动态参数2"); aForm.Show(); // 在窗体内部读取参数 private void Form_Load(object sender, EventArgs e) { string val1 = this.GetParam<string>("ReturnValue1"); string val2 = this.GetParam<string>("ReturnValue2"); MessageBox.Show($"动态参数:{val1}, {val2}"); }
方案3:反射调用带参构造器(针对自定义窗体类)
如果动态创建的是你自己定义的窗体类(比如通过反射实例化),可以给窗体类添加带参数的构造器,直接在实例化时传参。
自定义窗体类:
public class Frm_Sample : Form { public string ReturnValue1 { get; set; } public string ReturnValue2 { get; set; } // 带参数的构造器 public Frm_Sample(string val1, string val2) { ReturnValue1 = val1; ReturnValue2 = val2; Load += Frm_Sample_Load; } private void Frm_Sample_Load(object sender, EventArgs e) { MessageBox.Show($"构造器传参:{ReturnValue1}, {ReturnValue2}"); } }
反射动态实例化:
// 获取自定义窗体的Type(需替换为你的命名空间+类名) Type formType = Type.GetType("YourNamespace.Frm_Sample"); // 构造器参数数组 object[] constructorArgs = new object[] { "构造参数1", "构造参数2" }; // 实例化窗体并传参 Form aForm = (Form)Activator.CreateInstance(formType, constructorArgs); aForm.Show();
内容的提问来源于stack exchange,提问作者Mohsen Ilkhani
相关产品推荐
相关产品推荐

