public delegate void EventHandler(object sender, EventArgs e);
在上面的代码中,EventHandler是一个接受object sender, EventArgs e
的委托。但是,参数的数量在以下实现中不匹配:
this.baptismApplication_add_button.Click += new System.EventHandler(this.baptismApplication_add_button_Click);
我可以看到sender
是this.baptismApplication_add_button_Click
,但方法调用的哪个部分有EventArgs e
?这是隐含的吗?或者我是不是错了?
答案 0 :(得分:2)
delegate
是特殊类型。它们代表方法。这样:
public delegate void EventHandler(object sender, EventArgs e);
不意味着要创建EventHandler
,您需要传递两个参数sender
和e
。它只是意味着
EventHandler
表示签名为(object sender, EventArgs e)
的方法,返回void
。
要创建EventHandler
,您需要传入具有所需签名的方法。例如,这种方法:
private void MyMethod(object sender, EventArgs e) {
}
您可以像这样创建EventHandler
:
new EventHandler(MyMethod);
请注意我没有在方法名称后面写()
。这样做会调用该方法。我们不希望这样。在这里,我们只想引用。
让我们看另一个例子。
public delegate void Action();
要创建Action
,您需要一个没有参数的方法并返回void
。像这样:
private void MyMethod2() {}
// ...
new Action(MyMethod2);
现在您了解了代理的工作方式,我们可以讨论如何正确订阅Click
事件。
正如我所说,EventHandler
的“构造函数”将方法作为参数,因此您不应该在那里传递按钮。你需要一个方法。我们来写一个:
private void ButtonPressed(object sender, EventArgs e) {
Console.WriteLine("Hello World");
}
现在我们可以使用此方法创建委托:
yourButton.Click += new EventHandler(this.ButtonPressed);
这实际上可以缩短为:
yourButton.Click += ButtonPressed;
现在每次按下“Hello World”按钮都会打印出来。
答案 1 :(得分:1)
您对委托签名和委托构造函数的签名感到困惑。
委托签名是void (object, EventArgs)
,但是委托构造函数(通过new System.EventHandler(...)
调用它)期望上面带有签名的单个方法,而不是一对参数。
注意,可以省略显式构造函数调用:
this.baptismApplication_add_button.Click += this.baptismApplication_add_button_Click;
编译器会将其转换为EventHandler
构造函数调用。
答案 2 :(得分:0)
+= new System.EventHandler(this.baptismApplication_add_button_Click);
应该是
+= new System.EventHandler(myhandler);
其中myhandler
是一个处理程序方法,每个代理定义都有适当的匹配参数,如
private void myhandler(object sender, EventArgs e)
{
}