C#在运行时绑定事件时,将附加参数传递给事件处理程序
本文关键字:参数传递 程序 事件处理 运行时 绑定 事件 | 更新日期: 2023-09-27 18:27:36
我有一个链接按钮,它有一个常规的点击事件:
protected void lnkSynEvent_Click(object sender, EventArgs e)
{
}
我在运行时绑定了这个事件:
lnkSynEvent.Click += new EventHandler(lnkSynEvent_Click);
现在我需要函数来接受额外的参数:
protected void lnkSynEvent_Click(object sender, EventArgs e, DataTable dataT)
{
}
并在绑定此事件时传递相同的as参数:
lnkSynEvent.Click += new EventHandler(lnkSynEvent_Click, //somehow here);
不知道如何做到这一点。请帮忙。
提前谢谢。
Vishal
您可以为此使用匿名委托:
lnkSynEvent.Click +=
new EventHandler((s,e)=>lnkSynEvent_Click(s, e, your_parameter));
我不知道它是什么时候改的,但现在更容易了!
lnkSynEvent.Click += (s,e) => lnkSynEvent_Click(s, e, your_parameter);
上面的所有答案似乎都很好,但我发现了一个不太明显的陷阱,花了一些时间才弄清楚发生了什么,所以我想分享一下。
假设CCD_ 1返回16。
在以下情况下,OnValueChangeWithIndex(p1, p2, i)
将始终使用i=16调用。
for (int i = 0; i < myList.Count; i++)
{
myList[i].OnValueChange += (p1, p2) => OnValueChangeWithIndex(p1, p2, i);
}
为了避免这种情况,您需要在循环内部初始化一个新变量,然后将新变量传递给函数。
for (int i = 0; i < myList.Count; i++)
{
int index = i;
myList[i].OnValueChange += (p1, p2) => OnValueChangeWithIndex(p1, p2, index);
}
闭包在变量上闭合,而不是在值上闭合。
关闭被认为有害的循环变量,第一部分
使用委托:
lnkbtnDel.Click += delegate(object s, EventArgs e1) {
Dynamic_Click(s, e1, lnkbtnDel.ID);
};`
EventHandler myEvent = (sender, e) => MyMethod(myParameter);//my delegate
myButton.Click += myEvent;//suscribe
myButton.Click -= myEvent;//unsuscribe
private void MyMethod(MyParameterType myParameter)
{
//Do something
}