首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET GridView 手動分頁實作:自訂頁碼導航列完整代碼

     編輯:ASP.NET 基礎

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(); // 關鍵:重新綁定
    }
}

前端 GridView 設定

<asp:GridView ID="gv" runat="server" AllowPaging="true" 
    OnRowCreated="gv_RowCreated" 
    PageSize="5"
    CssClass="grid">
    <PagerStyle CssClass="pager-row" />
    <PagerSettings Mode="NumericFirstLast" />
</asp:GridView>

CSS 樣式範例

.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; }

關鍵點總結

擴展:加入數字頁碼

// 在 RowCreated 中,建立首/上後,迴圈產生數字按鈕
int start = Math.Max(0, gv.PageIndex - 2);
int end = Math.Min(gv.PageCount - 1, gv.PageIndex + 2);

for (int i = start; i <= end; i++)
{
    var btnNum = new LinkButton
    {
        Text = (i + 1).ToString(),
        CommandName = "num",
        CommandArgument = i.ToString(),
        CssClass = "page-btn" + (i == gv.PageIndex ? " current" : "")
    };
    btnNum.Click += PageButton_Click;
    cell.Controls.Add(btnNum);
    cell.Controls.Add(new LiteralControl(" "));
}

// PageButton_Click 中處理
case "num": gv.PageIndex = int.Parse(btn.CommandArgument); break;

現代替代:ListView + DataPager

`ListView` 內建 `DataPager` 控制項,支援模板化分頁 UI,語法更現代:

<asp:ListView ID="lv" runat="server" DataSourceID="ods">
    <LayoutTemplate>
        <table><tr id="itemPlaceholder" runat="server"></tr></table>
        <asp:DataPager ID="dp" runat="server" PageSize="10">
            <Fields>
                <asp:NextPreviousPagerField FirstPageText="首頁" PreviousPageText="上一頁" 
                    NextPageText="下一頁" LastPageText="末頁" />
                <asp:NumericPagerField ButtonCount="5" CurrentPageLabelCssClass="current" />
            </Fields>
        </asp:DataPager>
    </LayoutTemplate>
</asp:ListView>

手動建立 GridView 分頁導航列能完全掌控外觀與行為,適合有嚴格 UI 規格的專案;新專案建議改用 `ListView` + `DataPager` 獲得更佳開發體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
關鍵說明
`AllowPaging="true"`啟用分頁機制
`OnRowCreated`動態建立導航控制項的最佳時機
`e.Row.RowType == Pager`精準定位分頁列
`Controls.Clear()`移除內建數字分頁
`CommandName` + `Click` 事件識別按鈕動作
`BindGrid()` 在 Click 事件中**必須**重新綁定資料源
狀態控制邏輯首尾頁禁用、單頁全禁用