以下為在 Page_Load 或資料綁定方法中直接使用 PagedDataSource 為 Repeater 實現分頁的精簡寫法:
// 1. 取得資料來源(此處為 DataView)
DataView dv = bllBook.GetListByState("", true); // 業務邏輯層取得資料
// 2. 建立並設定 PagedDataSource
PagedDataSource objPage = new PagedDataSource
{
DataSource = dv,
AllowPaging = true,
PageSize = 10 // 每頁 10 筆
};
// 3. 取得當前頁碼(QueryString 參數 "Page",預設第 1 頁)
int curPage = 1;
if (Request.QueryString["Page"] != null)
curPage = Convert.ToInt32(Request.QueryString["Page"]);
objPage.CurrentPageIndex = curPage - 1; // 索引從 0 開始
// 4. 顯示分頁資訊
int recordCount = dv.Count;
int pageCount = objPage.PageCount;
lblCurPage.Text = $"第 {curPage} / {pageCount} 頁,共 {recordCount} 筆";
// 5. 產生上一頁/下一頁/首頁/末頁 連結
if (!objPage.IsFirstPage)
{
lnkPrev.NavigateUrl = $"{Request.CurrentExecutionFilePath}?Page={curPage - 1}";
lnkFirst.NavigateUrl = $"{Request.CurrentExecutionFilePath}?Page=1";
}
if (!objPage.IsLastPage)
{
lnkNext.NavigateUrl = $"{Request.CurrentExecutionFilePath}?Page={curPage + 1}";
lnkLast.NavigateUrl = $"{Request.CurrentExecutionFilePath}?Page={pageCount}";
}
// 6. 綁定 Repeater
Repeater1.DataSource = objPage;
Repeater1.DataBind();
curPage - 1。?Page=2 形式,支援書籤與瀏覽器前進後退。
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<div class="book-item">
<h4><%# Eval("BookName") %></h4>
<span>作者:<%# Eval("Author") %></span>
<span>價格:<%# Eval("Price", "{0:C}") %></span>
</div>
</ItemTemplate>
</asp:Repeater>
<div class="pagination">
<asp:HyperLink ID="lnkFirst" runat="server" Text="首頁" />
<asp:HyperLink ID="lnkPrev" runat="server" Text="上一頁" />
<asp:Label ID="lblCurPage" runat="server" />
<asp:HyperLink ID="lnkNext" runat="server" Text="下一頁" />
<asp:HyperLink ID="lnkLast" runat="server" Text="末頁" />
</div>
此寫法同樣存在「全量查詢再切分」的效能問題。若資料超過數千筆,請改用 資料庫分頁查詢 + PagedDataSource.AllowCustomPaging = true + VirtualCount = 總筆數 模式,僅取得當頁資料。