使用方法其实和SqlPager一样,用的存储过程也是同一个,只是SqlPager更是个用于后台管理和B/S应用系统中,因为他是采用的Postback实现的翻页;而今天推出的Urlpager是使用的通过在Url地址中传递参数(page=1...)实现的。闲话不多说了,转入正题。(使用环境:WindowsServer2003(IIS6.0)+.Net Framework2.0+MSSQL2000.


使用的分页存储过程:
CREATE PROC [dbo].[sp_PageView]
@tbname     varchar(4000),      --要分页显示的表名
@FieldKey   nvarchar(1000),      --用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段
@PageCurrent int=1,               --要显示的页码
@PageSize   int=10,                --每页的大小(记录数)
@FieldShow nvarchar(1000)='',      --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
@FieldOrder nvarchar(1000)='',  --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC    用于指定排序顺序
@Where    nvarchar(1000)=''     --查询条件
--@PageCount int OUTPUT         --总页数
AS
SET NOCOUNT ON
--检查对象是否有效
--IF OBJECT_ID(@tbname) IS NULL
--BEGIN
--RAISERROR(N'对象"%s"不存在',1,16,@tbname)
--    RETURN
--END
IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0
    AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0
    AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0
BEGIN
    RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)
    RETURN
END

--分页字段检查
IF ISNULL(@FieldKey,N'')=''
BEGIN
    RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)
    RETURN
END

--其他参数检查及规范
IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1
IF ISNULL(@PageSize,0)<1 SET @PageSize=10
IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*'
IF ISNULL(@FieldOrder,N'')=N''
    SET @FieldOrder=N''
ELSE
    SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder)
IF ISNULL(@Where,N'')=N''
    SET @Where=N''
ELSE
    SET @Where=N'WHERE ('+@Where+N')'

--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)
--IF @PageCount IS NULL
--BEGIN
--    DECLARE @sql nvarchar(4000)
--    SET @sql=N'SELECT @PageCount=COUNT(*)'
--        +N' FROM '+@tbname
--        +N' '+@Where
--    EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT
--    SET @PageCount=(@PageCount+@PageSize-1)/@PageSize
--END

--计算分页显示的TOPN值
DECLARE @TopN varchar(20),@TopN1 varchar(20)
SELECT @TopN=@PageSize,
    @TopN1=(@PageCurrent-1)*@PageSize

--第一页直接显示
IF @PageCurrent=1
    EXEC(N'SELECT TOP '+@TopN
        +N' '+@FieldShow
        +N' FROM '+@tbname
        +N' as xx '+@Where
        +N' '+@FieldOrder)
ELSE
BEGIN
    --处理别名
    IF @FieldShow=N'*'
        SET @FieldShow=N' tempPage.*'

--生成主键(惟一键)处理条件
    DECLARE @Where1 nvarchar(4000),@Where2 nvarchar(4000),
        @s nvarchar(1000),@Field sysname
    SELECT @Where1=N'',@Where2=N'',@s=@FieldKey
    WHILE CHARINDEX(N',',@s)>0
        SELECT @Field=LEFT(@s,CHARINDEX(N',',@s)-1),
            @s=STUFF(@s,1,CHARINDEX(N',',@s),N''),
            @Where1=@Where1+N' AND tempPage.'+@Field+N'=tempPageb.'+@Field,
            @Where2=@Where2+N' AND tempPageb.'+@Field+N' IS NULL',
            @Where=REPLACE(@Where,@Field,N'tempPage.'+@Field),
            @FieldOrder=REPLACE(@FieldOrder,@Field,N'tempPage.'+@Field),
            @FieldShow=REPLACE(@FieldShow,@Field,N'tempPage.'+@Field)
    SELECT @Where=REPLACE(@Where,@s,N'tempPage.'+@s),
        @FieldOrder=REPLACE(@FieldOrder,@s,N'tempPage.'+@s),
        @FieldShow=REPLACE(@FieldShow,@s,N'tempPage.'+@s),
        @Where1=STUFF(@Where1+N' AND tempPage.'+@s+N'=tempPageb.'+@s,1,5,N''),    
        @Where2=CASE
            WHEN @Where='' THEN N'WHERE ('
            ELSE @Where+N' AND ('
            END+N'tempPageb.'+@s+N' IS NULL'+@Where2+N')'

