my favorite

2008/04/21

GridView + ObjectDataSource 達到分頁(paging)的效果

剛好專案需要,可以有機會學習使用GridView的paging功能
一般說來,Paging功能會以兩種方式出現
其一,實作在某個Control上面,像是GridView結合PageIndexChanging事件
其二,實作在DataSource這一段,這時候又可以分兩種,一是Store Procedure(SP),二是ObjectDataSource(ODS)
使用過GridView的Paging功能時,還必須要自己去實作PageIndexChanging事件
在該事件中指定GridViewPageEventArgs的NewPageIndex屬性
實作的過程不難
但是在開發的過程中,如果每一個頁面的GridView元件都需要實作時,就變得比較麻煩了
而且由於分頁的機制是在Control上,因此在每一次的資料往返於Client及Server時,都耗費了大量的網路頻寬在傳輸使用者不會看到的資料。這時候,通常解決方法就是將分頁功能寫在DataSource裡,僅回傳使用者在這次頁面中會看到的資料。像是SP,設定分頁頁數,以及每頁資料筆數,以回傳資料來源的特定資料列(區塊)。好處是寫成SP之後,執行效能增加了,透過傳參數的方式也可以動態指定分頁的機制。另一個方式,就是透過ODS。ODS與SP相比,其實差異不大,差別在於分頁的功能SP是寫在頁面中,在頁面呼叫SP以存取資料;而ODS可以寫在DataSource的物件裡,達到程式設計師的夢想 "zero code" 的境地(*註1)。要使用ODS實作Paging的功能必須瞭解以下內容

  1. TypeName : 資料來源的Business Object,提供SelectMethod,以及SelectCountMethod的實作
  2. SelectMethodName : 提供資料來源的實作
  3. SelectCountMethod : 提供資料來源筆數的實作
  4. StartRowIndexParameterName : 起始資料列的參數名稱
  5. MaximumRowsParameterName : 每一頁資料筆數的參數名稱
而實際的程式碼可以參考如下



public class ActivityList {
public ActivityList() {
}

/// <summary>
/// 取得資料來源
/// </summary>
/// <param name="StartRow">起始資料列項目</param>
/// <param name="PageSize">筆數</param>
/// <returns>DataView</returns>
public DataView GetActivity(int StartRow, int PageSize) {
return this.GetData(StartRow, PageSize);
}

/// <summary>
/// 取得資料來源的內部實作
/// </summary>
/// <param name="StartRow">起始資料列項目</param>
/// <param name="PageSize">筆數</param>
/// <returns>DataView</returns>
private DataView GetData(int StartRow, int PageSize) {
/* 取得Activity資料表的資料來源(DataTable) */
DataTable ActivityTable = new ActivityBusinessObject().GetDataTable();
/* 取得沒有資料的ActivityTable */
DataTable PagedActivityTable = ActivityTable.Clone();

int size = StartRow + PageSize;
for (int i = StartRow; i < size && i < ActivityTable.Rows.Count; i++) {
/* 將取得的資料列匯入至PagedActivityTable */
PagedActivityTable.ImportRow(ActivityTable.Rows[i]);
}
return PagedActivityTable.DefaultView;
}

/// <summary>
/// 取得資料來源的總筆數
/// </summary>
/// <returns>資料來源總筆數</returns>
public int GetRowsCount() {
ActivityBusinessObject bo = new ActivityBusinessObject();
return bo.GetDataTable().Rows.Count;
}
}


註1 : 其實 zero code 我一開始也是以為是完全沒有程式碼。結果後來才發現,其實是代表只要透過設定(像是寫web.config)一樣,就可以完成工作。有種被欺騙的感覺 XD

1 comment:

Anonymous said...

請問一下透過元 比方講透過預設.net的元件來連db 秀資料不太能調table 的寬度 還是建議自已寫odbc去連比較好呢

BIO

Taipei, GuTing, Taiwan

huang47 | personal

huang47 | personal