You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WinForm中如何同时实现动态创建窗体与参数传递?

解决C# WinForm动态创建窗体并传递参数的问题

方案1:利用Form自带的Tag属性(最简单实现)

Form类原生自带的Tag属性支持存储任意类型对象,适合快速传递少量参数,无需修改窗体类。

操作步骤:

  1. 定义参数存储类(参数多的时候用,少量参数也可以直接传字符串/对象):
public class FormParams
{
    public string ReturnValue1 { get; set; }
    public string ReturnValue2 { get; set; }
    // 可按需添加更多参数字段
}
  1. 创建窗体时赋值参数:
// 动态创建窗体实例
Form aForm = new Form();
// 将参数对象赋值给Tag
aForm.Tag = new FormParams
{
    ReturnValue1 = "测试参数1",
    ReturnValue2 = "测试参数2"
};
// 显示窗体
aForm.Show();
  1. 在窗体内部获取参数(比如在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 12:30:43