--执行查询
    EXEC(N'SELECT TOP '+@TopN
        +N' '+@FieldShow
        +N' FROM '+@tbname
        +N' tempPage LEFT JOIN(SELECT TOP '+@TopN1
        +N' '+@FieldKey
        +N' FROM '+@tbname
        +N' tempPage '+@Where
        +N' '+@FieldOrder
        +N')tempPageb ON '+@Where1
        +N' '+@Where2
        +N' '+@FieldOrder)
END
GO

(注:这个分页存储过程是借鉴的一位同行的,具体哪位已经记不清楚了)
使用方法:
//// <summary>
    /// 绑定UrlPager数据 存储过程的分页
    /// </summary>
    /// <param name="sqlPager">UrlPager控件ID</param>
    /// <param name="sort">排序方式</param>
    /// <param name="sortfied">排序字段</param>
    /// <param name="FieldKey">关键字段(主键)</param>
    /// <param name="ConnectString">数据库链接字符串</param>
    /// <param name="ControlName">绑定的网格控件</param>
    /// <param name="CommandText">SQL语句</param>
    /// <param name="TableName">数据表表名(可以是复杂的查询)</param>
    /// <param name="Fields">查询字段</param>
    /// <param name="SqlCondition">Where条件</param>
    public void BindSqlPager(UrlPagerControl.UrlPager urlPager, UrlPager.SortMode sort,
        string sortfied, string FieldKey, string ConnectString, string ControlName, string CommandText,
        string TableName, string Fields, string SqlCondition)
    {
        urlPager.ConnectionString = ConnectString;
        urlPager.ControlToPaginate = ControlName;
        urlPager.SelectCommand = CommandText;
        urlPager.SortMode = sort;
        urlPager.FieldKey = FieldKey;
        urlPager.SortField = sortfied;
        urlPager.TableName = TableName;
        urlPager.Fields = Fields;
        urlPager.SQLCondition = SqlCondition;
        urlPager.DataBind();

}

调用方法:
this.BindSqlPager(this.UrlPager1, sortmode, sortfield, "ID", this.GetDbConnectString(), "DataList1", this.CommandSQL, "(" + this.CommandSQL + ")", "*", "ID>0");

其中CommandSQL为你自己的复杂的查询语句,比如select a.*,b.* from A as a left join B as b where a.id=b.id

控件的关键代码:
      /**//// <summary>
       /// 呈现
        /// </summary>
        /// <param name="writer"></param>
        protected override void Render(HtmlTextWriter writer)
        {            
            string curPage = "";
            string query = "";
            if (Context != null)
            {
                query = Page.Request.Url.Query.Replace('?', '&');
            }
            curPage = query == "" ? "&page=1" : query;
            query = RX.Replace(query, String.Empty, -1);
            query = "<a href='?page={0}" + query + "'>{1}</a>&nbsp;";

// Prepare the necessary number
            int page = CurrentPage;
            int count = PageCount;
            int nums = NumberCount - 1;
            int center = nums / 2;
            int beginIndex = 1;

// Calculate the first page number in the pagger bar
            if (count > nums && page > center)
            {
                beginIndex = page - center;
                if ((count - beginIndex) <= nums)
                    beginIndex = count - nums;
            }

// Calculate the last page number in the pagger bar
            int endIndex = beginIndex + nums;
            if (endIndex > count)
                endIndex = count;

// Render the pagger bar

writer.AddAttribute(HtmlTextWriterAttribute.Id, ClientID);
            if (!String.IsNullOrEmpty(_class))
            {
                writer.AddAttribute(HtmlTextWriterAttribute.Class, _class);
            }
            else
            {
                
            }
            writer.RenderBeginTag(HtmlTextWriterTag.Div);

writer.Write(String.Format(query, page > 1 ? (page - 1) : 1, PrevText));
            writer.Write(String.Format(query, 1, "1")+FirstText);

for (int i = beginIndex; i <= endIndex; i++)
            {
                if (page == i)
                {
                    string _tempUrl = query.Replace("'>", "' class='" + this.VisitedCss + "'>");
                    writer.Write(String.Format(_tempUrl, i, i));
                     }
                else
                {
                                            writer.Write(String.Format(query, i, i));
                }
            }
            writer.Write(LastText + String.Format(query, count, count.ToString()));
            writer.Write(String.Format(query, page < count ? (page + 1) : page, NextText));

writer.RenderEndTag();
        }

