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

C#在运行时绑定事件时,将附加参数传递给事件处理程序

您可以为此使用匿名委托:

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
}