C# 在C事件处理程序中发送变量?
如何使用新创建的EventHandler发送变量? 我的代码类似于:C# 在C事件处理程序中发送变量?,c#,C#,如何使用新创建的EventHandler发送变量? 我的代码类似于: for (int i = 0; i < 5; i++) { Button buttonX = new Button(); buttonX.Location = new Point(0, 0 + offset); buttonX.Size = new Size(310, 48); buttonX.Click += new EventHandler(buttonClick); } pr
for (int i = 0; i < 5; i++)
{
Button buttonX = new Button();
buttonX.Location = new Point(0, 0 + offset);
buttonX.Size = new Size(310, 48);
buttonX.Click += new EventHandler(buttonClick);
}
private void buttonClick(object sender, EventArgs e)
{
MessageBox.Show();
}
关闭是宏伟的。您可以使用lambda表示法:
buttonX.Click += (sender, e) => buttonClick(sender, e, i);
buttonX.Click += delegate (object sender, EventArgs e) { buttonClick(sender, e, i); };
或匿名委托符号:
buttonX.Click += (sender, e) => buttonClick(sender, e, i);
buttonX.Click += delegate (object sender, EventArgs e) { buttonClick(sender, e, i); };
然而
相反,你应该这样做
for (int i = 0; i < 5; i++)
{
Button buttonX = new Button();
buttonX.Location = new Point(0, 0 + offset);
buttonX.Size = new Size(310, 48);
var i_copy = i;
buttonX.Click += (sender, e) => buttonClick(sender, e, i_copy);
}
关闭是宏伟的。您可以使用lambda表示法:
buttonX.Click += (sender, e) => buttonClick(sender, e, i);
buttonX.Click += delegate (object sender, EventArgs e) { buttonClick(sender, e, i); };
或匿名委托符号:
buttonX.Click += (sender, e) => buttonClick(sender, e, i);
buttonX.Click += delegate (object sender, EventArgs e) { buttonClick(sender, e, i); };
然而
相反,你应该这样做
for (int i = 0; i < 5; i++)
{
Button buttonX = new Button();
buttonX.Location = new Point(0, 0 + offset);
buttonX.Size = new Size(310, 48);
var i_copy = i;
buttonX.Click += (sender, e) => buttonClick(sender, e, i_copy);
}
不能这样做,但可以使用中间lambda:
for (int i = 0; i < 5; i++)
{
int j = i; // Need to do this to fix closure issue
Button buttonX = new Button();
buttonX.Location = new Point(0, 0 + offset);
buttonX.Size = new Size(310, 48);
buttonX.Click += (sender, e) => {
buttonClick(sender, e, j);
};
}
private void buttonClick(object sender, EventArgs e, int i)
{
MessageBox.Show(i.toString());
}
不能这样做,但可以使用中间lambda:
for (int i = 0; i < 5; i++)
{
int j = i; // Need to do this to fix closure issue
Button buttonX = new Button();
buttonX.Location = new Point(0, 0 + offset);
buttonX.Size = new Size(310, 48);
buttonX.Click += (sender, e) => {
buttonClick(sender, e, j);
};
}
private void buttonClick(object sender, EventArgs e, int i)
{
MessageBox.Show(i.toString());
}
根据您的场景,只需利用Tag属性;不要将解决方案与单击事件混合;你不需要每次参加活动都通过i;只需将其标记到控件,因为它总是相同的;这样你就不必担心结束 将代码更改为:
for (int i = 0; i < 5; i++)
{
Button buttonX = new Button();
buttonX.Location = new Point(0, 0 + offset);
buttonX.Size = new Size(310, 48);
buttonX.Click += new EventHandler(buttonClick);
buttonX.Tag = i;
}
private void buttonClick(object sender, EventArgs e)
{
MessageBox.Show(((Button)sender).Tag.ToString());
}
根据您的场景,只需利用Tag属性;不要将解决方案与单击事件混合;你不需要每次参加活动都通过i;只需将其标记到控件,因为它总是相同的;这样你就不必担心结束 将代码更改为:
for (int i = 0; i < 5; i++)
{
Button buttonX = new Button();
buttonX.Location = new Point(0, 0 + offset);
buttonX.Size = new Size(310, 48);
buttonX.Click += new EventHandler(buttonClick);
buttonX.Tag = i;
}
private void buttonClick(object sender, EventArgs e)
{
MessageBox.Show(((Button)sender).Tag.ToString());
}
您将创建一个从EventArgs派生的类,该类携带所需的其他数据点 因此,不只是使用EventArgs,而是为您正在进行的事件创建一个EventArgs
public class ButtonClickedEventArgs : EventArgs
{
public int EventInteger { get; private set; }
public ButtonClickedEventArgs(int i)
{
EventInteger = i;
}
}
然后,当引发事件时,您将创建ButtonClickedEventArgs类,并将其与EventHandler一起传递。您将创建一个从EventArgs派生的类,该类包含所需的其他数据点 因此,不只是使用EventArgs,而是为您正在进行的事件创建一个EventArgs
public class ButtonClickedEventArgs : EventArgs
{
public int EventInteger { get; private set; }
public ButtonClickedEventArgs(int i)
{
EventInteger = i;
}
}
然后,当您引发事件时,您将创建ButtonClickedEventArgs类,并将其与EventHandler一起传递。如果您希望它与标准按钮一起工作,您不能这样做。然而,如果你能解释你需要的最终结果,可能还有另一种方法。那么,你想做什么?我是干什么的?如果你想让它和一个标准按钮一起工作,你不能这么做。然而,如果你能解释你需要的最终结果,可能还有另一种方法。那么,你想做什么?我是干什么的?当你复制循环变量时,实际使用copy:对于闭包问题,你不应该将j传递给你的处理程序而不是i吗?当你复制循环变量时,实际使用copy:对于闭包问题,你不应该把j传给你的接线员而不是我吗?非常感谢你的快速回答,非常有效:D非常感谢你的快速回答,非常有效:D