2013年1月6日 星期日

[ASP.NET]DataTable分頁Function

在ASP.NET Gridview雖然內建就有開啟分頁的功能,
但在實作上,通常不會使用此內建功能
通常我會搭配AspNetPager這種套件使用
此套件在官方網站都有很詳細的說明(簡中)
甚至有sample source可以下載,故在此不再說明
在資料來源時,可以使用以下的Function將DataTable做簡易的分頁處理
(其實這篇是要讓我換新專案時方便複製貼上而已 XD)
///  將DataTable進行分頁 
///  原DataTable
///  選擇第N頁
///  每頁的頁數 
///  新DataTable
public DataTable GetPagedTable(DataTable dt, int PageIndex, int PageSize)
{
   if (PageIndex == 0)
   {
      return dt;
   }
   DataTable NewDt = dt.Copy();
   NewDt.Clear();
   //起始列
   int rowbegin = (PageIndex - 1) * PageSize;
   //結束列
   int rowend = PageIndex * PageSize;
   if (rowbegin >= dt.Rows.Count)
   {
        return NewDt;
   }

   if (rowend > dt.Rows.Count)
   {
       rowend = dt.Rows.Count;
   }
   //產生新的DataTable
   for (int i = rowbegin; i <= rowend - 1; i++)
   {
      DataRow newdr = NewDt.NewRow();
      DataRow dr = dt.Rows[i];
      foreach (DataColumn column in dt.Columns)
      {
          newdr[column.ColumnName] = dr[column.ColumnName];
      }
          NewDt.Rows.Add(newdr);
  }
  return NewDt;
}

使用方式很簡單:
  DataTable Old_dt = GetData();//至DB抓資料,在此省略
  DataTable New_dt = GetPagedTable(Old_dt,NowIndex,PageSize);
  grid_data.Datasource = New_dt;//繫結至GridView
  grid_data.DataBind();

記得將Gridview的EnableViewState屬性設定為false
因我們已經不需要那些肥大的ViewState了 此function在面對資料量不大時,是很方便的做法, 但如果資料量很大,就不建議,
畢竟此方法還是把所有資料抓回來再做分頁處理
可以考慮在DB使用Row_Number()的方式處理

2 則留言:

  1. 謝謝您的分享教學,我受益良多!!

    回覆刪除
    回覆
    1. 您過獎了,大家一起討論學習囉 ^_^

      刪除