ASP.NET DataList通过PageDataSource类实现分页功能
DataList控件中没有像GridView控件那样通过设置AllowPaging、PageSize等属性来实现分页的功能( 了解GridView的分页实现点这里~),我们可以通过PageDataSource类来实现DataList控件的分页功能,该类封装了数据绑定控件以及分页相关的属性,来执行分页操作。
PageDataSource的使用
下面代码为后台进行数据绑定的方法
//声明一个分页数据源对象的全局变量
protected static PagedDataSource ps = new PagedDataSource();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Bind(0); //初始化DataList数据,默认为第1页
}
}
/// <summary>
/// 进行数据绑定的方法
/// </summary>
/// <param name="CurrentPage">要显示数据页的页数</param>
private void Bind(int CurrentPage)
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "server=主机名\\实例名;uid=用户名;pwd=密码;database=数据库";
string sqlStr = "select * from tb_login";
SqlDataAdapter sda = new SqlDataAdapter(sqlStr, conn);
DataSet ds = new DataSet();
sda.Fill(ds, "tb_Login");
//利用PageDataSource类来实现DataList分页
ps.DataSource = ds.Tables["tb_Login"].DefaultView;
ps.AllowPaging = true;
ps.PageSize = 3;
ps.CurrentPageIndex = CurrentPage; //将当前页数设置为要显示的页数
DataList1.DataSource = ps;
DataList1.DataKeyField = "id";
DataList1.DataBind();
}
前台页面DataList模板编写
关于ItemTemplate及页眉Header编写这边不作阐述,没有思路的读者可参考另一篇文章《ASP.NET DataList控件的了解与使用》。这里只对页脚关键部分进行说明,代码如下:
<FooterTemplate>
共有<asp:Label ID="labCount" runat="server" Text="" />页
当前<asp:Label ID="labNowPage" runat="server" Text="" />页
<asp:LinkButton ID="lnkbtnFirst" runat="server" Text="首页" CommandName="first"/>
<asp:LinkButton ID="lnkbtnFront" runat="server" Text="上一页" CommandName="pre"/>
<asp:LinkButton ID="lnkbtnNext" runat="server" Text="下一页" CommandName="next"/>
<asp:LinkButton ID="lnkbtnLast" runat="server" Text="尾页" CommandName="last"/>
跳转至:<asp:TextBox ID="txtPage" runat="server" Width="30px" />
<asp:Button ID="btnGo" runat="server" Text="GO" CommandName="search"/>
<asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server"
ControlToValidate="txtPage" ErrorMessage="请输入数字(除了数值0)"
ValidationExpression="[1-9]+(\d)*"></asp:RegularExpressionValidator>
</FooterTemplate>
编写DataList的ItemCommand事件
根据在模板中设置四个LinkButton以及跳转按钮的CommandName的值,,在ItemCommand事件中设置单击“首页”、“上一页”、“下一页”、“尾页”按钮时,通过响应的command设置当前页索引及绑定当前页,并实现单击跳转按钮时跳转到指定页码的功能。代码如下:
protected void DataList1_ItemCommand(object source, DataListCommandEventArgs e)
{
switch (e.CommandName)
{
case "first":
ps.CurrentPageIndex = 0;
Bind(ps.CurrentPageIndex);
break;
case "pre":
ps.CurrentPageIndex = ps.CurrentPageIndex - 1;
Bind(ps.CurrentPageIndex);
break;
case "next":
ps.CurrentPageIndex = ps.CurrentPageIndex + 1;
Bind(ps.CurrentPageIndex);
break;
case "last":
ps.CurrentPageIndex = ps.PageCount - 1;
Bind(ps.CurrentPageIndex);
break;
case "search":
if (e.Item.ItemType == ListItemType.Footer) //判断控件类型是否为列表控件底部类型
{
int PageCount = int.Parse(ps.PageCount.ToString());
TextBox txtPage = e.Item.FindControl("txtPage") as TextBox;
int MyPageNum = 0;
if (!txtPage.Text.Equals(""))
{
MyPageNum = Convert.ToInt32(txtPage.Text.ToString());
if (MyPageNum <= 0 || MyPageNum > PageCount)
{
Response.Write("<script>alert('请输入页数并确定没有超出总页数!')</script>");
}
else
{
Bind(MyPageNum - 1);
}
}
}
break;
default:
break;
}
}
编写DataList的ItemDataBound事件
在ItemDataBound事件中处理各个按钮的显示状态以及Label控件的显示内容,代码如下:
protected void DataList1_ItemDataBound(object sender, DataListItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Footer)
{
//获取模板中控件的引用
Label CurrentPage = e.Item.FindControl("labNowPage") as Label;
Label PageCount = e.Item.FindControl("labCount") as Label;
LinkButton FirstPage = e.Item.FindControl("lnkbtnFirst") as LinkButton;
LinkButton PrePage = e.Item.FindControl("lnkbtnFront") as LinkButton;
LinkButton NextPage = e.Item.FindControl("lnkbtnNext") as LinkButton;
LinkButton LastPage = e.Item.FindControl("lnkbtnLast") as LinkButton;
CurrentPage.Text = (ps.CurrentPageIndex + 1).ToString();//绑定显示当前页
PageCount.Text = ps.PageCount.ToString();//绑定显示总页数
if (ps.IsFirstPage)//如果是第一页,首页和上一页按钮
{
FirstPage.Enabled = false;
PrePage.Enabled = false;
}
if (ps.IsLastPage)//如果是最后一页"下一页"和"尾页"按钮不能用
{
NextPage.Enabled = false;
LastPage.Enabled = false;
}
}
}
效果如下: