2017-08-17 75 views
1
public delegate void EventHandler(object sender, EventArgs e); 

在上面的代码中,EventHandler是一个接受object sender, EventArgs e的代理。然而,参数的数量不匹配,在下面的实现:C#:EventHandler代理

this.baptismApplication_add_button.Click += new System.EventHandler(this.baptismApplication_add_button_Click); 

我可以看到senderthis.baptismApplication_add_button_Click,但该方法调用的哪个部分有EventArgs e?它是隐含的吗?或者,我是否全力以赴?

回答

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的“构造函数”采用一种方法作为参数,所以你不应该在那里传递你的按钮。你需要一种方法。让我们写一个:

yourButton.Click += new EventHandler(this.ButtonPressed); 

这实际上可以简化为::

yourButton.Click += ButtonPressed; 

现在每次你按下按钮“

private void ButtonPressed(object sender, EventArgs e) { 
    Console.WriteLine("Hello World"); 
} 

现在,我们可以用这个方法来创建委托Hello World“将被打印。

+0

发送者和EventArgs作为参数传入哪个部分?我似乎无法在我的代码中找到它 –

+0

@DonovanKeating哈哈,好问题。 'ButtonPress'的实际调用不是由你完成的。它由按钮的代码完成。你只需要给按钮打电话的方法。这就是为什么它被称为“代表”。你只需要给它一个具有正确签名的方法。 – Sweeper

+0

所以我真的不能看到它因为它是“隐藏”?如果我创建自己的EventHandler,那么我必须指定sender和EventArgs吗? :) –

0
+= new System.EventHandler(this.baptismApplication_add_button_Click); 

应该

+= new System.EventHandler(myhandler); 

其中myhandler是每个委托定义适当的匹配参数的处理方法一样

private void myhandler(object sender, EventArgs e) 
{ 

} 
+0

谢谢我现在明白了:)。但是发件人和EventArgs作为参数传入哪个部分?我似乎无法在我的代码中找到它。 –

1

你混淆委托代表签名和签名构造函数

委托签名是void (object, EventArgs),但委派构造(你经由new System.EventHandler(...)称它为)期望单个方法与上面签名,而不是对参数。

注意,显式构造函数的调用可以省略:

this.baptismApplication_add_button.Click += this.baptismApplication_add_button_Click; 

编译器将其转换成EventHandler构造函数调用。

+0

谢谢我现在明白了:) –

+0

@DonovanKeating如果你认为一个答案可以回答你的问题,请考虑接受它! – Sweeper

+0

我只是有另一种困惑。让我再次转发我的评论。 –