Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将参数传递给EventHandler中的方法_C#_Asp.net_Button_Event Handling_Arguments - Fatal编程技术网

C# 将参数传递给EventHandler中的方法

C# 将参数传递给EventHandler中的方法,c#,asp.net,button,event-handling,arguments,C#,Asp.net,Button,Event Handling,Arguments,这个问题已经被问了很多次,但由于某种原因,解决方案不起作用 我正在动态创建一个按钮并为其分配一个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

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

我正在动态创建一个按钮并为其分配一个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:索引超出范围。一定是个 非负数且小于集合的大小


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

如果您订阅
按钮。单击
事件,您没有太多选择,因为您的订阅必须遵循相对的委托模式。换句话说,您不能将自定义参数添加到偶数处理程序中,因为处理程序的签名必须与您侦听的事件上定义的委托类型完全匹配

因此,要传递参数:

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

将Eventhandler添加到自定义方法的声明是正确的。错误的来源是其他的。当您遇到此异常时,请查看调用堆栈,并查看错误的实际来源

是否在该EventHandler行或其他位置引发了
ArgumentOutOfRangeException
错误?可能有对ArgumentOutOfRangeException代码的引用。您应该在这里显示它。@keyboardP Yes正好在EventHandler行上。对于ASP来说,这个问题有点…特别。您需要在每个回发上重新创建控件,并重新连接事件处理程序。在这样做时,您关闭的对象不会在回发之间得到维护。理想情况下,您不需要动态添加按钮;这几乎可以肯定是可能的,也很可能是可取的。谢谢,问题完全是别的,我觉得自己太愚蠢了。我正在尝试保存状态,但找不到合适的变量来存储它。有人说,变量的类型应该是Action,而有人说它应该是Func。ShapeNodeEventArgs shapeNodeArgs=新的ShapeNodeEventArgs(shapeHit.tagas DeviceMap);mnuShapeLogicalGrid。单击+=(s,ev)=>{displayDeviceLogicalData(发送方,shapeNodeArgs);};frmDisplay.ContextMenuStrip=ctxtGridStrip;这已经讨论过了,但是我还不能理解变量类型。欢迎大家发表意见。