21

我有一个链接按钮,它有一个常规的点击事件:

protected void lnkSynEvent_Click(object sender, EventArgs e)
{
}

我在运行时绑定了这个事件:

lnkSynEvent.Click += new EventHandler(lnkSynEvent_Click);

现在我需要该函数来接受附加参数:

protected void lnkSynEvent_Click(object sender, EventArgs e, DataTable dataT)
{
}

并在绑定此事件时传递与参数相同的参数:

lnkSynEvent.Click += new EventHandler(lnkSynEvent_Click, //somehow here);

不知道如何实现这一点。请帮忙。

提前致谢。

维沙尔

4

5 回答 5

52

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

lnkSynEvent.Click += 
         new EventHandler((s,e)=>lnkSynEvent_Click(s, e, your_parameter));
于 2013-08-14T14:19:02.857 回答
6

我不知道它是什么时候改变的,但现在更容易了!

lnkSynEvent.Click += (s,e) => lnkSynEvent_Click(s, e, your_parameter);
于 2015-11-29T12:53:15.137 回答
2

通过使用委托:

lnkbtnDel.Click += delegate(object s, EventArgs e1) { 
                 Dynamic_Click(s, e1, lnkbtnDel.ID); 
               };`  
于 2014-09-02T09:47:36.220 回答
2
EventHandler myEvent = (sender, e) => MyMethod(myParameter);//my delegate

myButton.Click += myEvent;//suscribe
myButton.Click -= myEvent;//unsuscribe

private void MyMethod(MyParameterType myParameter)
{
 //Do something
}
于 2018-01-19T09:39:22.083 回答
1

上面的所有答案似乎都很好,但我发现了一个不太明显的陷阱,花了一些时间才弄清楚发生了什么,所以我想分享一下。

假设myList.Count返回 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);
}

闭包关闭变量,而不是值。

关闭被认为有害的循环变量,第一部分

于 2021-10-20T12:17:51.253 回答