如何给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
相关产品推荐
相关产品推荐

