转载::深入研究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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MFC简介_java void main

    MFC简介_java void main版权声明:www.gudianxiaoshuo.com原创文章版权–古典小说网         WM_CONTEXTMENU消息用来响应鼠标右键消息,它响应的不是鼠标右键按下消息,也不是鼠标右键弹起消息而是鼠标右键依次按下弹起后触发的消息。          因此,若程序还响应了鼠标右键按下的消息OnRButtonDown,且在此响应函数中有模特对话

    2022年8月14日
    5
  • SpringBoot——定时任务@Scheduled

    SpringBoot——定时任务@ScheduledSpringBoot——定时任务@Scheduled

    2022年4月23日
    63
  • Java调用Shell命令和脚本[通俗易懂]

    Java调用Shell命令和脚本[通俗易懂]1.介绍有时候我们在Linux中运行Java程序时,需要调用一些Shell命令和脚本。而Runtime.getRuntime().exec()方法给我们提供了这个功能,而且

    2022年8月18日
    3
  • 国内外常用公共NTP网络时间服务器地址

    国内外常用公共NTP网络时间服务器地址【腾讯云】热门云产品首单特惠秒杀,1核2G云服务器首年38元目录太长不看NTPPoolProjectNTP.ORG.CNNTP授时快速域名服务HSDN(HomeServerDataNetwork)本地服务器数据网络企业阿里巴巴腾讯微软苹果谷歌FacebookCloudflare高通HurricaneElectric飓风电气MSK-IX(MoscowInterneteXchange)莫斯科网络交换INTER…

    2022年4月27日
    55
  • 无法获得下列许可 solidworks_2019年个人总结

    无法获得下列许可 solidworks_2019年个人总结通常,按照网上教程来安装SolidWorks2019、2020到最后启动软件有可能会出现这个错误;下面提供本人亲测可用、在用的解决办法供各位参考。1.如果弹出该错误提示时,先检查“SolidWorks_Flexnet_Server”这个文件夹的所在路径,建议移动到SolidWorks的安装根目录下,即“SOLIDWORKSCorp”目录下。因自身原因无法移动的,请勿删除该文件夹,否则会激活…

    2022年9月22日
    0
  • 如何完整卸载MySQL[通俗易懂]

    如何完整卸载MySQL[通俗易懂]如果MySQL没有卸载干净,想重装就不行了,本人按照网上的教程来过一遍,但是总是会有残留,于是自己琢磨了一下:1.先停止mysql服务,cmd模式下输入netstopmysql;2.进入控制面板卸载mysql;3.删除mysql文件夹下的my.ini文件及所有文件;4.运行“regedit”文件,打开注册表删除HKEY_LOCAL_M

    2022年6月17日
    33

发表回复

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

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