利用DataGrid的自定義分頁功能和存儲過程結合實現高效分頁

              ASP.NET中利用DataGrid的自定義分頁功能和存儲過程結合實現高效分頁 

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事件,如果不這樣處理的話,可能會遇到一些意想不到的情況(如果你確實需要的話也可以上面這段代碼,不過最好實際測試一下)。

整個過程完成後,再次瀏覽頁面,覺得速度真是快多了

發佈了21 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章