C#:EventHandler委托

时间:2017-08-17 08:57:40

标签: c# events delegates event-handling

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);

我可以看到senderthis.baptismApplication_add_button_Click,但方法调用的哪个部分有EventArgs e?这是隐含的吗?或者我是不是错了?

3 个答案:

答案 0 :(得分:2)

delegate是特殊类型。它们代表方法。这样:

public delegate void EventHandler(object sender, EventArgs e);

意味着要创建EventHandler,您需要传递两个参数sendere。它只是意味着

  

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)
{

}