Asp.Net 資料分頁

來源:互聯網
上載者:User
 

.Net 所使用的 ADO.Net較前身ADO在效能上有較大的提升,但是操作起來也較為繁瑣,在 Asp 時代,對資料進行分頁使用 RecordSet 的 PageSize 和 AbsolutePage 即可完成對資料的分頁操作,非常簡單,進入 .Net 後,RecordSet 對象沒有了,取而代之的是 DataSet/DataTable,沒有了 PageSize/AbsolutePage,分頁成了一件非常頭痛的事。

所有的 Asp.Net 初級教程中都會講解如何使用 DataGrid 控制項進行基於 Post 的分頁,當我練習完這個例子後從來沒有在實戰中使用過,原因有二:

  1. 代碼過於複雜;
  2. 不支援url分頁,不利於搜尋引擎和調試,定製度不高。

所以建議大家也都不要用這個分頁了,呵呵,真垃圾。

Asp.Net 能不能像 Asp 一樣簡單地分頁呢?答案是可以的,要使用 PageDataSource 類,這裡有篇很完整的教程給大家參考,一位高手的Blog。

使用 PageDataSource 很方便,但它也有個致命的缺點,就是效能上的下降,偶對一張10000條資料的表格進行了 Asp/Asp.Net(DataGrid)/Asp.Net(PageDataSource) 三項分頁速度測試,結果分別是 600ms-700ms / 500ms / 900ms-1000ms ,使用了 PageDataSource 分頁速度竟然比 Asp 都慢,鬱悶,原因大概是因為作了二次資料繫結造成的吧,大家可以自行測試,看是否和我測試的結果相同。

  精華部分到啦……

  要提高分頁的效能,還得使用自訂分頁,首先我們來看看傳統的 Asp 分頁時需要哪些參數?

  1. PageSize(每頁顯示記錄條數)
  2. RecordCount(總記錄數)
  3. PageCount(總頁數)
  4. AbsolutePage(絕對頁)。

回到 Asp.Net,我們來做一個例子,我們對 /NewsList.asp?Page=3 進行分頁,可以這樣做:

  1. int PageSize=20; //定義每頁顯示的記錄條數
  2. int RecordCount=”select count(*) from news”; //這句不完整,大家自行完善
  3. int PageCount=RecordCount/PageSize; //總頁數算出來啦
  4. int CurrentPage=Convert.ToInt32(Request.QueryString[“Page”].ToString());

關鍵時候到了,需要向 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\" onchange=\"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   擷取或設定在使用自訂分頁時資料來源中的實際項數。

相關文章

聯繫我們

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

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

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.