动态创建按钮时,我希望有一个新的MouseEventHandler。我是这样做的

this.Controls[btnAdd.Name].MouseClick += new MouseEventHandler(generalMethods.generatePopup());


但是,由于我需要将参数传递给事件,因此我使generatePopup接受一个表示按钮号的整数(因此我可以进一步使用)。过去我只是使用匿名委托来传递其他参数,但这似乎不起作用,因为我想创建一个NEW实例。

this.Controls[btnAdd.Name].MouseClick += delegate(object sender, MouseEventArgs e) { new MouseEventHandler( generalMethods.generatePopup(sender, e, i); };


似乎错误是在新的MouseEventHandler上。如果我将其取出,则可以正常工作,并且可以传递其他数据,但是由于它不是新实例,因此不会为每个按钮提供自己的事件,就像这样;

this.Controls[btnAdd.Name].MouseClick += new MouseEventHandler(generalMethods.generatePopup());


有谁知道如何解决这个问题?例如仍然使用匿名委托方法,但仍创建事件的新实例?

编辑:嗯,我试过了(我相信参数可以通过),但似乎不是为每个按钮创建一个新的mouseeventhandler,而是为所有按钮使用了相同的按钮,因为我已经设置了一个标签来测试它获取正确的按钮编号,但是弹出窗口上的所有标签都返回最后一个按钮编号,而不是正确的按钮编号。有任何想法吗?

编辑2:这是我的代码块生成按钮:

 for (int i = 0; i <= count && i < 2; i++)
        {

            Button btnAdd = new Button();
            btnAdd.Text = dataTable.Rows[i]["deviceDescription"].ToString();
            btnAdd.Location = new Point(x, y);
            btnAdd.Tag = i;
            btnAdd.Name = "btn" + i.ToString();
            btnAdd.BackColor = Color.Green;

            this.Controls.Add(btnAdd);

            this.Controls[btnAdd.Name].MouseClick += (sender, e) =>
{
    int index = i;
    generalMethods.generatePopup(sender, e, index);
};


这是我的generatePopup方法,它是mouseEventHandler:

public void generatePopup(object sender, MouseEventArgs e, int buttonNumber)
    {
      //  DBConnector mDBConnector = new DBConnector();
      //  DataTable dataTable = mDBConnector.Select("SELECT * FROM devices WHERE deviceID = " + buttonNumber);


        DeviceBreakdownPopup popupDevice = new DeviceBreakdownPopup();
        popupDevice.lblDeviceNo.Text = buttonNumber.ToString();

        PopupWindow popup = new PopupWindow(popupDevice);
        popup.Show(Cursor.Position);

    }


为了清楚起见,这是正在发生的情况的图像:



在这里,我们看到两个弹出用户控件都被赋予了标签“ 2”,而我需要每个控件都具有正确的值“ 1”和“ 2”。

最佳答案

尝试这个:

this.Controls[btnAdd.Name].MouseClick += new MouseEventHandler(
    (sender, evt) => {
        generalMethods.generatePopup()
    }
);


new MouseEventHandler(...)部分是可选的-编译器从+=分配的左侧找出参数类型。

编辑您的代码的问题是它访问修改后的闭包。您应该从i中创建一个temp变量,并在lambda中使用它来解决问题。

for (int i = 0; i <= count && i < 2; i++)
    {

        Button btnAdd = new Button();
        btnAdd.Text = dataTable.Rows[i]["deviceDescription"].ToString();
        btnAdd.Location = new Point(x, y);
        btnAdd.Tag = i;
        btnAdd.Name = "btn" + i.ToString();
        btnAdd.BackColor = Color.Green;

        this.Controls.Add(btnAdd);
        var temp = i;
        this.Controls[btnAdd.Name].MouseClick += (sender, e) =>
            {
            int index = temp;
            generalMethods.generatePopup(sender, e, index);
        };
}

09-26 17:45