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#" AutoEventWireup="true" 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("txt2") %></td></tr>
                        <tr><td>承担单位:</td><td><%# Eval("txt3") %></td></tr>
                        <tr><td>计划类别:</td><td><%# Eval("txt4") %></td></tr>
                        <tr><td>技术领域:</td><td><%# Eval("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 类封装那些允许数据源控件(如 DataGrid、GridView、DetailsView 和 FormView)执行分页操作的属性。如果控件开发人员需对自定义数据绑定控件提供分页支持,即可使用此类。可见,如果有一天,要把数据绑定控件绑定到DataTable之类的数据源上,那么就需要用PagedDataSource来手工分页了。

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

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

  • 相关阅读:
    1014 Waiting in Line (30)(30 point(s))
    1013 Battle Over Cities (25)(25 point(s))
    1012 The Best Rank (25)(25 point(s))
    1011 World Cup Betting (20)(20 point(s))
    1010 Radix (25)(25 point(s))
    1009 Product of Polynomials (25)(25 point(s))
    1008 Elevator (20)(20 point(s))
    1007 Maximum Subsequence Sum (25)(25 point(s))
    1006 Sign In and Sign Out (25)(25 point(s))
    1005 Spell It Right (20)(20 point(s))
  • 原文地址:https://www.cnblogs.com/tianliang/p/3117092.html
Copyright © 2011-2022 走看看