如何正确处理 c# WinForms 事件

How to handle a c# WinForms event correctly

        for (var i = 0; i < 3; i++)
        {
            for (var j = 0; j < 3; j++)
            {
                numbers[i, j] = new Button();
                numbers[i, j].Location = new Point(row, input.Height + column);
                row += 40;
                numbers[i, j].Size = new Size(30, 30);
                numbers[i, j].Text = k.ToString();
                k++;
                numbers[i, j].Click += (e, sender) =>
                {
                    input.Text += k.ToString();
                };
                Controls.Add(numbers[i, j]);
            }
            row = 0;
            column += 40;
        }

我在启动程序并按任何按钮输出到输入字段时遇到这样的问题 9 我猜事件中有问题,但我不知道如何解决它,例如,当按下 2 按钮时,输入字段输出 2 而不是 9

我会使用控件的标签 属性:

numbers[i, j].Text = k.ToString();
numbers[i, j].Tag = k; // store the value you need within the button itself
k++;
numbers[i, j].Click += (sender, e) =>
{
    input.Text += sender.Tag.ToString();
};

问题是在执行事件处理程序时,变量 k 的值已经是 9。

您可以将 k.ToString() 的计算移动到事件处理程序外部的局部变量(请注意,我按照约定交换了事件处理程序参数 sendere):

var text = k.ToString();
numbers[i, j].Click += (sender, e) =>
{
  input.Text += text;
};

由于您已经将文本“0”到“9”作为按钮文本,因此也可以简单地为:

numbers[i, j].Click += (sender, e) =>
{
  input.Text += ((Button)sender).Text;
};