前提:学习牛腩的时候,只学会了用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(); } }结果 :
总结:这就是我们常说的假分页,从数据库一次性取出所有数据绑定到控件上,再将所有数据根据每页显示多少条记录而分页。真分页虽然已经了解了,但是还没有正实践过,期待真分页的到来!