将参数传递给EventHandler中的方法

时间:2013-06-24 20:43:41

标签: c# asp.net button event-handling arguments

这个问题已被多次询问,但解决方案由于某种原因无效。

我正在动态创建一个Button并为其分配一个EventHandler。

protected void Page_Load (object sender, EventArgs e)
{
    Button b = new Button();
    b.Click += new EventHandler(Method);
}

protected void Method (object sender, EventArgs e)
{
   //Do work here
}

我需要传递一个参数,所以我想到的最简单的方法是:

b.Click += new EventHandler(Method(sender, e, "name"));

protected void Method (object sender, EventArgs e, String name)
{
   //Do work here
}
  

错误:预期的方法名称

所以在检查了这里的问题后,几乎每个问题都找到了相同的解决方案。

b.Click += new EventHandler((sender, e) => Method(sender, e, "name"));
  

错误:在此范围内无法声明名为“sender”的局部变量,因为它会给“sender”赋予不同的含义,   已在'父级或当前'范围内用于表示其他内容。

所以我改为:

b.Click += new EventHandler((sender1, e1) => Method(sender1, e1, "name"));

Visual Studio的错误消失了,但是在运行网页时,我收到了这个错误:

  

System.ArgumentOutOfRangeException:索引超出范围。必须是   非负面且小于集合的大小。

这里的问题我真的迷失了。

2 个答案:

答案 0 :(得分:2)

您向自定义方法添加Eventhandler的声明是正确的。错误的来源是别的。当您收到此异常并查看错误的实际来源时,请查看 CallStack

答案 1 :(得分:0)

如果您订阅Button.Click事件,则没有太多选择,因为您的下标必须遵循相对委托模式。换句话说,您无法将自定义参数添加到偶数处理程序,因为处理程序的签名必须与您收听的事件上定义的委托类型完全匹配。

所以,传递参数:

  • 或定义全局状态变量,并从同一事件处理程序
  • 中读取它
  • 或定义一些自定义事件处理程序,带有一些自定义事件参数