將資料查詢與分頁邏輯封裝於資料存取類別(DB),頁面僅負責 UI 綁定與頁碼狀態管理,符合關注點分離原則。
public class DB
{
private string _connStr = "Server=.;Database=TestDB;Uid=sa;Pwd=123456;";
// 通用查詢:回傳 DataTable
public DataTable GetDataSet(string sql)
{
using (var conn = new SqlConnection(_connStr))
using (var adapter = new SqlDataAdapter(sql, conn))
{
var ds = new DataSet();
adapter.Fill(ds);
return ds.Tables[0];
}
}
// 封裝分頁邏輯:回傳已設定好的 PagedDataSource
public PagedDataSource PageDataListBind(string sql, int currentPage, int pageSize)
{
var pds = new PagedDataSource
{
DataSource = GetDataSet(sql).DefaultView,
AllowPaging = true,
PageSize = pageSize,
CurrentPageIndex = currentPage - 1 // 傳入 1-based 頁碼,內部轉 0-based
};
return pds;
}
}
public partial class DataListPaging : System.Web.UI.Page
{
private DB _db = new DB();
private PagedDataSource _pds = new PagedDataSource();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// 當前頁碼存於 Label(也可用 ViewState)
lblCurrentPage.Text = "1";
BindData();
}
}
private void BindData()
{
int currentPage = Convert.ToInt32(lblCurrentPage.Text);
_pds = _db.PageDataListBind("SELECT * FROM tb_word", currentPage, 2); // 每頁 2 筆示範
// 更新導覽按鈕狀態
lnkBtnFirst.Enabled = lnkBtnPrevious.Enabled = !_pds.IsFirstPage;
lnkBtnNext.Enabled = lnkBtnLast.Enabled = !_pds.IsLastPage;
lblSumPage.Text = _pds.PageCount.ToString();
// 綁定 DataList
DataList1.DataSource = _pds;
DataList1.DataKeyField = "ID";
DataList1.DataBind();
}
// 分頁按鈕事件
protected void lnkBtnFirst_Click(object sender, EventArgs e) => GoPage(1);
protected void lnkBtnPrevious_Click(object sender, EventArgs e) => GoPage(Convert.ToInt32(lblCurrentPage.Text) - 1);
protected void lnkBtnNext_Click(object sender, EventArgs e) => GoPage(Convert.ToInt32(lblCurrentPage.Text) + 1);
protected void lnkBtnLast_Click(object sender, EventArgs e) => GoPage(Convert.ToInt32(lblSumPage.Text));
private void GoPage(int page)
{
if (page >= 1 && page <= Convert.ToInt32(lblSumPage.Text))
{
lblCurrentPage.Text = page.ToString();
BindData();
}
}
}
<form id="form1" runat="server">
<asp:DataList ID="DataList1" runat="server">
<ItemTemplate>
<table border="1" style="width:100%; margin-bottom:10px;">
<tr><th>ID</th><th>標題</th><th>內容</th></tr>
<tr>
<td><%# Eval("ID") %></td>
<td><%# Eval("Title") %></td>
<td><%# Eval("Content") %></td>
</tr>
</table>
</ItemTemplate>
</asp:DataList>
<div class="pager">
當前頁碼:<asp:Label ID="lblCurrentPage" runat="server" Text="1" />
總頁數:<asp:Label ID="lblSumPage" runat="server" Text="0" />
<asp:LinkButton ID="lnkBtnFirst" runat="server" OnClick="lnkBtnFirst_Click" Text="第一頁" />
<asp:LinkButton ID="lnkBtnPrevious" runat="server" OnClick="lnkBtnPrevious_Click" Text="上一頁" />
<asp:LinkButton ID="lnkBtnNext" runat="server" OnClick="lnkBtnNext_Click" Text="下一頁" />
<asp:LinkButton ID="lnkBtnLast" runat="server" OnClick="lnkBtnLast_Click" Text="末一頁" />
</div>
</form>
web.config <connectionStrings>。AllowCustomPaging=true,SQL 查詢加入 ROW_NUMBER() 或 OFFSET/FETCH,VirtualCount 設為總筆數。ViewState 而非 Label,避免被使用者竄改。