前面幾篇文章講解了與利用ASP.NET 2.0技術創建自定義服務器控件屬性有關的內容。從本文開始,包括隨後的幾篇文章將探討創建自定義服務器控件事件的方法。本文重點對實現控件事件的基本概念進行介紹,這些概念對於幫助開發人員為服務器控件創建事件有著重要意義。
1. 事件基本概念
事件是當有動作發生或者狀態改變時,類發出的信息或者通知。通常情況下,狀態的發生或者改變由用戶界面動作初始化,例如,單擊按鈕,或者由於其他的程序邏輯引起。產生事件的類或者說發送通知的類叫做事件源sender,接收事件的類叫做事件接收者receiver。二者之間通過委托(delegate)實現關聯。下面列舉了一段常見的應用事件代碼。
// 聲明事件
ClickcustomControl.Click += new EventHandler(this.customControl1_Clicked);
// 實現事件處理程序
customControl1_Clicked(object sender,EventArgs e){......}
如上代碼列舉了服務器控件聲明事件和實現事件處理程序的過程。由於這個過程非常簡單,在此將不多做解釋。另外,在實際應用中,開發人員通過為服務器控件實現事件機制,可以不采用以上的聲明事件方式,而是在控件聲明標記中僅僅列出"OnClick = customControl1_Clicked"即可。實際上,事件的聲明和具體事件處理程序的實現都是比較簡單易用的。然而,為控件實現事件機制卻不是一件容易的事情。
從服務器控件開發的角度而言,控件事件(僅指服務器端事件,而不包括客戶端事件)可能來自兩個方面:一是從基類繼承的事件。例如,假設自定義控件從Button類繼承,那麼該控件將繼承基類的Click事件。二是根據開發需求而創建的自定義事件。下面分別對這兩種事件進行介紹。
2. 實現從基類繼承的事件
眾所周知,自定義服務器控件歸根結底是從System.Web.UI.Control派生而來。該基類中已經定義了一些事件。因此,在創建服務器控件過程中,很可能需要重寫以下繼承的多個事件。
·DataBinding事件:該事件當服務器控件綁定到數據源時發生,其對應事件處理程序為OnDataBinding。
·Disposed事件:該事件當從內存釋放服務器控件資源時發生,其對應的事件處理程序為OnDisposed。這是服務器控件生命周期的的最後階段。
·Init事件:該事件當服務器控件初始化時發生,其對應的事件處理程序為OnInit。Init事件是控件生命周期的第一步。
·Load事件:該事件當服務器控件加載到Page對象中時發生,其對應的事件處理程序為OnLoad。
·PreRender事件:該事件在加載Control對象之後、呈現之前發生,其對應的事件處理程序為OnPreRender。
·Unload事件:該事件當服務器控件從內存中卸載時發生,其對應的事件處理程序為OnUnload。
以上內容針對Control基類的幾個事件進行了簡要說明。由於服務器控件均繼承自Control基類(WebControl也是繼承自Control類),因此,開發人員完全可以重寫事件所對應的事件處理程序,這樣便可以實現一些自定義內容。
若要實現自定義繼承的事件,需要重寫從基類繼承的受保護的OnEventName方法,而不必附加委托(EventHandler)。通常情況下,重寫的事件處理程序應該調用基類的OnEventName方法,以確保調用附加到事件的委托(除非不想調用這些委托)。以下代碼片段說明自定義控件重寫繼承的DataBinding事件的處理過程。
protected override void OnDataBinding(EventArgs e)
{
//添加一些自定義邏輯代碼
//調用基類方法
base.OnDataBinding(e);
}
如上代碼所示,在重寫事件處理程序OnDataBinding過程中,首先需要添加一些根據應用需求而實現的自定義邏輯代碼,然後,一定要牢記需調用基類方法。
以上內容對Control基類的事件和派生類重寫對應事件處理程序的過程進行了介紹。需要讀者注意的是,上文並非說明自定義服務器控件僅能夠重寫以上幾個來自Control基類事件的事件處理程序。如果自定義控件繼承自其他原本帶有事件的基類,例如,Button、DataList等(歸根到底,它們也是從Control基類繼承),那麼繼承的事件處理程序仍然可以被重寫,例如,繼承自Button類的控件自然獲得Click事件,並且可以重寫OnClick事件處理程序。