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上面写了十来章的内容专讲它。

Repeater的分页的更多相关文章

  1. ASP.NET WebForm 通过 PagedDataSource 实现 Repeater 的分页

    1.效果图&代码说明   1.效果图     2.代码说明 1.翻页按钮         前台两个LinkButton(上一页.下一页),设置不同的CommandName.CommandArg ...

  2. 使用公共的存储过程实现repeater的分页

    当一个项目repeater分页多的时候使用公共的存储过程实现分页,是不错的选择 ALTER PROC [dbo].[P_Common_proc] -- 通用分页存储过程 @TableName varc ...

  3. asp.net动态网站repeater控件使用及分页操作介绍

    asp.net动态网站repeater控件使用及分页操作介绍 1.简单介绍 Repeater 控件是一个容器控件,可用于从网页的任何可用数据中创建自定义列表.Repeater 控件没有自己内置的呈现功 ...

  4. cPage分页详细介绍

    asp.net中各种数据控件,datalist.gridview.Repeater等分页是最常用的功能,几乎任何一个B/S项目,无论是系统还是网站都会用到.分页时,读取整个数据,直接绑定到控件,都可以 ...

  5. Repeater+AspNetPager+Ajax留言板

    最近想要巩固下基础知识,于是写了一个比较简单易懂实用的留言板. 部分样式参考了CSDN(貌似最近一直很火),部分源码参照了Alexis. 主要结构: 1.前期准备 2.Repeater+AspNetP ...

  6. Repeater的使用

    1.页面代码 如果要分页,那么页面开头必须写(<%@ Register Src="~/Controls/Page.ascx" TagName="Page" ...

  7. 【转】ASP.NET常用数据绑定控件优劣总结

    转自:http://www.cnblogs.com/Olive116/archive/2012/10/24/2736570.html ASP.NET常用数据绑定控件优劣总结   本文的初衷在于对Asp ...

  8. ASP.NET常用数据绑定控件优劣总结

    本文的初衷在于对Asp.net常用数据绑定控件进行一个概览性的总结,主要分析各种数据绑定控件各自的优缺点,以便在实际的开发中选用合适的控件进行数据绑定,以提高开发效率. 因为这些数据绑定控件大部分都已 ...

  9. Farseer.net轻量级开源框架 中级篇:数据绑定

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: DbFactory数据工厂 下一篇:Farseer.net轻量级开源框架 中级篇: ...

随机推荐

  1. 数据分析师的福音——VS 2017带来一体化的数据分析开发环境

    (此文章同时发表在本人微信公众号“dotNET开发经验谈”,欢迎右边二维码来关注.) 题记:在上个月的Connect() 2016大会上,微软宣布了VS 2017 RC的发布,其中为数据分析师带来了一 ...

  2. C# ORM中Dto Linq Expression 和 数据库Model Linq Expression之间的转换

    今天在百度知道中看到一个问题,研究了一会便回答了: http://zhidao.baidu.com/question/920461189016484459.html 如何使dto linq 表达式转换 ...

  3. WebRTC音频预处理单元APM的整体编译及使用

    正文 行的gnu静态库链接路径是针对NDK版本 r8d 的,如读者版本不匹配,请自行找到 libgnustl_static.a 静态库的路径进行替换. 3)本示例并不打算编译 WebRTC 的测试工程 ...

  4. U-BOOT分析之:环境变量

    (环境如下:U-BOOT  S3C2440  LINUX) 记录自己的学习过程,如果分析有问题,请帮忙指正. 最近在研究U-BOOT的代码,其中的环境变量个人觉得用处非常大,所以重点学习和分析一下. ...

  5. nodejs复习05

    stream 可读流 fs.pause()方法会使处于流动模式的流停止触发data事件,切换到非流动模式并让后续数据流在内部缓冲区 var fs = require('fs') var rs = fs ...

  6. DelphiXE10.1获取Administrator所有权的方法

    操作: 菜单选择Proceject->Options->Application->把Enable Admonistrator Privileges打勾(manifest file - ...

  7. MVC5项目中添加Wep API

    一.查看MVC版本,决定你有没有必要看这篇文章 打开web.config,看到以下内容 <dependentAssembly> <assemblyIdentity name=&quo ...

  8. log4j使用--http://www.cnblogs.com/eflylab/archive/2007/01/11/618001.html

    package log4jTest.com; import java.io.FileReader; import org.apache.log4j.BasicConfigurator; import ...

  9. 头显HTC Vive北美直降100美元,中国区降价活动今日公布

    如果你现在想要购买一台VR头显,591ARVR资讯网www.591arvr.com的小编提醒大家可以等一等,在即将到来的年末促销中各种VR设备都将迎来大力度降价.目前北美市场的HTC Vive已经直降 ...

  10. 洛谷 P1201 [USACO1.1]贪婪的送礼者Greedy Gift Givers Label:ExWater

    题目描述 对于一群(NP个)要互送礼物的朋友,GY要确定每个人送出的钱比收到的多多少.在这一个问题中,每个人都准备了一些钱来送礼物,而这些钱将会被平均分给那些将收到他的礼物的人.然而,在任何一群朋友中 ...