Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C事件处理程序中发送变量?_C# - Fatal编程技术网

C# 在C事件处理程序中发送变量?

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

如何使用新创建的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);
}

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