public delegate void EventHandler(object sender, EventArgs e);
在上面的代码中,EventHandler 是一个接受对象发送者 EventArgs e
的委托(delegate)。但是,以下实现中的参数数量不匹配:
this.baptismApplication_add_button.Click += new System.EventHandler(this.baptismApplication_add_button_Click);
我可以看到 sender
是 this.baptismApplication_add_button_Click
,但是方法调用的哪一部分有 EventArgs e
?是隐含的吗?还是我的做法完全错了?
最佳答案
delegate
是特殊类型。它们委托(delegate)方法。这:
public delegate void EventHandler(object sender, EventArgs e);
不不意味着要创建EventHandler
,您需要传入两个参数sender
和e
。简单来说就是
EventHandler
represents a method with the signature of(object sender, EventArgs e)
returningvoid
.
要创建EventHandler
,您需要传入具有所需签名的方法。例如这个方法:
private void MyMethod(object sender, EventArgs e) {
}
您可以像这样创建一个EventHandler
:
new EventHandler(MyMethod);
注意我在方法名称后面没有写 ()
。这样做会调用该方法。我们不希望这样。在这里我们只想引用它。
让我们看另一个例子。
public delegate void Action();
要创建操作
,您需要一个没有参数并返回void
的方法。像这样:
private void MyMethod2() {}
// ...
new Action(MyMethod2);
现在您已经了解了委托(delegate)的工作原理,我们可以讨论如何正确订阅 Click
事件。
正如我所说,EventHandler
的“构造函数”采用方法作为参数,因此您不应该在其中传递按钮。你需要一个方法。让我们写一个:
private void ButtonPressed(object sender, EventArgs e) {
Console.WriteLine("Hello World");
}
现在我们可以使用此方法创建委托(delegate):
yourButton.Click += new EventHandler(this.ButtonPressed);
这实际上可以缩短为:
yourButton.Click += ButtonPressed;
现在每次按下按钮时都会打印“Hello World”。
关于C#:事件处理程序委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45730707/