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

如何给EventHandler传递第三个参数?UserControl生成时的点击传参问题

解决按钮点击事件传递int标识值的问题

我来帮你搞定这个问题!你遇到的核心问题是标准的EventHandler委托不支持额外的int参数,而且你需要把生成按钮时的i值传递到点击事件里,下面给你几种简单可行的解决方案:

方案1:利用Lambda表达式捕获变量(推荐简洁写法)

你可以在绑定点击事件时直接用Lambda表达式,把i的值捕获进去,这样点击时就能直接拿到对应的标识。注意要避免闭包陷阱,所以可以先把i拷贝到一个局部变量里:

private BunifuThinButton2 generatetAributeStandBtn(int i) {
    BunifuThinButton2 button = new BunifuThinButton2();
    button.Name = "attributeBtn_" + i.ToString();
    // 拷贝i到局部变量,避免闭包陷阱
    int buttonId = i;
    // 用Lambda绑定点击事件
    button.Click += (sender, e) => button_Click(sender, e, buttonId);
    button.Size = new Size(114, 39);
    button.Location = new Point(30,150);
    return button;
}

// 这里可以保留你的自定义参数方法
private void button_Click(object sender, System.EventArgs e, int i) {
    Console.WriteLine("点击了第" + i + "个按钮");
    // 这里就可以用i来识别卡片,获取对应数据了
    // actualModal = new confirmStandsModal();
    // this.Controls.Add(actualModal);
}

方案2:利用控件的Tag属性存储标识值

每个WinForms控件都有Tag属性,可以用来存储任意对象,我们把i存在这里,点击时从sender里取出:

private BunifuThinButton2 generatetAributeStandBtn(int i) {
    BunifuThinButton2 button = new BunifuThinButton2();
    button.Name = "attributeBtn_" + i.ToString();
    // 把i存入Tag属性
    button.Tag = i;
    button.Click += new EventHandler(this.button_Click);
    button.Size = new Size(114, 39);
    button.Location = new Point(30,150);
    return button;
}

// 恢复标准的EventHandler签名
private void button_Click(object sender, System.EventArgs e) {
    // 从sender中获取按钮,再取出Tag里的i值
    BunifuThinButton2 clickedBtn = sender as BunifuThinButton2;
    if (clickedBtn != null) {
        int i = (int)clickedBtn.Tag;
        Console.WriteLine("点击了第" + i + "个按钮");
        // 后续用i处理对应卡片数据
        // actualModal = new confirmStandsModal();
        // this.Controls.Add(actualModal);
    }
}

为什么你的原代码会报错?

因为.NET里的EventHandler委托定义是固定的:public delegate void EventHandler(object sender, EventArgs e);,它只接受两个参数,所以你自定义的button_Click(object sender, System.EventArgs e, int i)方法无法直接绑定到Click事件上,这就是编译错误的根源。

上面两种方案都能完美解决你的问题,根据自己的习惯选一种就行~

内容的提问来源于stack exchange,提问作者Faycal Said

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:42:38