如何正确处理 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()
的计算移动到事件处理程序外部的局部变量(请注意,我按照约定交换了事件处理程序参数 sender
和 e
):
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;
};
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()
的计算移动到事件处理程序外部的局部变量(请注意,我按照约定交换了事件处理程序参数 sender
和 e
):
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;
};