当动态地创建按钮时, 我希望有一个新的鼠标EventHandler。 我这么做了,
this.Controls[btnAdd.Name].MouseClick += new MouseEventHandler(generalMethods.generatePopup());
然而,由于我需要将参数传递到事件上,我让生成Popup接受了一个表示纽扣号的整数(这样我就可以进一步使用 ) 。 在过去,我本来只是用匿名代表来传递额外的参数,但是这似乎不像我想创建一个新例子那样有效;
this.Controls[btnAdd.Name].MouseClick += delegate(object sender, MouseEventArgs e) { new MouseEventHandler( generalMethods.generatePopup(sender, e, i); };
错误似乎出现在新的鼠标EventHandler上。 如果我把它拿出来, 效果会很好, 我可以传递更多数据, 但是因为这不是一个新例子, 它不会给每个按钮自己带来事件, 比如这样;
this.Controls[btnAdd.Name].MouseClick += new MouseEventHandler(generalMethods.generatePopup());
有人知道如何围绕这个问题开展工作吗?例如,仍然使用anon delegation 的方法,但仍然在创造新的事件实例吗?
EDIT:嗯,我尝试过这个(参数通过,罚款,我相信),但似乎它不是为每个按钮创建一个新的鼠标活动处理器,而是对所有按钮都使用同样的按钮,因为我设置了一个标签来测试它是否获得了正确的按钮编号,但是弹出时的所有标签都返回了最后一个按钮编号,而不是正确的。有什么想法吗?
EDIT2:这是我用来生成按钮的代码块:
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);
};
这是我的生成Popup方法, 即鼠标EventHandler:
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);
}
此处显示发生的一切,只是为了清楚起见:
"https://i.sstatic.net/j3nWd.png" alt="错误的示例"/ >
这里我们看到两个弹出用户控件都给标签为“ 2 ”, 而我需要每个都具有正确的值, “ 1” 和“ 2 ” 。