在循环内绑定事件处理程序

时间:2018-11-16 14:55:44

标签: c# winforms events

我正在尝试将事件绑定到在for循环中创建的动态创建的菜单项的click事件。当我单击菜单项时,代码将执行,但循环中的最后一个值为“ x”。这是代码:

        for(int x = 1; x < 3; x++)
        {
            MenuItem mi = new MenuItem("Get");
            ContextMenu cm = new ContextMenu();
            mi.Click += (s, e) => { GetClick(x); };
            cm.MenuItems.Add(mi);
            Button btn = this.Controls.Find("btnGet" + x.ToString(), true).FirstOrDefault() as Button;
            btn.ContextMenu = cm;

        }

    private void GetClick(int intGetItem)
    {
        //Previous code...

        GetItem(intGetItem);
    }

问题是当我调试GetClick方法时,无论我使用哪个按钮,intGetItem始终等于3。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:2)

您需要将x分配给局部变量,并在表达式中使用它:

var y = x;
mi.Click += (s, e) => { GetClick(y); };

以下是说明:https://blogs.msdn.microsoft.com/ericlippert/2009/11/12/closing-over-the-loop-variable-considered-harmful/

答案 1 :(得分:0)

注册事件时,无法定义事件的参数。相反,您应该传递菜单项将提供的参数。

mi.Click += GetClick;

并更改您的事件以获取标准的Click参数:

private void GetClick(object sender, EventArgs e)
{
    if (sender == menu1) {...