【问题标题】:C# pass additional parameter to an event handler while binding the event at the run timeC# 在运行时绑定事件时将附加参数传递给事件处理程序
【发布时间】:2013-08-16 13:13:53
【问题描述】:

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

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);

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

提前致谢。

维沙尔

【问题讨论】:

  • DataTable 是从哪里来的?
  • @PaulieWaulie 在我绑定事件的地方。

标签: c# asp.net methods parameters arguments


【解决方案1】:

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

lnkSynEvent.Click += 
         new EventHandler((s,e)=>lnkSynEvent_Click(s, e, your_parameter));

【讨论】:

  • WOW 就像一个魅力,谢谢@alex,我对匿名代表还不太熟悉。
  • 您应该将此答案标记为正确。这可能对其他人有所帮助。
  • 简单你可以这样写 Object.SomeEvent+= (sender,e)=>SomeEventHandler(sender, e, "Data"); /// 并像这样定义你的事件处理程序 void SomeEventHandler(object sender, SomeEventArgs e, string data);
  • Alex,我们怎样才能删除它?只需lnkSynEvent.Click -=new EventHandler( ... ?
  • @alex:正如 T.Todua 所说,您如何退订?
【解决方案2】:

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

lnkSynEvent.Click += (s,e) => lnkSynEvent_Click(s, e, your_parameter);

【讨论】:

【解决方案3】:

通过使用委托:

lnkbtnDel.Click += delegate(object s, EventArgs e1) { 
                 Dynamic_Click(s, e1, lnkbtnDel.ID); 
               };`  

【讨论】:

    【解决方案4】:
    EventHandler myEvent = (sender, e) => MyMethod(myParameter);//my delegate
    
    myButton.Click += myEvent;//suscribe
    myButton.Click -= myEvent;//unsuscribe
    
    private void MyMethod(MyParameterType myParameter)
    {
     //Do something
    }
    

    【讨论】:

      【解决方案5】:

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

      假设 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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-17
        • 2012-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-30
        相关资源
        最近更新 更多