核心邏輯
private int PageSize = 10;
private int curPage
{
get { return ViewState["curPage"] == null ? 0 : Convert.ToInt32(ViewState["curPage"]); }
set { ViewState["curPage"] = value; }
}
private int PageCount
{
get { return ViewState["PageCount"] == null ? 0 : Convert.ToInt32(ViewState["PageCount"]); }
set { ViewState["PageCount"] = value; }
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
curPage = 1;
GridView1.DataSource = GetClientsForPage(curPage);
lblInfo.Text = string.Format("第{0}頁/共{1}頁", 1, PageCount);
GridView1.DataBind();
}
}
private List<ClientInfo> GetClientsForPage(int pageIndex)
{
var all = new ClientInfoAccessObj().GetAllClients();
PageCount = all.Count / PageSize + 1;
if (pageIndex > PageCount) return null;
int start = (pageIndex - 1) * PageSize;
return all.GetRange(start, Math.Min(PageSize, all.Count - start));
}
protected void btnNext_Click(object sender, EventArgs e)
{
curPage = Math.Min(curPage + 1, PageCount);
BindPage();
}
protected void btnPrev_Click(object sender, EventArgs e)
{
curPage = Math.Max(curPage - 1, 1);
BindPage();
}
protected void btnGo_Click(object sender, EventArgs e)
{
if (int.TryParse(txtPageIndex.Text, out int p))
{
curPage = Math.Max(1, Math.Min(p, PageCount));
BindPage();
}
else ClientScript.RegisterClientScriptBlock(this.GetType(), "info", "alert('非法字元');", true);
}
private void BindPage()
{
GridView1.DataSource = GetClientsForPage(curPage);
lblInfo.Text = string.Format("第{0}頁/共{1}頁", curPage, PageCount);
GridView1.DataBind();
}
特色
- 完全手動控制分頁,不依賴 GridView 內建分頁機制。
ViewState 保存頁碼狀態,支援 PostBack 後恢復。
- 提供下一頁、上一頁、指定頁碼跳轉完整導航。