动态创建按钮时,我希望有一个新的 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());
有谁知道如何解决这个问题?例如仍然使用匿名委托方法,但仍然创建事件的新实例?
编辑:嗯,我试过这个(我相信参数通过了)但似乎不是为每个按钮创建一个新的鼠标事件处理程序,而是对所有按钮使用相同的,因为我设置了一个标签来测试它获得正确的按钮编号,但弹出窗口上的所有标签都返回最后一个按钮编号而不是正确的编号。有任何想法吗?
编辑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”。