/**//// <summary>
        /// 重载数据绑定   取得,填充数据
        /// </summary>
        public override void DataBind()
        {
            //this.SelectCommand=string.Format("exec sp_PageView '{0}','{1}','{2}',{3},{4},{5},{6},'{7}'",this.TableName,this.Fields,this.SortField,this.ItemsPerPage,(this.CurrentPageIndex+1),0,(this.SortMode==LJHSqlPager2.SortMode.DESC?"1":"0"),this.SQLCondition);

object[] param ={
                               this.TableName,
                               this.FieldKey,
                               this.CurrentPage,
                               this.PageSize,
                               this.Fields,
                               this.SortField+(this.SortMode==SortMode.DESC?" DESC":" ASC"),
                               this.SQLCondition
                           };
            this.SelectCommand = string.Format("exec sp_PageView '{0}','{1}',{2},{3},'{4}','{5}','{6}'", param);

// 触发数据绑定事件
            base.DataBind();

// 控件必须在数据绑定后重新创建
            ChildControlsCreated = false;

// 确定数据容器存在并且为列表控件(list control)
            if (ControlToPaginate == "")
                return;
            _controlToPaginate = Page.FindControl(ControlToPaginate);
            if (_controlToPaginate == null)
                return;
            if (!(_controlToPaginate is BaseDataList
                || _controlToPaginate is ListControl
                || _controlToPaginate is CompositeDataBoundControl
                || _controlToPaginate is Repeater))
                return;

// 确定数据库连接字符串有效且查询命令已指定
            if (ConnectionString == "" || SelectCommand == "")
                return;

// 取得数据
            //if (PagingMode == PagingMode.Cached)
            //FetchAllData();
            //else
            //{
            //    //if (SortField == "")
            //    //    return;
            FetchPageData();
            //}

// Bind data to the buddy control
            // 绑定数据到数据容器

BaseDataList baseDataListControl = null;
            ListControl listControl = null;
            if (_controlToPaginate is BaseDataList)
            {
                baseDataListControl = (BaseDataList)_controlToPaginate;
                baseDataListControl.DataSource = _dataSource;
                baseDataListControl.DataBind();
                return;
            }
            if (_controlToPaginate is ListControl)
            {
                listControl = (ListControl)_controlToPaginate;
                listControl.Items.Clear();
                listControl.DataSource = _dataSource;
                listControl.DataBind();
                return;
            }
            if (_controlToPaginate is CompositeDataBoundControl)
            {
                GridView gv = (GridView)_controlToPaginate;
                gv.DataSource = _dataSource;
                gv.DataBind();
                return;
            }
            if (_controlToPaginate is Repeater)
            {
                Repeater rep = (Repeater)_controlToPaginate;
                rep.DataSource = _dataSource;
                rep.DataBind();
                return;
            }
        }

主要的核心代码就是呈现数据和绑定数据,大家一看代码就知道了,我也不用多说,不过要提醒的一点是显示的页面是可以自己设置的。
效果图片:
源码下载:UrlPager

转载于:https://www.cnblogs.com/qiantuwuliang/archive/2009/07/07/1518790.html

