- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
动态创建按钮时,我希望有一个新的 MouseEventHandler。我是这样做的,
this.Controls[btnAdd.Name].MouseClick += new MouseEventHandler(generalMethods.generatePopup());
但是,由于我需要将参数传递给事件,所以我让 generatePopup 接受一个表示按钮编号的整数(以便我可以进一步使用)。在过去,我只会使用匿名委托(delegate)来传递额外的参数,但这似乎不起作用,因为我想创建一个新的实例;
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());
有谁知道如何解决这个问题?例如,仍然使用匿名委托(delegate)方法,但仍然创建事件的新实例?
编辑:嗯,我试过了(我相信参数通过得很好)但它似乎不是为每个按钮创建一个新的 mouseventhandler,而是对所有按钮使用相同的按钮,因为我已经设置了一个标签测试它是否获得正确的按钮编号,但弹出窗口中的所有标签都返回最后一个按钮编号而不是正确的按钮编号。有什么想法吗?
编辑 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
创建一个临时变量,并在您的 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);
};
}
关于c# - 创建委托(delegate) MouseEventHandler 的新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10722092/
动态创建按钮时,我希望有一个新的 MouseEventHandler。我是这样做的, this.Controls[btnAdd.Name].MouseClick += new MouseEventHa
我想将一个参数传递给我试图用这段代码实现的事件处理程序: private void openInputImagesToolStripMenuItem_Click(object sender,
在我的程序中,可以使用之前定义的文本绘制 LinkLabel。当 LinkLabel 可见时,我想在双击 LinkLabel 时打开一个新表单 这是我到目前为止的代码: private Graphic
我在尝试将 EventHandler 转换为 MouseEventHandler 时遇到了一些问题。 System::EventHandler^ method = gcnew System::Even
当我使用 resharper 时,他总是说 有什么区别? 任何细节都会很好 谢谢大家。 最佳答案 较短的语法已在 C# 2.0 中引入,它只是较长形式的语法糖。 无论你写什么,结果总是一样的。但是,更
我是一名优秀的程序员,十分优秀!