Asp.net中虽然用DataPager配合ListView可以实现分页显示,但是有时候由于开发环境等问题不能用到DataPager控件,那么自己手工写一个分页控件就很有必要了,当然,最重要的是通用性。

首先,来看一下我的分页控件的显示效果:

简单说明:红底色的为当前页,白底红字的是选择新的页,共有1236页,默认从第1页开始显示,分页行长度含“……”共11格,有全显示,单边省略和两边省略三种模式。

当你仔细看完上图的显示效果并理解其分页的相应变化后,我们就要开始制作这个分页了:)

第一步)获取数据结果集,整理分页SQL

首先,你肯定会由一句SQL语句或者一个存储过程来获取动态的结果集,我们这里用SQL语句来举例:

select * from Table order by a1,a2

【重要提示】你必须要对其order by中所用到的字段建立索引,否则会大幅影响其SQL语句的效能

然后,我们用分页效能最高的row_number() over写出这句分页SQL

  1. select * from
  2. (
  3. select row_number() over(order by a1,a2) rowno
  4. from Table
  5. ) t
  6. where rowno between @rowno1 and @rowno2

第二步)设计分页控件的样式

我们先在页面上用HTML+CSS做出一个模拟效果的分页:

  1. <center id="pager">
  2. <a class="pagerBtn">上一页</a>
  3. <a class="pagerCurrent">1</a>
  4. <a class="pagerBtnNum">2</a>
  5. <a class="pagerBtnNum">3</a>
  6. <span class="pagerNone">……</span>
  7. <a class="pagerBtn">下一页</a>
  8. </center>

CSS样式如下,大家可以根据自己的需要调整期大小或颜色:

  1. /* 分页 */
  2. #pager{font:13px Tahoma,SimSun,Arial; color:#666}
  3. #pager a{text-decoration:none;}
  4. #pager a,#pager span{ margin:0px 5px;}
  5. #pager .pagerBtn,.pagerBtnNum{border:#ccc 1px solid;background:#fff;padding:1px 5px;cursor:pointer}
  6. #pager .pagerBtn:hover{color:#FD6D01}
  7. #pager .pagerBtnNum:hover{color:#FD6D01;border-color:#FD6D01;}
  8. #pager .pagerBtnClick{border:#FD6D01 1px solid;background:#fff;padding:1px 5px;color:#FD6D01;}
  9. #pager .pagerCurrent{border:#FD6D01 1px solid;padding:1px 5px;color:#FD6D01;background:#FFEDE1;font-weight:bold;}
  10. #pager .pagerNone{font-family:宋体;}

以上两步写完后测试一下看看,调整完自己喜爱的风格后,我们要在页面放一个Literal控件,然后在后台拼接以上的HTML代码

第三步)整理需要的方法和JS

在做之前先整理一下显示分页需要的三种情况:

1)显示……

  1. private string PagerNone()
  2. {
  3. return "<span class='pagerNone'>……</span>";
  4. }

2)显示单个页码(参数为第i页)

  1. private string PagerChild(int i)
  2. {
  3. return "<a class='pagerBtnNum' onclick=\"urlParamChange('p'," + i + ")\">" + i + "</a>";
  4. }

3)显示循环多个循环页码(参数为当前页index,开始页str,结束页end),如果不是当前页,则显示可点击的页码。点击后会把页码放到URL的参数中,然后刷新当前页显示新的分页数据。

  1. private string PagerChilds(int index, int str, int end)
  2. {
  3. StringBuilder sb = new StringBuilder();
  4. for (int i = str; i <= end; i++)
  5. {
  6. if (i == index)
  7. sb.Append("<a class='pagerCurrent'>" + i + "</a>");
  8. else
  9. sb.Append("<a class='pagerBtnNum' onclick=\"this.className='pagerBtnClick';urlParamChange('p'," + i + ")\">" + i + "</a>");
  10. }
  11. return sb.ToString();
  12. }