继SqlPager之后推出一款可用于前台页面的分页控件--UrlPager相关推荐

  1. 创建用于 ASP.NET 的分页程序控件

    Dino Esposito Wintellect 2003 年 10 月 适用于:     Microsoft® ASP.NET 摘要:解决向任何 ASP.NET 控件添加分页功能的问题.还为开发复合 ...

  2. 12款优秀的 JavaScript 日历和时间选择控件

    这些插件能够帮助  Web 开发人员更快速的实现各种精美的日历和时间选择效果. 1. The Coolest Calendar 界面非常漂亮的一款日期选择插件,有详细的使用文档,最新版本 1.5. 点 ...

  3. 发布一个用于WinCE的矢量图控件

    发布一个在wince操作系统下,采用.net compact framework 1.0 ( c#)开发的矢量图控件,我于2007年3月份集中一个月的经历完成了它.当然,它的前身是2005年12月我写 ...

  4. codeproject上的一款分页控件

    试了一下,感觉还好用的.原文地址:http://www.codeproject.com/KB/custom-controls/ASPNETPagerControl.aspx 下载地址 ASPnetPa ...

  5. html登录页面的校验控件,HTML5一款有趣智能的密码输入界面控件

    JavaScript 语言: JaveScriptBabelCoffeeScript 确定 var SmartPass = function(input) { if (input instanceof ...

  6. JS分页控件,可用于无刷新分页

    function PagerBar(recordcount, pagesize, pageindex, showpagecount) {     var NumberRegex = new RegEx ...

  7. html的定仪周控件,哪种输入类型用于定义周和年控件

    满意答案 新增的结构标签 section元素 表示页面中的一个内容区块,比如章节.页眉.页脚或页面的其他部分.可以和h1. h2--等元素结合起来使用,表示文档结构.例:HTML5中--;HTML4中 ...

  8. 表格控件对比_小白如何开发出苏宁易购同款表格协同文档系统?

    SpreadJS是一款基于 HTML5 的纯前端电子表格控件,兼容 450 种以上的 Excel 公式,具有 "高性能.跨平台.与 Excel 高度兼容"的产品特性,满足 Web ...

  9. 用于 Windows8 的 Wijmo Charts 图表控件

    2019独角兽企业重金招聘Python工程师标准>>> 随着Windows 8 Developer Preview 和 Visual Studio 11 Preview的发布, 大家 ...

最新文章

  1. leetcode309. 最佳买卖股票时机含冷冻期
  2. Java对象内存图二
  3. 集合框架(Map容器/Collections工具类)
  4. cognos安装过程各种问题跟解决方法
  5. 深度学习自学(三十):基于深度学习误排序学习的行人重识别对抗攻击
  6. 最新基于CentOS 5.5 ,集成lamp,lnmp终级安装版
  7. 单片机c语言控制直流电机转速,一个用单片机控制直流电机的PWM调速程序
  8. 隐私信息检索(隐匿查询)
  9. UE4自定义资源和编辑器(二):创建自定义编辑器
  10. 试述Linux内核启动过程,Linux内核启动过程和Bootloader(总述)
  11. CV 经典主干网络 (Backbone) 系列: 开篇
  12. Python之word2vec用法说明
  13. 智能机器人走迷宫c语言游戏,(动态规划)机器人走迷宫问题(示例代码)
  14. 本地事务与分布式事务
  15. Mysql查询各门课程成绩大于85分的学生名单—纠正网上大部分文章的错误
  16. 2017年初中计算机课改计划,初中2017年计算机教学工作计划(2)
  17. 数据库 6---SQL语言概述
  18. 影像组学:医学影像学与个性化精准医疗的桥梁
  19. 人生新的开始,组建大数据公司
  20. “Big O”符号的简单英文解释是什么?

热门文章

  1. 深入解析Java编译器学习笔记
  2. Revising Aggregations - The Sum Function(集合函数-sum)
  3. js中匿名函数的N种写法
  4. 理解ffmpeg中的pts,dts,time_base
  5. 矿Spring入门Demo
  6. Flex AdvancedDataGrid 数据展示异常
  7. java实现qq_java实现的类似qq聊天系统
  8. mysql 5.5 type=innodb_mysql5.5.23TYPE=InnoDB语法错误_MySQL
  9. Could not find destination factory for transport解决方法
  10. KVM中四种网络模型(三)