iT邦幫忙

DAY 1
4

ASP.NET Web技術小技巧分享系列 第 1

[ASP.NET]DataTable分頁Function

在ASP.NET Gridview雖然內建就有開啟分頁的功能,
但在實作上,通常不會使用此內建功能
通常我會搭配AspNetPager這種套件使用
此套件在官方網站都有很詳細的說明(簡中)
甚至有sample source可以下載,故在此不再說明
在資料來源時,可以使用以下的Function將DataTable做簡易的分頁處理

/// <summary> 將DataTable進行分頁 </summary>
/// <param name="dt"> 原DataTable
/// <param name="PageIndex"> 選擇第N頁
/// <param name="PageSize"> 每頁的頁數 
/// <returns> 新DataTable</returns>
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();

下一篇
[ASP.NET]防止使用者重複送出表單的幾種方式
系列文
ASP.NET Web技術小技巧分享27
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
player
iT邦大師 1 級 ‧ 2013-09-16 19:47:43

抱歉
這樣會變慢喔
在抓資料時, 最好能在資料從資料庫取出時
就用SQL處理掉資料分頁
會比較好

如果你的ASP.NET與SQL不在同一台的話
如果遇到大資料的話
你原本的寫法
效能會耗在傳輸一堆沒有要顯示的資料上

我以前用的, 給你參考
GridViewWithPager(SQL預存程序分頁)

1
Kyle Shen
iT邦新手 2 級 ‧ 2013-09-16 21:45:06

謝謝前輩提醒,我後來發現我文章少了一段,剛剛又找不到文章編輯的功能Orz,故補充再下面
再次謝謝您的範例 ^__^

--補充--

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

我要留言

立即登入留言