C#如何给点击事件中定义的控件对象添加绑定方法?
动态生成TextBox控件的Lambda事件绑定实现方法
你提到的=>是C#的Lambda表达式,用于给事件绑定匿名方法的标准语法为:控件实例.事件名 += (sender, eventArgs) => { 你的执行逻辑 }
你现有代码中,在TextBox实例初始化完成后直接追加绑定逻辑即可,以下是完整修改示例:
private void button1_Click(object sender, EventArgs e) { ex_y += 25; n = int.Parse(textBox1.Text); for (int i = 0; i < n; i++) { Button b = new Button(); this.Controls.Add(b); b.Size = new Size(50, 50); b.Location = new Point(ex_x + b.Width + 25, ex_y); ex_x = b.Location.X; b.Text = rand.Next(0, 100).ToString(); a[i] = int.Parse(b.Text); rand.Next(0, 100); TextBox txt = new TextBox(); this.Controls.Add(txt); txt.Size = new Size(b.Size.Width, 50); txt.Location = new Point(b.Location.X, b.Location.Y + 60); txt.BackColor = Color.White; // 新增:绑定TextChanged事件示例,文本内容修改时触发 // 先定义局部变量存储循环索引,避免闭包捕获问题 int currentIndex = i; txt.TextChanged += (s, args) => { // s为触发事件的TextBox实例,强转后即可操作 TextBox currentTxt = s as TextBox; // 示例逻辑:把输入值同步到a数组对应索引位置 if (int.TryParse(currentTxt.Text, out int inputVal)) { a[currentIndex] = inputVal; } }; // 如果需要绑定其他事件,如失去焦点触发,写法一致 txt.LostFocus += (s, args) => { MessageBox.Show($"第{currentIndex+1}个文本框输入内容为:{(s as TextBox).Text}"); }; } }
注意事项
- Lambda参数中的
s对应事件触发的sender,也就是当前绑定的TextBox实例,强转后可以获取/修改控件的所有属性 - 循环内绑定事件如果要用到循环变量
i,必须在循环内部定义局部变量暂存i的值,否则会因为闭包捕获特性,所有事件拿到的都是循环结束后的最终i值,导致逻辑错误
内容的提问来源于stack exchange,提问作者MIRUNA TEODORA TURBATU
相关产品推荐
相关产品推荐

