动态创建按钮时,我希望有一个新的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);
};
}