日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

ASP.NET中利用DataGrid的自定义分页功能和存储过程结合实现高效分页

發(fā)布時間:2023/11/27 生活经验 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET中利用DataGrid的自定义分页功能和存储过程结合实现高效分页 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
關鍵字:DataGrid、存儲過程、分頁

出自:
http://blog.csdn.net/yzx110/archive/2004/08/18/78525.aspx

摘要:在最進的一個項目中因為一個管理頁面要管理的數(shù)據(jù)量非常大,所以必須分頁顯示,并且不能用DataGrid的內(nèi)置分頁功能,于是自己實現(xiàn)分頁. 下面介紹一下我在項目中用到的分頁方法.

ASP.Net中的DataGrid有內(nèi)置分頁功能, 但是它的默認的分頁方式效率是很低的,特別是在數(shù)據(jù)量很大的時候,用它內(nèi)置的分頁功能幾乎是不可能的事,因為它會把所有的數(shù)據(jù)從數(shù)據(jù)庫讀出來再進行分頁, 這種只選取了一小部分而丟掉大部分的方法是不可去取的.

在最進的一個項目中因為一個管理頁面要管理的數(shù)據(jù)量非常大,所以必須分頁顯示,并且不能用DataGrid的內(nèi)置分頁功能,于是自己實現(xiàn)分頁. 下面介紹一下我在項目中用到的分頁方法.

當然顯示控件還是用DataGrid, 因為數(shù)據(jù)綁定很方便^_^.

要保證不傳輸冗余的數(shù)據(jù),那么必須在數(shù)據(jù)庫中數(shù)據(jù)讀取時實現(xiàn)分頁, 數(shù)據(jù)庫的分頁操作可以放在存儲過程中. 看了CSDN的一篇Blog中講了一個百萬級數(shù)據(jù)分頁的存儲過程的實現(xiàn)(http://blog.csdn.net/wellknow/posts/55167.aspx,他的這個方法可以根據(jù)不同情況進行適當?shù)膬?yōu)化), 根據(jù)他的方法,這里實現(xiàn)一個簡單的SQL語句來實現(xiàn)這里分頁需要的存儲過程。

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從數(shù)據(jù)庫中取出數(shù)據(jù)的代碼就略過^_^.

}

用上面的存儲過程讀出的數(shù)據(jù)在DataGrid里面分頁, 必須把DataGridAllowPagingAllowCustomPaging設置為true

protected System.Web.UI.WebControls.DataGrid ProductGrid;

ProductGrid.AllowPaging = true;

ProductGrid.AllowCustomPaging = true;

然后在設置要顯示的一頁的大小

ProductGrid.PageSize = 100; // 在顯示的時候依據(jù)實際的數(shù)據(jù)顯示。

設置一頁大小后,如果要讓DataGrid實際分出頁數(shù)來,還必須設置

ProductGrid.VirtualItemCount = GetProductCount() ; // GetProductCount() 的功能是獲取滿足條件的產(chǎn)品數(shù)目, 這里的條件就是productid<200000. 設置這項屬性后,那么這個DataGrid的頁數(shù)就是

VirtualItemCount/PageSize, 也就是PageCount的值. 不能對PageCount直接賦值,因為他是只讀的屬性.

這些屬性設置好后再綁定數(shù)據(jù):

ProductGrid.DataSource = ListProduct(1, ProductGrid.PageSize); // 在Page_Load里面 pageIndex為1,記住判斷IsPostBack,在IsPostBack為false時執(zhí)行這些代碼

ProductGrid.DataBind();

這樣數(shù)據(jù)綁定后就可以看到具有分頁模樣的頁面了.但是還不能真正的分頁.要實現(xiàn)真正的分頁,還必須實現(xiàn)下面的功能.

處理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); // 從數(shù)據(jù)庫中讀取新的數(shù)據(jù)

???? ProductGrid.DataBind();

???? // 設置當前的Page序號值, 如果不設置的話它是不會變得, 這樣會給用戶造成誤解,以為所有頁的數(shù)據(jù)相同。

???? ProductGrid.CurrentPageIndex =e.NewPageIndex;

}

如果你處理了DataGrid的ItemCommand的事件的話,必須在ItemCommand事件處理代碼前面加上這些代碼:

if (e.Item.ItemType == ListItemType.Pager)

{

???? return;

}

因為當PageIndexChanged事件激發(fā),也就是用戶選則了另外一頁時會先激發(fā)ItemCommand事件,如果不這樣處理的話,可能會遇到一些意想不到的情況(如果你確實需要的話也可以上面這段代碼,不過最好實際測試一下)。

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

運行環(huán)境:

WinXP Pro SP1, SQLServer 2000, .Net Framework 1.1

總結

以上是生活随笔為你收集整理的ASP.NET中利用DataGrid的自定义分页功能和存储过程结合实现高效分页的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。