5

这个问题已经被问过很多次了,但由于某种原因解决方案不起作用。

我正在动态创建一个 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”赋予不同的含义,“sender”已在“父或当前”范围中用于表示其他内容。

所以我改为以下:

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

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

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

这里有什么问题我真的迷路了。

4

2 回答 2

2

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

于 2013-06-24T20:57:45.840 回答
0

如果你订阅Button.Click事件,你别无选择,因为你的下标必须遵循相对委托模式。换句话说,您不能将我们的自定义参数添加到处理程序中,因为处理程序的签名必须与您侦听的事件上定义的委托类型完全匹配。

所以,传递参数:

  • 或定义一个全局状态变量,并从同一个事件处理程序中读取它
  • 或使用一些自定义事件参数定义一些自定义事件处理程序
于 2013-06-24T20:49:33.523 回答