转载::深入研究DataList分页方法

转载::深入研究DataList分页方法

此文章转至http://www.tobrush.com/archives/617301(隋心所欲)

从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;
dlData.DataBind();
}
}

blockquote>

到此为止,我们已经将数据交给了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();
}

至此,我们的分页函数已经写完了。这里还有一些东西没有说,比如显示一共多少条记录,当前第几页,一共多少页以及每一页的页码。相信看懂了上面所说的后这些东西还是容易写出来的。

总结一下,我们在前台写好DataList等待数据,而数据是由PagedDataSource提供的,分页通过我们新加的两个ImageButton来控制ViewState进而达到控制PagedDataSource的CurrentPageIndex来实现的。所以,其实DataList也没干啥事,就是显示了每一页的数据而已。有一点需要说明,PagedDataSource的CurrentPageIndex是从0开始的,这也是为什么在Page_load事件中要讲ViewState置为0而不是1的缘故。

OK了~听着周杰伦的“阳光宅男”写完了这篇blog,希望对大家有所帮助 。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/110409.html原文链接:https://javaforall.net

(0)
上一篇 2021年8月18日 上午11:00
下一篇 2021年8月18日 下午12:00


相关推荐

  • CAP以及分区容错性的含义「建议收藏」

    CAP以及分区容错性的含义「建议收藏」一个分布式系统里面,节点组成的网络本来应该是连通的。然而可能因为一些故障,使得有些节点之间不连通了,整个网络就分成了几块区域。数据就散布在了这些不连通的区域中。这就叫分区。当你一个数据项只在一个节点中保存,那么分区出现后,和这个节点不连通的部分就访问不到这个数据了。这时分区就是无法容忍的。提高分区容忍性的办法就是一个数据项复制到多个节点上,那么出现分区之后,这一数据项就可能分布到各个区里。容忍性就提高了。然而,要把数据复制到多个节点,就会带来一致性的问题,就是多个节点上面的数据可能是不一致的。要

    2022年7月25日
    16
  • 《AI副业探索(第1期):我如何用Midjourney,设计并销售“手机壳图案”?》

    《AI副业探索(第1期):我如何用Midjourney,设计并销售“手机壳图案”?》

    2026年3月15日
    4
  • Spring Boot缓存注解@Cacheable、@CacheEvict、@CachePut使用

    Spring Boot缓存注解@Cacheable、@CacheEvict、@CachePut使用从 3 1 开始 Spring 引入了对 Cache 的支持 其使用方法和原理都类似于 Spring 对事务管理的支持 SpringCache 是作用在方法上的 其核心思想是这样的 当我们在调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存放在缓存中 等到下次利用同样的参数来调用该方法时将不再执行该方法 而是直接从缓存中获取结果进行返回 所以在使用 SpringCache 的时候我们要保证我们缓存的方法对

    2026年3月19日
    2
  • mysql查看ddl语句_mysql语句-DDL语句

    mysql查看ddl语句_mysql语句-DDL语句SQL 分类 1 DDL 语句 数据定义语句 用来定义不同的数据段 数据库 表 列 索引等数据表对象 常用语句 create drop alter 等 2 DML 语句 数据操作语句 用于添加 删除 更新和查询数据库记录 insert delete update select 3 DCL 语句 数据控制语句 用于控制不同数据段直接的许可和访问级别的语句 这些语句定义了数据库 表 字段 用户的访问权限和安全级别

    2026年3月19日
    2
  • 理解Openclaw的工作原理才能发现养虾的魅力并沉迷其中

    理解Openclaw的工作原理才能发现养虾的魅力并沉迷其中

    2026年3月13日
    3
  • 你要知道的密评改造方案

    你要知道的密评改造方案参照商用密码应用安全性评估标准 来设计全流程国产密码改造合规解决方案 建设完整的密码支撑体系

    2026年3月16日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号