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

ASP.NET DataList 分頁完整實作:封裝 PagedDataSource 為可重用元件

     編輯:ASP.NET 基礎

架構設計:資料存取層與分頁邏輯分離

將資料查詢與分頁邏輯封裝於資料存取類別(DB),頁面僅負責 UI 綁定與頁碼狀態管理,符合關注點分離原則。

資料存取類別 (DB.cs)


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>

優化建議

  1. SQL 注入風險:實務上請使用參數化查詢或 ORM,勿直接拼接 SQL 字串。
  2. 連線字串外部化:放在 web.config <connectionStrings>。
  3. 大數據量:改用 AllowCustomPaging=true,SQL 查詢加入 ROW_NUMBER() 或 OFFSET/FETCH,VirtualCount 設為總筆數。
  4. 狀態保存:頁碼建議用 ViewState 而非 Label,避免被使用者竄改。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved