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();
        }
    }
        结果


           总结:这就是我们常说的假分页,从数据库一次性取出所有数据绑定到控件上,再将所有数据根据每页显示多少条记录而分页。真分页虽然已经了解了,但是还没有正实践过,期待真分页的到来!

        

评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值