l原創文章,如需轉載,請註明出處。
DataBoundControl
DataBoundControl是一個抽象類別,從BaseDataBound類派生,用來綁定List或者Table狀資料。所有用來顯示或編輯List或Table狀資料的繫結控制項都應該從該類派生,例如ListBox,DropDownList,CheckboxList還有GridView。
DataBoundControl實現的主要功能是從資料來源中擷取資料,無論使用者是通過設定DataSource還是通過DataSourceID進行的資料繫結。擷取到的資料將以IEnumerable的方式提供給衍生類別,這樣衍生類別將不再需要關心如何從資料來源中擷取資料,而只需要關心其本身的商務邏輯即如何展示綁定資料。
1. DataBoundControl介面: 1public abstract class DataBoundControl : BaseDataBoundControl
2{
3 public virtual string DataMember { get; set; }
4 protected DataSourceSelectArguments SelectArguments { get; }
5
6 protected override void PerformSelect();
7 protected virtual void PerformDataBinding( IEnumerable data);
8
9 protected virtual DataSourceView GetData();
10 protected virtual IDataSource GetDataSource();
11}
DataMember
DataMember屬性用來指定綁定資料列表名稱,使用者佈建的資料來源可能會包含多個不同的資料項目列表。比如綁定到控制項的資料來源控制項含有多個DataSourceView,或者綁定到控制項的資料來源是一個DataSet,而這個DataSet含有多個資料表格。
SelectArguments
而SelectArguments屬性則定義了用於向資料來源控制項檢索資料時使用的 DataSourceSelectArgument 對象,注意使資料來源控制項,也就是通過DataSourceID進行的資料繫結。
通過該對象可以指定檢索資料的起始行位置、最大行數,設定排序運算式,同時還可以檢索資料來源的總行數。
下面是DataSourceSelectArgument 對象的介面: 1public sealed class DataSourceSelectArguments
2{
3 public int StartRowIndex { get; set; }
4 public int MaximumRows { get; set; }
5
6 public string SortExpression { get; set; }
7
8 public bool RetrieveTotalRowCount { get; set; }
9 public int TotalRowCount { get; set; }
10}
DataBoundControl的衍生類別可以通過配置SelectArguments來最佳化資料查詢,比如當控制項支援分頁功能的時候,可以只檢索當前頁面所需資料。
PorformSelect, PerformDataBinding
DataBoundControl重載了PerformSelect方法,在這個方法中控制項將會向資料來源檢索資料,並且將檢索到的資料作為參數來調用PerformDataBinding方法。
PerformDataBinding是DataBoundControl類定義的虛方法,衍生類別只需要Override該方法,處理檢索到的資料就可以了。
GetDataSource
從繫結資料源中擷取相關聯的IDataSource對象,使用者必須是通過設定DataSourceID屬性來進行資料繫結的,否則將會返回一個Null 參考。
看一下IDataSource這個介面:1public interface IDataSource
2{
3 event EventHandler DataSourceChanged;
4
5 DataSourceView GetView(string viewName);
6 ICollection GetViewNames();
7}
可以看到得到IDataSource對象之後,就可以獲得當前綁定的DataSoutceView了。另外當DataBoundControl捕獲到IDataSource對象的DataSourceChanged事件後,會主動進行重新綁定。
GetData
從繫結資料源中擷取用於執行資料操作的 DataSourceView對象,通過該對象資料繫結控制項可以對資料來源進行各種操作,比如Select, Insert還有Update。
2. 頁面生命週期
DataBoundControl在頁面生命週期中定義了一些時機來進行資料繫結的處理:
OnPagePreLoad
如果是頁面進行第一次請求的話,則控制項要求進行資料繫結。另外如果是一次PostBack的話,並且控制項仍然沒有進行資料繫結,同時Enable ViewState,控制項也會要求資料繫結。
見下面的代碼: 1protected override void OnPagePreLoad(object sender, EventArgs e)
2{
3 base.OnPagePreLoad(sender, e);
4 if (this.Page != null)
5 {
6 if (!this.Page.IsPostBack)
7 {
8 base.RequiresDataBinding = true;
9 }
10 else if (base.IsViewStateEnabled && (this.ViewState["_!DataBound"] == null))
11 {
12 base.RequiresDataBinding = true;
13 }
14 }
15 this._pagePreLoadFired = true;
16}
這就是為什麼在設計時只設定資料繫結控制項的DataSourceID,在運行時控制項會自動進行資料繫結。
OnLoad
如果說在OnPreLoad階段沒有進行資料繫結的話,在OnLoad階段控制項還會進行檢查,並且嘗試進行資料繫結如果條件合適的話。
3。小結
DataBoundControl實現了資料繫結控制項的準系統,例如從資料來源中擷取資料,以及如何操作資料源。其衍生類別所作的應該是如何展現資料,以及如何利用其提供的介面來操作資料源。
相關樣本大家可以參考MSDN文檔:
http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.databoundcontrol.aspx
下一節將會講述HierarchicalDataBoundControl控制項。