页面加入以下JS代码:

  1. //替换URL参数值
  2. function urlParamChange(par,par_value)
  3. {
  4. var url = window.location.href;
  5. var parTxt = par + '=' + par_value;
  6. var re = eval('/('+ par+'=)([^&]*)/gi');// '/\\'+par+'=[^&]*/'
  7.  
  8. if(url.match(re))//含参数
  9. url = url.replace(re,parTxt);
  10. else//不含参数
  11. url = url+'&'+ parTxt;
  12.  
  13. this.location = url;
  14. }

第四步)后台拼接分页HTML并显示在前台

接下来是最核心的分页逻辑部分了,先看一下需要哪些设定值:

  1. int pageSize = ; //每页行数
  2. int rowBeg = ; //默认开始行号
  3. int rowEnd = pageSize; //默认结束行号
  4. string url_p = Request.QueryString["p"];//页码
  5.  
  6. if (url_p != null)
  7. {
  8. rowBeg = (Convert.ToInt32(url_p) - ) * pageSize + ;
  9. rowEnd = Convert.ToInt32(url_p) * pageSize;
  10. }

把SQL放入Datatable类型的dt中:

  1. int rowCount = dt.Rows.Count;//数据行数
  2. if (dt != null && rowCount > )
  3. {
  4. int pageCount = Convert.ToInt32(Math.Ceiling(rowCount * 1.0 / pageSize)); //总页数
  5. int pageMaxShow = ;//最多显示页数,最小为7页,奇数最佳
  6. if (pageCount > )
  7. {
  8. int pageIndex = (url_p == null ? : Convert.ToInt32(url_p));
  9. StringBuilder sbPager = new StringBuilder();
  10. sbPager.Append("<center id='pager'>");
  11.  
  12. //显示全部
  13. if (pageCount <= pageMaxShow)
  14. sbPager.Append(PagerChilds(pageIndex, , pageMaxShow));
  15. //省略右边
  16. else if (pageIndex <= pageMaxShow - )
  17. {
  18. sbPager.Append(PagerChilds(pageIndex, , pageMaxShow - ));
  19. sbPager.Append(PagerNone());
  20. sbPager.Append(PagerChild(pageCount));
  21. }
  22. //省略左边
  23. else if (pageIndex > pageCount - pageMaxShow + )
  24. {
  25. sbPager.Append(PagerChild());
  26. sbPager.Append(PagerNone());
  27. sbPager.Append(PagerChilds(pageIndex, pageCount - pageMaxShow + , pageCount));
  28. }
  29. //省略两边
  30. else
  31. {
  32. sbPager.Append(PagerChild());
  33. sbPager.Append(PagerNone());
  34. sbPager.Append(PagerChilds(pageIndex, pageIndex - (pageMaxShow - ) / , pageIndex + (pageMaxShow - ) / ));
  35. sbPager.Append(PagerNone());
  36. sbPager.Append(PagerChild(pageCount));
  37. }
  38.  
  39. sbPager.Append("</center>");
  40. this.lPager.Text = sbPager.ToString();
  41. }

以上代码简单的说,分页显示一共有四种情况:

1) 当总页数<=最大显示页数:显示全部页码

2) 当当前页<=最大显示页数-3:显示右边有省略号的页码(-3是因为右边有最后一页,省略号,省略号左边的页码)

3) 当当前页>总页数-最大显示页数+3:显示左边有省略号的页码(+3是因为左边有第一页,省略号,省略号右边的页码)

4) 其他情况,则显示两边有省略号的页码

恭喜,现在你已经大功告成了!

