Repeater真的不能實現分頁嗎?

       前提:學習牛腩的時候,只學會了用Gridview實現假分頁;據說Repeater是沒有分頁功能的。

       背景 Asp.net提供了三個功能強大的列表控件Gridview、DataList和Repeater控件,但其中只有Gridview控件提供分頁功能。相對Gridview,DataList和Repeater控件具有更高的樣式自定義性,所以很多時候我們喜歡使用DataList或Repeater控件來顯示數據。那麼,有沒有一種辦法讓DataList和Repeater控件也能實現分頁呢?

        Gridview能實現分頁的原因是:PagedDataSource 類封裝Gridview 控件的屬性,這些屬性使 Gridview 可以執行分頁。

       最後的結論:通俗的講就是Gridview控件就是使用PagedDataSource類來實現數據分頁顯示的,所以DataList和Repeater也同樣可以使用PagedDataSource來顯示分頁。它們實現的方法都是一樣兒一樣兒的。

       實現過程

前臺代碼:

 <h1>分頁顯示</h1>
        <p>
            <asp:Label ID="Label2" runat="server" Text="當前頁:"></asp:Label>
            <asp:Label ID="Label3" runat="server" Text="Label"></asp:Label>
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="上一頁" />
            <asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="下一頁" />
        </p>
        <asp:Panel ID="Panel1" runat="server" Height="315px">
            <asp:Repeater ID="Repeater1" runat="server">
                <ItemTemplate >
                    <tr>
                      <td>
                        <%#DataBinder .Eval (Container .DataItem ,"UserName") %>
                        <%#DataBinder .Eval (Container .DataItem ,"Level") %>
                      </td>
                    </tr>
                </ItemTemplate>

                <AlternatingItemTemplate >
                    <font color="blue">
                    <tr>
                        <td>
                            <%#DataBinder .Eval (Container .DataItem ,"UserName") %>
                            <%#DataBinder .Eval (Container .DataItem ,"Level") %>
                       </td>
                    </tr>
                    </font>
                </AlternatingItemTemplate>

                <HeaderTemplate >
                    <h3>模板頁眉</h3>
                    <table border ="1">
                        <tr>
                            <td>
                                員工名字
                            </td>
                        </tr>
                </HeaderTemplate>

                <FooterTemplate>
                    </table>
                    <h3>模板頁腳</h3>
                </FooterTemplate>

                <SeparatorTemplate>
                </SeparatorTemplate>
            </asp:Repeater>
        </asp:Panel>

後臺代碼:

 public partial class repeaterControl : System.Web.UI.Page
    {
        /// <summary>
        /// 窗體加載
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!this.IsPostBack) //如果是第一次加載界面,就執行下面的(第一次加載IsPostback是false,因此取相反值。)
            {
                this.Label3.Text ="1"; //讓顯示頁碼的標籤爲1
                this.databindToRepeater();//調用綁定數據源的方法
            }
        }

        /// <summary>
        /// 綁定數據
        /// </summary>
        private void databindToRepeater()
        {
            int curpage = Convert .ToInt32 ( this.Label3.Text);//定義當前頁碼
            SqlConnection con = DB.createCon();//調用DB連接數據庫
            SqlDataAdapter sda = new SqlDataAdapter();//sqlDataadapter的作用是實現Dataset和DB之間的橋樑
            sda.SelectCommand = new SqlCommand("select * from Users", con);
            DataSet ds = new DataSet();
            sda.Fill(ds, "user");// Fill它可填充DataSet中的數據以匹配數據源中的數據
            System.Web.UI.WebControls.PagedDataSource ps = new PagedDataSource();//執行分頁
            ps.DataSource = ds.Tables["user"].DefaultView;//直接將視圖作爲數據源
            ps.AllowPaging = true;//允許分頁
            ps.PageSize =3;//每一頁多少行
            ps.CurrentPageIndex = curpage - 1;//當前頁碼
            this.Button1.Enabled = true;
            this.Button2.Enabled = true;
            if (curpage ==1)
            {
                this.Button1.Enabled = false;//如果頁碼爲1,則上一頁的按鈕不能用

            }
            if (curpage ==ps.PageCount )
            {
                this.Button2.Enabled = false;//如果頁碼爲最大,則下一頁的按鈕不能用
            }
            this.Repeater1.DataSource = ps;
            this.Repeater1.DataBind();
        }

        /// <summary>
        /// 上一頁
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Button1_Click(object sender, EventArgs e)
        {
            this.Label3.Text = Convert.ToString(Convert.ToInt32(this.Label3.Text) -1);
            this.databindToRepeater();
        }

        /// <summary>
        /// 下一頁
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Button2_Click(object sender, EventArgs e)
        {
            this.Label3.Text =Convert .ToString ( Convert.ToInt32(this.Label3.Text) + 1);
            this.databindToRepeater();
        }
    }
        結果


           總結:這就是我們常說的假分頁,從數據庫一次性取出所有數據綁定到控件上,再將所有數據根據每頁顯示多少條記錄而分頁。真分頁雖然已經瞭解了,但是還沒有正實踐過,期待真分頁的到來!

        

發佈了85 篇原創文章 · 獲贊 58 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章