2017-08-17 108 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

我只是有另一種困惑。讓我再次轉發我的評論。 –