ASP.NET中利用DataGrid實現高效分頁

來源:互聯網
上載者:User
asp.net|datagrid|分頁   ASP.Net中的DataGrid有內建分頁功能, 但是它的預設的分頁方式效率是很低的,特別是在資料量很大的時候,用它內建的分頁功能幾乎是不可能的事,因為它會把所有的資料從資料庫讀出來再進行分頁, 這種只選取了一小部分而丟掉大部分的方法是不可去取的.
  
  在最進的一個項目中因為一個管理頁面要管理的資料量非常大,所以必須分頁顯示,並且不能用DataGrid的內建分頁功能,於是自己實現分頁. 下面介紹一下我在項目中用到的分頁方法.
  
  當然顯示控制項還是用DataGrid的, 因為資料繫結很方便^_^.
  
  要保證不傳輸冗餘的資料,那麼必須在資料庫中資料讀取時實現分頁, 資料庫的分頁操作可以放在預存程序中. 看了CSDN的一篇Blog中講了一個百萬級資料分頁的預存程序的實現(http://blog.csdn.net/wellknow/posts/55167.aspx,他的這個方法可以根據不同情況進行適當的最佳化), 根據他的方法,這裡實現一個簡單的SQL語句來實現這裡分頁需要的預存程序。
  
  create procedure ListProduct
  
  (
  
      @PageIndex int, -- 分頁後需要頁的序號
  
      @PageSize int, -- 一頁的大小
  
      @ConditionSQL – 查詢條件的SQL語句
  
  )
  
   AS … 具體代碼就不寫了(可以參考上面的連結).
  
  具體的SQL語句如下:
  
  SELECT TOP 100 * FROM (select * from product where productid<200000) T WHERE T.productid NOT IN
  
  (SELECT TOP 900 productid FROM (select productid from product where productid<200000) T1 ORDER BY T1.productid asc) ORDER BY productid asc
  
  這條語句的 從總的商品(30萬)中取出productid<200000(共20萬),再按每頁100的大小分頁,然後取出第10頁.
  
  Public DataTable ListProduct(int pageIndex, int pageSize)
  
  {
  
      //ADO.net從資料庫中取出資料的代碼就略過^_^.
  
  }
  
  用上面的預存程序讀出的資料在DataGrid裡面分頁, 必須把DataGrid的AllowPaging和AllowCustomPaging設定為true
  
  protected System.Web.UI.WebControls.DataGrid ProductGrid;
  
  ProductGrid.AllowPaging = true;
  
  ProductGrid.AllowCustomPaging = true;
  
  然後在設定要顯示的一頁的大小
  
  ProductGrid.PageSize = 100; // 在顯示的時候依據實際的資料顯示。
  
  設定一頁大小後,如果要讓DataGrid實際分出頁數來,還必須設定
  
  ProductGrid.VirtualItemCount = GetProductCount() ; // GetProductCount() 的功能是擷取滿足條件的產品數目, 這裡的條件就是productid<200000. 設定這項屬性後,那麼這個DataGrid的頁數就是
  
  VirtualItemCount/PageSize, 也就是PageCount的值. 不能對PageCount直接賦值,因為他是唯讀屬性.
  
  這些屬性設定好後再綁定資料:
  
  ProductGrid.DataSource = ListProduct(1, ProductGrid.PageSize); // 在Page_Load裡面 pageIndex為1,記住判斷IsPostBack,在IsPostBack為false時執行這些代碼
  
  ProductGrid.DataBind();
  
  這樣資料繫結後就可以看到具有分頁模樣的頁面了.但是還不能真正的分頁.要實現真正的分頁,還必須實現下面的功能.
  
  處理DataGrid的PageIndexChanged事件(處理使用者新選中某頁時的事件)
  
  private void ProductGrid_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
  
  {
  
     // 如果在預存程序分頁功能中用1表示第一頁的序號的話那麼這裡必須用e.NewPageIndex+1作為pageIndex(如果選擇了DataGrid上頁號為3的頁,那麼e.NewPageIndex就為2), 否則的話直接用e.NewPageIndex就可以了
  
     ProductGrid.DataSource = ListProduct(e.NewPageIndex+1, ProductGrid.PageSize); // 從資料庫中讀取新的資料
  
     ProductGrid.DataBind();
  
     // 設定當前的Page序號值, 如果不設定的話它是不會變得, 這樣會給使用者造成誤解,以為所有頁的資料相同。
  
     ProductGrid.CurrentPageIndex =e.NewPageIndex;
  
  }
  
  如果你處理了DataGrid的ItemCommand的事件的話,必須在ItemCommand事件處理代碼前面加上這些代碼:
  
  if (e.Item.ItemType == ListItemType.Pager)
  
  {
  
     return;
  
  }
  
  因為當PageIndexChanged事件激發,也就是使用者選則了另外一頁時會先激發ItemCommand事件,如果不這樣處理的話,可能會遇到一些意想不到的情況(如果你確實需要的話也可以上面這段代碼,不過最好實際測試一下)。
  
  整個過程完成後,再次瀏覽頁面,覺得速度真是快多了

相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。