ASP.NET中Repeater控制元件實現分頁功能

螢火蟲小Q發表於2012-08-02

Repeater
輕量級,完全的自定義

Repeater分頁,需要依靠PagedDataSource。這個類存在於System.Web.UI.WebControls名稱空間。它的作用是作為資料來源與資料顯示控制元件的中間介質。如:

  資料來源->PagedDataSource->資料繫結控制元件

之間的關係通過以下程式碼來實現:

  PagedDataSource pds=new PagedDataSource ();

  pds.DataSource=dataTable;

  repeater1.DataSource=pds;

  repeater1.DataBind();

  三者之間發生關係的程式碼就是這些。

  那麼PagedDataSource又是怎樣工作的呢?MSDN上面也沒有講。這僅僅是我的推斷。

  PagedDataSource封裝了從底層資料來源(如:DataTable)中取出第幾頁資料的中間過程。我們只需設定

  PagedDataSource .AllowPaging=true;

  PagedDataSource .PageSize=xx;

  PagedDataSource.CurrentPageIndex=currentPage;

  就可以取出指定頁的資料,而資料繫結控制元件將從PagedDataSource 中獲取這些資料以顯示。PagedDataSource 在這裡成一箇中介。而資料繫結元件如何取資料,PagedDataSource 是如何分頁,並取出對應的資料,這個是asp.net框架內部實現,對我們完全透明。

  另一個需要著重講的是,PagedDataSource 中頁號是從0開始的,並不是從1開始。

下面我們來看一個例子:

前臺的程式碼:

//repeate.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="repeate.aspx.cs" Inherits="repeate" %>
<%@ Import Namespace="System.Data" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>無標題頁</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound" >
        <HeaderTemplate><%-- 我是頭模板--%>
        <table width="500">
        <tr style="background-color: #ccffcc;">
        <td>作者</td>
        <td>書籍</td>
        </tr>
        </HeaderTemplate>
        <ItemTemplate><%--我是項模板--%>
        <tr>
        <td><a href='repeate.aspx?id=<%# Eval("au_id")%>'><%# Eval("au_lname") %></a></td>
        <td><asp:Repeater ID="Repeater2" runat="server" DataSource='<%# Eval("myrela") %>'>
        <ItemTemplate>
        <%# Eval("[/"title_id/"]") %>
        </ItemTemplate>
        </asp:Repeater>
        </td>
        </tr>        
        </ItemTemplate>
        <SeparatorTemplate><%--這是分隔線模板--%>
        <tr>
        <td colspan="2">
        <hr style="border-top:1pt;"/>
        </td>
        </tr>
        </SeparatorTemplate>
        <FooterTemplate><%--這是腳模板--%>
        <tr>
        <td colspan="2" style="font-size:12pt;color:#0099ff; background-color:#e6feda;">
        共<asp:Label ID="lblpc" runat="server" Text="Label"></asp:Label>頁 當前為第
        <asp:Label ID="lblp" runat="server" Text="Label"></asp:Label>頁
        <asp:HyperLink ID="hlfir" runat="server" Text="首頁"></asp:HyperLink>
        <asp:HyperLink ID="hlp" runat="server" Text="上一頁"></asp:HyperLink>
        <asp:HyperLink ID="hln" runat="server" Text="下一頁"></asp:HyperLink>
        <asp:HyperLink ID="hlla" runat="server" Text="尾頁"></asp:HyperLink>
         跳至第
         <asp:DropDownList ID="ddlp" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlp_SelectedIndexChanged" >
         </asp:DropDownList>頁
        </td>
        </tr>
        </table>
        </FooterTemplate>
        </asp:Repeater>
         </div>
    </form>
</body>
</html>

下面的是後臺的程式碼:

//repeate.aspx.cs

using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class repeate : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            Repeater1.DataSource = pds();
            Repeater1.DataBind();            
        }
    }
    private PagedDataSource pds()
    {
        string connstring = ConfigurationManager.ConnectionStrings["pconn"].ConnectionString;
        SqlConnection con = new SqlConnection(connstring);
       
        DataSet ds = new DataSet();
        SqlDataAdapter sda = new SqlDataAdapter("select * from authors",con);
        sda.Fill(ds,"name");
        SqlDataAdapter sda2 = new SqlDataAdapter("select * from titleauthor",con);
        sda2.Fill(ds,"title");
        ds.Relations.Add("myrela",ds.Tables["name"].Columns["au_id"],ds.Tables["title"].Columns["au_id"]);

        PagedDataSource pds = new PagedDataSource();
        pds.DataSource = ds.Tables["name"].DefaultView;
        pds.AllowPaging = true;//允許分頁
        pds.PageSize = 5;//單頁顯示項數
        pds.CurrentPageIndex = Convert.ToInt32(Request.QueryString["page"]);
        return pds;
    }

    protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Footer)
        {
            DropDownList ddlp = (DropDownList)e.Item.FindControl("ddlp");

            HyperLink lpfirst = (HyperLink)e.Item.FindControl("hlfir");
            HyperLink lpprev = (HyperLink)e.Item.FindControl("hlp");
            HyperLink lpnext = (HyperLink)e.Item.FindControl("hln");
            HyperLink lplast = (HyperLink)e.Item.FindControl("hlla");

            pds().CurrentPageIndex = ddlp.SelectedIndex;

            int n = Convert.ToInt32(pds().PageCount);//n為分頁數
            int i = Convert.ToInt32(pds().CurrentPageIndex);//i為當前頁

            Label lblpc = (Label)e.Item.FindControl("lblpc");
            lblpc.Text = n.ToString();
            Label lblp = (Label)e.Item.FindControl("lblp");
            lblp.Text = Convert.ToString(pds().CurrentPageIndex + 1);

            if (!IsPostBack)
            {
                for (int j = 0; j < n; j++)
                {
                    ddlp.Items.Add(Convert.ToString(j + 1));
                }
            }

            if (i <= 0)
            {
                lpfirst.Enabled = false;
                lpprev.Enabled = false;
                lplast.Enabled = true;
                lpnext.Enabled = true;
            }
            else
            {
                lpprev.NavigateUrl = "?page=" + (i - 1);
            }
            if (i >= n - 1)
            {
                lpfirst.Enabled = true;
                lplast.Enabled = false;
                lpnext.Enabled = false;
                lpprev.Enabled = true;
            }
            else
            {
                lpnext.NavigateUrl = "?page=" + (i + 1);
            }

            lpfirst.NavigateUrl = "?page=0";//向本頁傳遞引數page
            lplast.NavigateUrl = "?page=" + (n - 1);

            ddlp.SelectedIndex = Convert.ToInt32(pds().CurrentPageIndex);//更新下拉選單框中的當前選中頁序號
        }

    }
    protected void ddlp_SelectedIndexChanged(object sender, EventArgs e)
    {//腳模板中的下拉選單框更改時激發
        string pg=Convert.ToString((Convert.ToInt32(((DropDownList)sender).SelectedValue)-1));//獲取列表框當前選中項
        Response.Redirect("repeate.aspx?page="+pg);//頁面轉向
    }
}


相關文章