Asp.net 1.1开始,我们就开始使用DataGrid、DataList、Repeater控件,到了Asp.net 2.0又增加了GridView控件。GridView控件在DataGrid上做了优化和改进,功能很强大,但是自定义性不够强。Repeater自定义性非常高。而DataList则兼而有之,其他方面本文不谈。这里就说下怎么给DataList分页。
给DataList分页有两个办法:1、自己写 2、用第三方控件(如AspNetPager)
使用第三方控件的方法我就不说了,这里主要说说如何自己实现分页方法。
我的DataList分页方法的核心原理是利用PagedDataSource对象,PagedDataSource类封装了DataGrid 控件的属性,这些属性使 DataGrid 可以执行分页,下面是PagedDataSource的公共属性:
AllowCustomPaging 获取或设置指示是否启用自定义分页的值。AllowPaging 获取或设置指示是否启用分页的值。Count 获取要从数据源使用的项数。CurrentPageIndex 获取或设置当前页的索引。DataSource 获取或设置数据源。DataSourceCount 获取数据源中的项数。FirstIndexInPage 获取页中的第一个索引。IsCustomPagingEnabled 获取一个值,该值指示是否启用自定义分页。IsFirstPage 获取一个值,该值指示当前页是否是首页。IsLastPage 获取一个值,该值指示当前页是否是最后一页。IsPagingEnabled 获取一个值,该值指示是否启用分页。IsReadOnly 获取一个值,该值指示数据源是否是只读的。IsSynchronized 获取一个值,该值指示是否同步对数据源的访问(线程安全)。PageCount 获取显示数据源中的所有项所需要的总页数。PageSize 获取或设置要在单页上显示的项数。VirtualCount 获取或设置在使用自定义分页时数据源中的实际项数。
那么如何使用 PagedDataSource对象进行DataList分页呢?(网上有很多的讲DataList分页的文章,有一些是糊弄人的,有的还无法起作用,我被骗过一次,本文是我经过个人实践经验得到,可以顺利执行。希望对大家有所帮助。)
现在开始拉!
第一步,取出数据到datatable中,然后获得dataview,付给PagedDataSource对象
DataView objView = objTable.DefaultView;PagedDataSource objPds = new PagedDataSource();
objPds.DataSource = objView;
第二步,PagedDataSource对象objPds的设置
objPds.AllowPaging = true;
objPds.PageSize = 4;
objPds.CurrentPageIndex = int.Parse(ViewState[“pageindex”].ToString());
上面的这两段代码都是写在BindData()函数中的,供每次点击分页按钮时调用。BindData()函数如下:
private void BindData()
{string sql = “SELECT * From team”;DataTable objTable = data.GetDataTable(sql);if (objTable != null && objTable.Rows.Count > 0)
{DataView objView = objTable.DefaultView;PagedDataSource objPds = new PagedDataSource();
objPds.DataSource = objView;objPds.AllowPaging = true;
objPds.PageSize = 4;
objPds.CurrentPageIndex = int.Parse(ViewState[”pageindex”].ToString());if (!objPds.IsFirstPage)
{
lkPre.Visible = true;
}else
{
lkPre.Visible = false;
}if (!objPds.IsLastPage)
{
lkNext.Visible = true;
}else
{
lkNext.Visible = false;
}dlData.DataSource = objPds;
blockquote>
dlData.DataBind();
}
}到此为止,我们已经将数据交给了PagedDataSource,剩下的分页将利用PagedDataSource 进行处理。可能大家注意到了,这个数据交付是完整的数据交付,如果数据量很大会造成一定的效率低下,不过这里暂时不考虑这个问题。有兴趣的朋友可以一起探讨一下。
上面的第三行代码中的 ViewState[“pageindex”] 是用来控制PagedDataSource的当前页的,我们在Page_Load事件中和第三步将要将的函数中来具体讲解如何利用 ViewState[“pageindex”]控制当前页。
BindData()函数中后面的部分是控制向前向后按钮的显隐的,不再多说。
第三步,分页控制
第二步中说过利用 ViewState[“pageindex”] 来控制当前页,为了在页面加载的时候就显示第一页,我们当然要在Page_load事件中将 ViewState[“pageindex”]置为0。
protected void Page_Load(object sender, EventArgs e)
{if (!IsPostBack)
{
ViewState[“pageindex”] = “0″;
BindData(); }
}我们需要加两个按钮(Previous、Next)来点击进行分页控制。
<asp:DataList ID=”dlData” runat=”server” RepeatColumns=”4″ ><ItemTemplate><asp:Label ID=”lblName” runat=”server” /><br /><asp:Label ID=”lblTime” runat=”server” /></ItemTemplate></asp:DataList><asp:linkbutton ID=”lkPre” OnCommand=”IndexChanging” CommandArgument=”pre” runat=”server” >PREVIOUS PAGE></asp:linkbutton><asp:linkbutton ID=”lkNext” OnCommand=”IndexChanging” CommandArgument=”next” runat=”server” >NEXT PAGE</asp:linkbutton>
两个按钮的 OnCommand都是IndexChanging()函数,我们通过CommandArgument(pre和next)来区分到底是向前翻还是向后翻。下面是IndexChanging()函数
protected void IndexChanging(object sender, EventArgs e)
{string strCommand = ((LinkButton)sender).CommandArgument.ToString();int pageindex = int.Parse(ViewState[“pageindex”].ToString());
if (strCommand == “pre”)
{
pageindex = pageindex - 1;
}else
{
pageindex = pageindex + 1;
}ViewState[“pageindex”] = pageindex;
BindData();
}