GridView 內建分頁樣式固定、難客製化。本文示範在 `RowCreated` 事件中動態建立 `LinkButton` 組成導航列(首頁、上一頁、下一頁、末頁),完全掌控 HTML 結構與樣式。
public partial class _Default : Page
{
protected void Page_Load(object sender, EventArgs e)
{
gv.PageSize = 5;
if (!IsPostBack) BindGrid();
}
private void BindGrid()
{
DataTable dt = GetData(); // 你的資料查詢
gv.DataSource = dt;
gv.DataBind();
}
protected void gv_RowCreated(object sender, GridViewRowEventArgs e)
{
// 僅處理分頁列
if (e.Row.RowType != DataControlRowType.Pager) return;
// 清空預設內容
e.Row.Cells[0].Controls.Clear();
// 建立導航按鈕
var btnFirst = CreatePageButton("首頁", "first");
var btnPrev = CreatePageButton("上一頁", "prev");
var btnNext = CreatePageButton("下一頁", "next");
var btnLast = CreatePageButton("末頁", "last");
// 加入容器
var cell = e.Row.Cells[0];
cell.Controls.Add(btnFirst);
cell.Controls.Add(new LiteralControl(" "));
cell.Controls.Add(btnPrev);
cell.Controls.Add(new LiteralControl(" "));
cell.Controls.Add(btnNext);
cell.Controls.Add(new LiteralControl(" "));
cell.Controls.Add(btnLast);
// 狀態控制
UpdatePagerButtons(btnFirst, btnPrev, btnNext, btnLast);
}
private LinkButton CreatePageButton(string text, string commandName)
{
var btn = new LinkButton
{
Text = text,
CommandName = commandName,
CssClass = "page-btn"
};
btn.Click += PageButton_Click;
return btn;
}
private void UpdatePagerButtons(LinkButton first, LinkButton prev, LinkButton next, LinkButton last)
{
int pageCount = gv.PageCount;
int current = gv.PageIndex;
if (pageCount <= 1)
{
first.Enabled = prev.Enabled = next.Enabled = last.Enabled = false;
return;
}
first.Enabled = prev.Enabled = current > 0;
next.Enabled = last.Enabled = current < pageCount - 1;
}
protected void PageButton_Click(object sender, EventArgs e)
{
LinkButton btn = (LinkButton)sender;
switch (btn.CommandName)
{
case "first": gv.PageIndex = 0; break;
case "prev": if (gv.PageIndex > 0) gv.PageIndex--; break;
case "next": if (gv.PageIndex < gv.PageCount - 1) gv.PageIndex++; break;
case "last": gv.PageIndex = gv.PageCount - 1; break;
}
BindGrid(); // 關鍵:重新綁定
}
}
<asp:GridView ID="gv" runat="server" AllowPaging="true"
OnRowCreated="gv_RowCreated"
PageSize="5"
CssClass="grid">
<PagerStyle CssClass="pager-row" />
<PagerSettings Mode="NumericFirstLast" />
</asp:GridView>
.grid { width: 100%; border-collapse: collapse; font-family: 'Microsoft JhengHei', sans-serif; }
.grid th { background: #2c3e50; color: #fff; padding: 10px; text-align: left; }
.grid td { border: 1px solid #eee; padding: 8px; }
.grid tr:nth-child(even) { background: #f9f9f9; }
.grid tr:hover { background: #f0f8ff; }
.pager-row { text-align: center; padding: 15px 0; background: #fafafa; }
.page-btn {
display: inline-block; padding: 6px 14px; margin: 0 4px;
border: 1px solid #ddd; border-radius: 4px;
color: #2c3e50; text-decoration: none; font-size: 14px;
transition: all 0.2s;
}
.page-btn:hover:not(.aspNetDisabled) { background: #3498db; color: #fff; border-color: #3498db; }
.page-btn.aspNetDisabled { color: #bbb; border-color: #eee; cursor: not-allowed; }
| 關鍵 | 說明 |
|---|---|
| `AllowPaging="true"` | 啟用分頁機制 |
| `OnRowCreated` | 動態建立導航控制項的最佳時機 |
| `e.Row.RowType == Pager` | 精準定位分頁列 |
| `Controls.Clear()` | 移除內建數字分頁 |
| `CommandName` + `Click` 事件 | 識別按鈕動作 |
| `BindGrid()` 在 Click 事件中 | **必須**重新綁定資料源 |
| 狀態控制邏輯 | 首尾頁禁用、單頁全禁用 |