Asp.Net 数据分页
.Net 所使用的 ADO.Net較前身ADO在性能上有較大的提升,但是操作起來也較為繁瑣,在 Asp 時代,對數據進行分頁使用 RecordSet 的 PageSize 和 AbsolutePage 即可完成對數據的分頁操作,非常簡單,進入 .Net 后,RecordSet 對象沒有了,取而代之的是 DataSet/DataTable,沒有了 PageSize/AbsolutePage,分頁成了一件非常頭痛的事。
所有的 Asp.Net 初級教程中都會講解如何使用 DataGrid 控件進行基于 Post 的分頁,當我練習完這個例子后從來沒有在實戰中使用過,原因有二:
所以建議大家也都不要用這個分頁了,呵呵,真垃圾。
Asp.Net 能不能像 Asp 一樣簡單地分頁呢?答案是可以的,要使用 PageDataSource 類,這里有篇很完整的教程給大家參考,一位高手的Blog。
使用 PageDataSource 很方便,但它也有個致命的缺點,就是性能上的下降,偶對一張10000條數據的表格進行了 Asp/Asp.Net(DataGrid)/Asp.Net(PageDataSource) 三項分頁速度測試,結果分別是 600ms-700ms / 500ms / 900ms-1000ms ,使用了 PageDataSource 分頁速度竟然比 Asp 都慢,郁悶,原因大概是因為作了二次數據綁定造成的吧,大家可以自行測試,看是否和我測試的結果相同。
精華部分到啦……
要提高分頁的性能,還得使用自定義分頁,首先我們來看看傳統的 Asp 分頁時需要哪些參數?
回到 Asp.Net,我們來做一個例子,我們對 /NewsList.asp?Page=3 進行分頁,可以這樣做:
關鍵時候到了,需要向 DataSet 中填充數據,注意這個技巧:
dAdapter.Fill(dSet, (CurrentPage - 1) * PageSize, PageSize, "Table");這一句可以向DataSet中填充指定位置的數據,這樣就可以達到分頁的效果啦。
經測試,這樣的分頁因向DataSet中填充數據量的減少,降低了服務器內存消耗,頁面執行速度大約在 120ms-170ms
相關連接:
????
使用PagedDataSource類實現DataList和Repeater控件的分頁顯示功能
??? Asp.net提供了三個功能強大的列表控件:DataGrid、DataList和Repeater控件,相對DataGrid,DataList和Repeater控件具有更高的樣式自定義性,很多時候我們喜歡使用DataList或Repeater控件來顯示數據,但是Repeater和DataList沒有分頁功能,有時很不方便。
??? PagedDataSource類封裝了DataGrid控件的屬性,從而使DataGrid控件可以執行分頁,它就是一個數據的容器,我們先把數據從數據庫中讀取出來放在這個容器中,然后設置容器的屬性取出當前要顯示的頁上的部分數據,然后將此部分數據再綁定到頁面上的顯示控件上。
??? 下面實例是Repeater控件和HyperLink控件結合PagedDataSource類實現的數據分頁列表
數據功能實現源代碼:
//對用于分頁的類的引用
PagedDataSource pds=new PagedDataSource();
pds.DataSource=dt.DefaultView;//設置數據源(DataTable類型)
pds.AllowPaging=true;
//第頁顯示的行數
pds.PageSize=18;
//設置當前頁
if(Pageindex<1) Pageindex=1;
pds.CurrentPageIndex=Pageindex-1;
rpt_NewsList.DataSource=pds;
rpt_NewsList.DataBind();
//顯示頁碼
ltl_RecordCount.Text = pds.DataSourceCount.ToString();
ltl_PageCount.Text = pds.PageCount.ToString();
ltl_Pageindex.Text = Pageindex.ToString();
ltl_Jump.Text = Jump_List (pds.PageCount , Pageindex , L_Manage);
//顯示上下翻頁(URL后面跟的參數自已跟據需要定義)
lbn_First.ToolTip = "跳轉到首頁";
lbn_First.NavigateUrl=Request.CurrentExecutionFilePath+"?Org_ID="+ L_Manage +"&page=1";
lbn_Prev.ToolTip = "跳轉到上一頁";
lbn_Prev.NavigateUrl=Request.CurrentExecutionFilePath+"?Org_ID="+ L_Manage +"&page="+(Pageindex-1);
lbn_Next.ToolTip = "跳轉到下一頁";
lbn_Next.NavigateUrl=Request.CurrentExecutionFilePath+"?Org_ID="+ L_Manage +"&page="+(Pageindex+1);
lbn_Last.ToolTip = "跳轉到最后一頁";
lbn_Last.NavigateUrl=Request.CurrentExecutionFilePath+"?Org_ID="+ L_Manage +"&page="+pds.PageCount.ToString();
//確定鏈接的顯示方式
if(Pageindex<=1 && pds.PageCount<=1)
{
????lbn_First.NavigateUrl = "";
????lbn_Prev.NavigateUrl = "";
????lbn_Next.NavigateUrl = "";
????lbn_Last.NavigateUrl = "";
}
if(Pageindex<=1 && pds.PageCount>1)
{
????lbn_First.NavigateUrl = "";
????lbn_Prev.NavigateUrl = "";
}
if(Pageindex >= pds.PageCount)
{
????lbn_Next.NavigateUrl = "";
????lbn_Last.NavigateUrl = "";
}
/// <summary>
/// 計算分頁跳轉
/// </summary>
/// <param name="Pagecount">頁面數</param>
/// <returns>string</returns>
private string Jump_List(int Pagecount , int Pageindex , long L_Manage)
{
StringBuilder sb = new StringBuilder ();
sb.Append ("<select id=\"Page_Jump\" name=\"Page_Jump\" οnchange=\"window.location='"+ Request.CurrentExecutionFilePath +"?page='+ this.options[this.selectedIndex].value + '&Org_ID="+ L_Manage +"';\">");
for(int i = 1 ; i <= Pagecount ; i++)
{
if(Pageindex == i)
sb.Append ("<option value='"+ i +"' selected>"+ i +"</option>");
else
sb.Append ("<option value='"+ i +"'>"+ i +"</option>");
}
sb.Append ("</select>");
return sb.ToString ();
}
動行顯示效果如圖:
PagedDataSource 類的部分公共屬性:
?AllowCustomPaging ?獲取或設置指示是否啟用自定義分頁的值。
?AllowPaging ??獲取或設置指示是否啟用分頁的值。
?Count ???獲取要從數據源使用的項數。
?CurrentPageIndex ??獲取或設置當前頁的索引。
?DataSource ??獲取或設置數據源。
?DataSourceCount ??獲取數據源中的項數。
?FirstIndexInPage ??獲取頁中的第一個索引。
?IsCustomPagingEnabled ?獲取一個值,該值指示是否啟用自定義分頁。
?IsFirstPage ??獲取一個值,該值指示當前頁是否是首頁。
?IsLastPage ??獲取一個值,該值指示當前頁是否是最后一頁。
?IsPagingEnabled ??獲取一個值,該值指示是否啟用分頁。
?IsReadOnly ??獲取一個值,該值指示數據源是否是只讀的。
?IsSynchronized ??獲取一個值,該值指示是否同步對數據源的訪問(線程安全)。
?PageCount ??獲取顯示數據源中的所有項所需要的總頁數。
?PageSize ??獲取或設置要在單頁上顯示的項數。
?VirtualCount ??獲取或設置在使用自定義分頁時數據源中的實際項數。
轉載于:https://www.cnblogs.com/MaxWoods/archive/2008/11/03/1325370.html
總結
以上是生活随笔為你收集整理的Asp.Net 数据分页的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库命名规范(转)
- 下一篇: Mybatis的CRUD之XML方式以及