1. 引言
前幾次任務裡我們開發的星級控件只能顯示一個條目的評分,在現實生活中, 經常會遇到需要向用戶展示一系列數據的評分狀態,例如下圖所示:
本次任務裡,我們將一起開發這樣一個控件。
廣告時間——最近在嘗試寫英文文章,申請了一個英文博客www.dev6.cn,歡 迎大家留下墨寶
2. 分析
通過上圖可以看到,該自定義控件是一系列數據評分等級的列表,很顯然需要 作為一個數據綁定控件來實現才可以靈活的顯示多條數據,並且在該列表上方顯 示了標題和當前的日期,為了允許用戶靈活的定義標題和二級標題(當前日期) ,有必要引入模版的概念,由用戶編輯模版,最終按照模版內容顯示。如此看來 再使用DataBoundControl作為自定義控件的基類就不太適合了,因為我們要在該 控件中包含多個子控件,那麼我們應該選擇哪個類作為基類?
回憶一下第六天的任務中數據綁定控件的類關系圖,其中有一個繼承自 DataBoudControl類的CompositeDataBoundControl類,該類是.NET Framework 2.0中新增的一個類,用作綁定到數據源中的數據服務器控件的基類,該定義定義 如下:
public abstract class CompositeDataBoundControl : DataBoundControl, INamingContainer
可以看到,該在只是在繼承DataBoundControl類的基礎上實現了 INamingContainer,這意味著該類所包含的子控件都會生成唯一的ID屬性。
但是CompositeDataBoundControl是如何實現數據綁定的呢,換句話說,如果 某一個頁面包含了一個復雜數據綁定控件,在某一個服務器端控件引起回發後, 如何確保數據綁定控件能正確的被填充呢?按照設計,ASP.NET中的數據綁定組合 控件只能從數據綁定中獲取數據,並且不會緩存任何綁定的數據,因此,需要提 供一個特殊的方法來處理回發事件。
再次回顧一下DataBoundControl這個類,我們來分析一下數據是如何被顯示出 來的。在DataBoundControl類上重載了BaseDataBoundControl類上定義的 PerformSelect方法,該方法如下所示:
protected override void PerformSelect() { if (this.DataSourceID.Length == 0) { this.OnDataBinding(EventArgs.Empty); } DataSourceView data = this.GetData(); this._arguments = this.CreateDataSourceSelectArguments(); this._ignoreDataSourceViewChanged = true; base.RequiresDataBinding = false; this.MarkAsDataBound(); data.Select(this._arguments, new DataSourceViewSelectCallback(this.OnDataSourceViewSelectCallback)); }