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