纯手写分页控件CSS+JS+SQL的更多相关文章

  1. asp.net 分页-自己写分页控件

    去年就发表过asp.net 分页-利用后台直接生成html分页 ,那种方法只是单纯的实现了分页,基本不能使用,那时就想写个自己的分页控件,无奈能力有限.最近有点时间了,就自己做出了这个分页控件.我承认 ...

  2. 日积月累系列之分页控件(js源码)

    最近开发了一款分页控件,分享给大家. 主要功能和界面介绍 cform分页控件支持服务端分页.客户端分页.数据过滤.数据排序等功能. 源码介绍 cform-pager分页控件主要由三部分组成:css.s ...

  3. jquery自动生成分页控件 - pagetest.js

    /* pagenum:当前页数 theallnum:总条数 themeiye:每页显示多少条 */ function pagetest(pagenum, theallnum, themeiye) { ...

  4. 自己动手用Javascript写一个无刷新分页控件

    .NET技术交流群:337901356 ,欢迎您的加入! 对 于一个用户体验好的网站来说,无刷新技术是很重要的,无刷新,顾名思义,就是局部刷新数据,有用过Asp.net Web Form技术开发网页的 ...

  5. 基于avalon+jquery做的bootstrap分页控件

    刚开始学习avalon,项目需要就尝试写了个分页控件Pager.js:基于BootStrap样式这个大家都很熟悉 在这里推荐下国产前端神器avalon:确实好用,帮我解决了很多前端问题. 不多说了,代 ...

  6. 仿淘宝分页按钮效果简单美观易使用的JS分页控件

    分页按钮思想:  1.少于9页,全部显示  2.大于9页,1.2页显示,中间页码当前页为中心,前后各留两个页码  附件中有完整例子的压缩包下载.已更新到最新版本  先看效果图:  01输入框焦点效果  ...

  7. 自己写的简单的jQuery分页控件

    因为是内部项目,需要分页控件,网上找了一大堆,给领导一看,都说不行,原因很简单,太复杂,领导就想要个简单点的,类似百度的分页,可是自己也没写过Jquery控件,硬着头皮找了些资料,写了这个分页控件,目 ...

  8. 小白写的一个ASP.NET分页控件,仅供娱乐

    无聊,第一次写博客,自己动手写了一个分页控件.由于我是新手,有很多地方写得不够好,希望各位大牛多多指正.哈哈哈 /// <summary> /// 分页控件 /// </summar ...

  9. vue10行代码实现上拉翻页加载更多数据,纯手写js实现下拉刷新上拉翻页不引用任何第三方插件

    vue10行代码实现上拉翻页加载更多数据,纯手写js实现下拉刷新上拉翻页不引用任何第三方插件/库 一提到移动端的下拉刷新上拉翻页,你可能就会想到iScroll插件,没错iScroll是一个高性能,资源 ...

随机推荐

  1. myeclipse黑色主题怎么还原

    删除workspace-->.metadata-->.plugins-->org.eclipse.core.runtime

  2. el 和 fmt 常用

    EL表达式入门 转自 http://blog.chinaunix.net/uid-9789791-id-1997374.html 隐含对象: pageContext: pageContext对象 pa ...

  3. php数据通信方式

    一:curl$ch = curl_init();curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);curl_setopt($ch,CURLOPT_TIMEOU ...

  4. Libsvm:脚本(subset.py、grid.py、checkdata.py) | MATLAB/OCTAVE interface | Python interface

    1.脚本 This directory includes some useful codes: 1. subset selection tools. (子集抽取工具) subset.py 2. par ...

  5. listview定位到上次显示的位置

    整体思路:滑动lictview时,记录listview的位置,定位时定位到该位置. 1.添加全局变量 private int scrolledX = 0; private int scrolledY ...

  6. 如何设计一个RPC系统

    版权声明:本文由韩伟原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/162 来源:腾云阁 https://www.qclou ...

  7. 理解Cookie和Session机制

    转载: 理解Cookie和Session机制 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录 ...

  8. 索引器(C# 编程指南)

    原文地址:https://msdn.microsoft.com/zh-cn/library/6x16t2tx(VS.80).aspx 索引器允许类或结构的实例按照与数组相同的方式进行索引.索引器类似于 ...

  9. .NET Reflector 8.2支持VS2013高亮显示和代码地图视图

    Red Gate Software公司最近发布的.NET Reflector 8.2支持Visual Studio 2013,其Reflector 桌面程序能够转换十六进制/十进制值.桌面程序还支持局 ...

  10. jQuery图表开源软件

    jQuery图表插件 jQchart jQchart 是一个jQuery的插件,用来绘制图表的.支持各种形状的图表. 示例代码: == Mini sample == $('#canvasMyID'). ...