2017-09-16 65 views
0

我非常瞭解開始的程序員,試圖掌握事件處理的細節。而且我正在爲解決問題而頭痛。見下文:即使處理程序方法中的參數看起來很好,但沒有超載與委託EventHandler匹配

public class Knop_ClickEventArgs : System.EventArgs 
{ 
    //Here comes code that still needs to be written. 
} 

static void Knop_Click(object sender, Knop_ClickEventArgs e) 
{ 
    Canvas canvas = new Canvas(); 
    Application.Run(canvas); 
} 

public PromptScherm() 
{ 
    //Deleted some code here that is most likely uninteresting 

    Button Knop = new Button(); 

    // Deleted uninteresting code here as well 

    this.Controls.Add(Knop); 

    Knop.Click += Knop_Click; 

} 

此(縮短)的代碼給出CS0123誤差,描述了我的Knop_Click方法不匹配委託EventHandler

我已經明確指出問題在於Knop_ClickEventArgs,因爲如果我用System.EventArgs代替它,它可以正常工作。但是,由於我在Knop_ClickEventArgs的定義中指定它是System.EventArgs的特定實例,它讓我困惑,爲什麼會導致問題?

+0

'Click'處理程序應該能夠處理每個可能的'EventArgs',但是'Knop_Click'只能處理'Knop_ClickEventArgs'。 – PetSerAl

+0

EventArgs實例不能隱式轉換爲Knop_ClickEventArgs。可能需要繼承按鈕並覆蓋自定義事件參數支持的點擊。請參閱https://stackoverflow.com/questions/4815629/how-do-i-pass-variables-to-a-buttons-event-method以獲取更多信息 – ingvar

+0

您使用的是winforms嗎? –

回答

0

你錯了。你只需要一個適當的事件處理程序附加到Click事件。

static void Knop_Click(object sender, EventArgs e) 
{ 
} 
// ... 
Knop.Click += Knop_Click; 

現在當Button觸發Click事件時會調用這個方法。您不能更改簽名,因爲按鈕是如何觸發此事件的。像這樣的東西。

Click.Invoke(this, EventArgs.Empty); // "this" refers to button it self. 

現在在Knop_Click您會收到Button剛傳給的參數。

static void Knop_Click(object sender, EventArgs e) 
{ 
    var btn = (Button)sender; 
    // do some logic. 
} 

現在如果您更改簽名,您會發生什麼?因爲EventArgs是基類,並且Button傳遞了EventArgs,所以你不能實現它,它不能轉換爲派生類。

您必須說明你的目標是什麼。澄清需要編寫什麼代碼,所以我們可以爲它建議正確的位置

2

當您添加處理器到Click事件控制的,(在這種情況下,Button您致電Knop)的Button將調用處理程序傳遞object sender, System.EventArgs e。這意味着:

  • 是不可能的定義處理程序,接受自己的事件類,而不是System.EventArgs

  • 如果編譯器允許你這樣做,你會在真正的麻煩,因爲Button仍然會將System.EventArgs傳遞給您的處理程序,完全忽略您希望接收其他內容。

您的計劃添加代碼到您的事件類告訴我,也許有什麼你沒有理解的事件和事件傳遞。事件應該攜帶數據,它們不應該包含代碼。

相關問題