zoukankan      html  css  js  c++  java
  • Repeater的分页

     

     
    Repeater控件是个好东西。轻量级。又好用。完全的自定义。但是,正是因为这些优点它没有自动分页的功能。这个需要研究一下。我看了一下起点等小说网站,那些什么推荐排名榜用Repeater控件那是很爽的就能实现。太简单了。而且加个UpdatePanel就更加爽了。像163博客一样。

      ok了。研究了一个上午,终于写出了自己的实验代码。成功通过了。当然,成功离不开网上的兄弟。点此处查看参考资料

      这位兄弟的可能用asp.net 1.x开发的,所以代码在放入编辑器中还需要修改一下才能运行。谢过了。

      Repeater分页,需要依靠PagedDataSource。这个类存在于System.Web.UI.WebControls命名空间。它的作用是作为数据源与数据显示控件的中间介质。如:

      数据源->PagedDataSource->数据绑定控件

      之间的关系通过以下代码来实现:

      PagedDataSource pds=new PagedDataSource ();

      pds.DataSource=dataTable;

      repeater1.DataSource=pds;

      repeater1.DataBind();

      三者之间发生关系的代码就是这些。

      那么PagedDataSource又是怎样工作的呢?MSDN上面也没有讲。这仅仅是我的推断。

      PagedDataSource封装了从底层数据源(如:DataTable)中取出第几页数据的中间过程。我们只需设置

      PagedDataSource .AllowPaging=true;

      PagedDataSource .PageSize=xx;

      PagedDataSource.CurrentPageIndex=currentPage;

      就可以取出指定页的数据,而数据绑定控件将从PagedDataSource 中获取这些数据以显示。PagedDataSource 在这里成一个中介。而数据绑定组件如何取数据,PagedDataSource 是如何分页,并取出对应的数据,这个是asp.net框架内部实现,对我们完全透明。

      另一个需要着重讲的是,PagedDataSource 中页号是从0开始的,并不是从1开始。我的示例代码如下:

    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using Buddha.Utils;
    using System.Data.Common;


    public partial class Repeater : System.Web.UI.Page
    {


        protected void Page_Load(object sender, EventArgs e)
        {
            PagedDataSource pds = new PagedDataSource();
            pds.DataSource = CreateDataSource().DefaultView;

            //pds.AllowCustomPaging = true;
            pds.AllowPaging = true;
            //pds.AllowServerPaging = true;
            pds.PageSize = 3;

            int currentPage=Convert.ToInt32(Request["page"]);

            //设当前页
            pds.CurrentPageIndex = currentPage;

            //设几个超链接
            if (!pds.IsFirstPage)
            {
                lnkUp.NavigateUrl = Request.CurrentExecutionFilePath + "?page=" + (currentPage - 1);
            }

            if (!pds.IsLastPage)
            {
                lnkDown.NavigateUrl = Request.CurrentExecutionFilePath + "?page=" + (currentPage + 1);
            }


            lbl_info.Text = "第" + (currentPage+1) + "页、共" + pds.PageCount + "页";

            Repeater1.DataSource = pds;
            Repeater1.DataBind();


        }


        /// <summary>
        /// 创建数据源
        /// </summary>
        /// <returns></returns>
        private DataTable CreateDataSource()
        {
            DataBase db = AppCommon.DefaultDataBase;
            DataTable dt = db.GetDataTable("select id,txt2,txt3,txt4,txt5,txt6 from tbmain1");

            db.Dispose();
            return dt;
        }

      aspx中的代码如下:

    <%@ Page Language="C#" CodeFile="Repeater.aspx.cs" Inherits="Repeater" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Repeater实验室</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:HyperLink ID="lnkUp" runat="server">上一页</asp:HyperLink>
            <asp:HyperLink ID="lnkDown" runat="server">下一页</asp:HyperLink>
            <asp:Label ID="lbl_info" runat="server" Text="当前第x页,共x页"></asp:Label><br />
            <table>      
                <asp:Repeater ID="Repeater1" runat="server">
                    <ItemTemplate>
                        <tr><td>项目名称:</td><td><%# eval_r("txt2") %></td></tr>
                        <tr><td>承担单位:</td><td><%# eval_r("txt3") %></td></tr>
                        <tr><td>计划类别:</td><td><%# eval_r("txt4") %></td></tr>
                        <tr><td>技术领域:</td><td><%# eval_r("txt5") %></td></tr>
                        <tr><td colspan="2"><hr /></td></tr>
                    </ItemTemplate>
                </asp:Repeater>
            </table>
        </div>
        </form>
    </body>
    </html>
      呵呵,我写的代码都是蛮清爽的,一看就明白的那种。后来我又查到一份代码,也是用PagedDataSource实现,不过,它用的是LinkButton来导航,结果使得代码复杂了不少。因为要为按钮事件编写代码。远不如用HyperLinker来得爽快。

      另外,我这段分页代码最优秀的地方是:

      一、不用判断Request.QueryString["page"]是否为null了。直接一个转型,什么都不用判断;

      二、使用IsFirstPage、IsLastPage来判断是否第一页、最后一页

      三、取DataTable的代码实在优美、简约到极点了。底层封装得好啊。

      四、使用HyperLinker而不用LinkButton来导航。

      MSDN上说:PagedDataSource 类封装那些允许数据源控件(如 DataGridGridViewDetailsView 和FormView)执行分页操作的属性。如果控件开发人员需对自定义数据绑定控件提供分页支持,即可使用此类。可见,如果有一天,要把数据绑定控件绑定到DataTable之类的数据源上,那么就需要用PagedDataSource来手工分页了。

      今天收获很大,终于搞清了手工分页的问题。

      刚才搞了一下DataList,这个东西也没什么好研究的。一笔带过了。不过,DataList有个布局方式的设置,它还可以采用多列的方式。就这点特殊之处了。msdn上面写了十来章的内容专讲它。

  • 相关阅读:
    连接过滤器
    插件使用 之 Bmap
    插件使用 之 ztree、nicescroll
    插件使用 之 layui、echart
    插件使用 之 bootstrap
    jquery显隐特效 动画 事件
    jquery js对比 加载 操作内容 属性 样式 元素 选择器
    js三级联动练习(地址填写)
    js时间、定时器、移动div块、轮播
    js DOM操作
  • 原文地址:https://www.cnblogs.com/marsli/p/3761600.html
Copyright © 2011-2022 走看看