RupengPager.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Text;
  6. using System.Diagnostics;
  7. namespace Ant.Service.Common
  8. {
  9. /// <summary>
  10. /// 分页组件调用实例
  11. /// var pager = new Common.RupengPager();
  12. /// pager.UrlFormat = "测试分页.aspx?pagenum={n}";//设置分页URL
  13. /// pager.PageSize = 10; //设置每页显示个数
  14. /// pager.TryParseCurrentPageIndex(Request["pagenum"]);//获取当前页数
  15. /// int startRowIndex = (pager.CurrentPageIndex - 1) * pager.PageSize;//开始行号计算
  16. /// So_KeywordLogBLL bll = new So_KeywordLogBLL();//获取分页数据
  17. /// pager.TotalCount = bll.GetTotalCount();//计算总个数
  18. /// Repeater1.DataSource = bll.GetPagedData(startRowIndex, startRowIndex + pager.PageSize - 1); //设置数据绑定
  19. /// Repeater1.DataBind();
  20. /// PagerHTML = pager.Render();//渲染页码条HTML
  21. /// </summary>
  22. public class RupengPager
  23. {
  24. /// <summary>
  25. /// 总数据条数
  26. /// </summary>
  27. public int TotalCount { get; set; }
  28. /// <summary>
  29. /// 每页数据条数
  30. /// </summary>
  31. public int PageSize { get; set; }
  32. /// <summary>
  33. /// 当前页码(从1开始)
  34. /// </summary>
  35. public int CurrentPageIndex { get; set; }
  36. /// <summary>
  37. /// 显示出来最多的页码数量,因为假设有100页,不可能把100页都显示到界面上
  38. /// </summary>
  39. public int MaxPagerCount { get; set; }
  40. /// <summary>
  41. /// 页码链接的地址格式,页码用{n}占位。
  42. /// </summary>
  43. public string UrlFormat { get; set; }
  44. /// <summary>
  45. /// 默认初始化
  46. /// </summary>
  47. public RupengPager()
  48. {
  49. PageSize = 10;
  50. MaxPagerCount = 10;
  51. }
  52. /// <summary>
  53. /// 尝试从字符串pn中解析当前页面赋值给CurrentPageIndex
  54. /// </summary>
  55. /// <param name="pn"></param>
  56. public void TryParseCurrentPageIndex(string pn)
  57. {
  58. int temp;
  59. if (int.TryParse(pn, out temp))
  60. {
  61. CurrentPageIndex = temp;
  62. }
  63. else
  64. {
  65. CurrentPageIndex = 1;
  66. }
  67. }
  68. /// <summary>
  69. /// 创建页码链接
  70. /// </summary>
  71. /// <param name="i">页码</param>
  72. /// <param name="text">链接文本</param>
  73. /// <returns></returns>
  74. private string GetPageLink(int i,string text)
  75. {
  76. StringBuilder sb = new StringBuilder();
  77. string url = UrlFormat.Replace("{n}", i.ToString());
  78. sb.Append("<a href='").Append(url).Append("'>").Append(text).Append("</a>");
  79. return sb.ToString();
  80. }
  81. public string Render()
  82. {
  83. StringBuilder sb = new StringBuilder();
  84. //TotalCount=35,PageSize=10,pageCount=4
  85. //计算总页数,如果是30条,则是3页,31条也是3页,29条也是3页,因此是
  86. //天花板运算Ceiling
  87. double tempCount = TotalCount / PageSize;
  88. int pageCount = (int)Math.Ceiling(tempCount);
  89. //计算显示的页码数(当总页码大于MaxPagerCount)的起始页码
  90. int visibleStart = CurrentPageIndex-MaxPagerCount/2;
  91. if (visibleStart <1)
  92. {
  93. visibleStart = 1;
  94. }
  95. //计算显示的页码数(当总页码大于MaxPagerCount)的起始页码
  96. int visibleEnd = visibleStart + MaxPagerCount;
  97. //显示最多MaxPagerCount条
  98. //如果算出来的结束页码大于总页码的话则调整为最大页码
  99. if (visibleEnd >pageCount)
  100. {
  101. visibleEnd = pageCount;
  102. }
  103. if (CurrentPageIndex > 1)
  104. {
  105. sb.Append(GetPageLink(1, "首页"));
  106. sb.Append(GetPageLink(CurrentPageIndex - 1, "上一页"));
  107. }
  108. else
  109. {
  110. sb.Append("<span>首页</span>");
  111. //如果没有上一页了,则只显示一个上一页的文字,没有超链接
  112. sb.Append("<span>上一页</span>");
  113. }
  114. //绘制可视的页码链接
  115. for (int i = visibleStart; i <= visibleEnd; i++)
  116. {
  117. //当前页不是超链接
  118. if (i == CurrentPageIndex)
  119. {
  120. sb.Append("<span>").Append(i).Append("</span>");
  121. }
  122. else
  123. {
  124. sb.Append(GetPageLink(i,i.ToString()));
  125. }
  126. }
  127. if (CurrentPageIndex < pageCount)
  128. {
  129. sb.Append(GetPageLink(CurrentPageIndex + 1, "下一页"));
  130. sb.Append(GetPageLink(pageCount + 1, "末页"));
  131. }
  132. else
  133. {
  134. sb.Append("<span>下一页</span>");
  135. sb.Append("<span>末页</span>");
  136. }
  137. return sb.ToString();
  138. }
  139. }
  140. }