2009-01-20 21 views
3

我有一個基地UserControl(BaseControl.cs),它有一個確定和取消按鈕。點擊按鈕時,會觸發一個事件。通常,其他UserControl對象從BaseControl繼承。最後,後代UserControl對象被放置在WinForm中,在那裏它們鉤入用於點擊Ok/Cancel按鈕的事件。後代UserControl如何攔截由其基類觸發的事件?

我的問題是這樣的:在後代控件中,我想攔截事件(運行一些驗證)。如何鉤住(或攔截)這些事件?

謝謝。

回答

4

執行事件的標準模式是利用一個虛擬的「OnXxx」的方法,像這樣:

public event EventHandler OkClick; 
protected virtual void OnOkClick(EventArgs e) 
{ 
    if (OkClick != null) OkClick(this, e); 
} 

現在你的基地控制要火了「OkClick」事件的任何時候,它只是簡單地調用:

OnOkClick(EventArgs.Empty); 

這意味着你的基地控制的後代可以覆蓋OnOkClick這樣的:

protected override void OnOkClick(EventArgs e) 
{ 
    // do some stuff before the event is fired 
    base.OnOkClick(e); 
    // do some stuff after the event is fired 
} 

請注意,框架設計指導方針實際上聲明,即使後代類忘記調用基本方法,您也應該以事件被觸發的方式實現「OnXxx」方法。我真的不知道這樣做的好方法,我相信大多數人會忽視這個指導方針。

0

您通常會創建一個protected virtual Validate()方法,該方法在BaseControl的事件處理程序中調用。然後在DescendantControl中,你會使用overrideValidate()方法。

以下是關於Inheritance的一些文檔。