小巧精致的ASP.Net分页控件

view plaincopy to clipboardprint?

  1. using System;
  2. using System.Data;
  3. using System.Configuration;
  4. using System.Collections;
  5. using System.Web;
  6. using System.Web.Security;
  7. using System.Web.UI;
  8. using System.Web.UI.WebControls;
  9. using System.Web.UI.WebControls.WebParts;
  10. using System.Web.UI.HtmlControls;
  11. using System.Text;
  12. using System.Text.RegularExpressions;
  13. namespace MyTest
  14. {
  15. public partial class PageShow : System.Web.UI.UserControl
  16. {
  17. #region 私有成员
  18. /// <summary>
  19. /// 当前页的页码的背景色
  20. /// </summary>
  21. privatestring _color = "#a8ceff";
  22. /// <summary>
  23. /// 总记录数
  24. /// </summary>
  25. privateint _recTotal = 0;
  26. /// <summary>
  27. /// 每页显示的记录数, 默认为10
  28. /// </summary>
  29. privateint _pageSize = 10;
  30. /// <summary>
  31. /// 当前页的页码左右要显示的页码的个数, 默认7个
  32. /// </summary>
  33. privateint _pageShowNum = 7;
  34. #endregion
  35. #region 公共属性
  36. /// <summary>
  37. /// 设置或读取总记录数,不能小于0
  38. /// </summary>
  39. publicint RecTotal
  40. {
  41. get { return _recTotal; }
  42. set
  43. {
  44. if (value > 0)
  45. _recTotal = value;
  46. }
  47. }
  48. /// <summary>
  49. /// 设置或读取每页显示的记录数,不能小于0
  50. /// </summary>
  51. publicint PageSize
  52. {
  53. get { return _pageSize; }
  54. set
  55. {
  56. if (value > 0)
  57. _pageSize = value;
  58. }
  59. }
  60. /// <summary>
  61. /// 读取总页数
  62. /// </summary>
  63. publicint PageTotal
  64. {
  65. get {
  66. int total = (int)Math.Ceiling((double)_recTotal / _pageSize);
  67. return total;
  68. //return PageTotal;
  69. }
  70. }
  71. /// <summary>
  72. /// 读取当前要显示第几页,注:页码传递方式是Request.QueryString["page"]
  73. /// </summary>
  74. publicint PageIndex
  75. {
  76. get
  77. {
  78. int pageIndex = 1;
  79. string tmp = Request.QueryString["page"];
  80. if (tmp != null && tmp != string.Empty)
  81. {
  82. if (tmp == "end")
  83. pageIndex = PageTotal;
  84. else
  85. {
  86. try
  87. {
  88. pageIndex = int.Parse(tmp);
  89. if (pageIndex > PageTotal)
  90. pageIndex = PageTotal;
  91. elseif (pageIndex < 1)
  92. pageIndex = 1;
  93. }
  94. catch (Exception)
  95. {
  96. pageIndex = 1;
  97. }
  98. }
  99. }
  100. return pageIndex;
  101. }
  102. }
  103. /// <summary>
  104. /// 设置或读取当前页的页码的背景色,默认为#a8ceff
  105. /// </summary>
  106. publicstring Color
  107. {
  108. get { return _color; }
  109. set { _color = value; }
  110. }
  111. /// <summary>
  112. /// 当前页的页码左右要显示的页码的个数,默认7个
  113. /// </summary>
  114. publicint PageShowNum
  115. {
  116. get { return _pageShowNum; }
  117. set { _pageShowNum = value; }
  118. }
  119. #endregion
  120. /// <summary>
  121. /// 重写Render事件,发送生成的分页Url
  122. /// </summary>
  123. /// <param name="writer"></param>
  124. protectedoverridevoid Render(HtmlTextWriter writer)
  125. {
  126. if (PageTotal <= 1)
  127. {//少于1页时,不显示
  128. return;
  129. }
  130. StringBuilder writeStr = new StringBuilder();
  131. #region 控件使用的CSS代码
  132. writeStr.Append(@"
  133. <style type='text/css'>.page_total {background-color: #F5FBFF; border: 1px solid #86B9D6; border-right: 0px solid #86B9D6; font-weight: bold; }
  134. .page_pages {background-color: #F5FBFF; border: 1px solid #86B9D6; margin-right:1px; vertical-align: middle; font-weight: bold; }
  135. .page_num {background-color: #FFFFFF; border: 1px solid #DEDEB8; margin-right:1px; vertical-align: middle; }
  136. a:hover.page_num {background-color: #F5FBFF; border: 1px solid #86B9D6; text-decoration: none; }
  137. .page_curpage { margin-right:1px; border: 1px solid #DEDEB8; vertical-align: middle; background-color: #FFFF80; color: #92A05A; font-weight: bold; }
  138. .page_bar { margin: 1px 0px; clear: both; }
  139. .page_bar a { float: left; padding: 1px 4px; font-size: 12px; text-decoration: none; }
  140. .page_redirect { background-color: #FFFFFF; border: 1px solid #DEDEB8; margin-right:1px; font-size: 12px !important; font-size: 13px; }
  141. a:hover.page_redirect { background-color: #F5FBFF; border: 1px solid #86B9D6; text-decoration: none; }
  142. </style>");
  143. #endregion
  144. writeStr.Append("<table cellspacing='0' cellpadding='0' align='left' >");
  145. writeStr.Append("<tr><td valign='bottom'>");
  146. writeStr.Append("<div class='page_bar'>");
  147. writeStr.Append("<a class='page_total' title='记录总数'> " + _recTotal.ToString() + " </a>");
  148. writeStr.Append("<a class='page_pages' title='当前页/总页数'> " + PageIndex + "/" + PageTotal + " </a>");
  149. string url = GetUrl().ToLower();//取得当前页面的完整URL
  150. string tmp;
  151. //没有page时,加一个page, 方便后面替换
  152. if (url.IndexOf("page=") < 0)
  153. {
  154. url = url + ((url.IndexOf("?") < 0) ? "?" : "&") + "page=1";
  155. }
  156. //设定正则表达式,用于替换url中的page=字符串
  157. Regex my = new Regex(@"(page=[0-9]*(end)*)", RegexOptions.IgnoreCase);
  158. #region 如果当前是指定显示个数的页码之后的页时,加上到第一页和上一页的链接(此时页面不会显示页码1)
  159. if (PageIndex > _pageShowNum + 1)
  160. {
  161. //第一页
  162. tmp = my.Replace(url, "page=1");
  163. writeStr.Append("<a class='page_redirect' href='" + tmp + "' title='第一页'>|<</a>");
  164. //上一页
  165. tmp = my.Replace(url, "page=" + (PageIndex - 1).ToString());
  166. writeStr.Append("<a class='page_redirect' href='" + tmp + "' title='上一页'><</a>");
  167. }
  168. #endregion
  169. //总共显示( _pageShowNum * 2 + 1 )页的链接,从当前页往前_pageShowNum页,往前不足_pageShowNum页时,后面的页数增加.
  170. int countPage = 0;//用于统计是否超过( _pageShowNum * 2 + 1 )页
  171. int loopStart;
  172. //当总页数大于( _pageShowNum * 2 + 1 ),且当前页为最后_pageShowNum页时,保持页面页码数不少于( _pageShowNum * 2 + 1 )
  173. if (PageTotal - PageIndex >= _pageShowNum)
  174. {
  175. // 总页数 减 当前页码 大于等于左边要显示的个数时,循环 从当前页码 大于等于左边要显示的个数 开始
  176. loopStart = PageIndex - _pageShowNum;
  177. }
  178. else
  179. {
  180. loopStart = PageTotal - _pageShowNum * 2;// PageIndex - _pageShowNum - (_pageShowNum - PageTotal + PageIndex) ==> PageTotal - _pageShowNum * 2
  181. }
  182. for (int loop = loopStart; loop <= PageTotal; loop++)
  183. {
  184. if (loop < 1)
  185. continue;
  186. else
  187. countPage++;
  188. #region 已经显示了( _pageShowNum * 2 + 1 )页 并且 当前页数小于等于总页数时,加上到最末页和上一页的链接并退出循环(不会显示最后1页的页码时)
  189. if (countPage > (_pageShowNum * 2 + 1) && loop <= PageTotal)
  190. {
  191. //下一页
  192. tmp = my.Replace(url, "page=" + (PageIndex + 1).ToString());
  193. writeStr.Append("<a class='page_redirect' href='" + tmp + "' title='下一页'>></a>");
  194. //最终页
  195. tmp = my.Replace(url, "page=" + PageTotal.ToString());// my.Replace(url, "page=end");
  196. writeStr.Append("<a class='page_redirect' href='" + tmp + "' title='最末页'>>|</a>");
  197. break;
  198. }
  199. #endregion
  200. #region 添加当前循环页的链接
  201. if (loop == PageIndex)
  202. {//当前页
  203. writeStr.Append("<a class='page_curpage' + _color + "'>" +
  204. loop.ToString() + "</a>");// + (loop > 99 ? (width + 5).ToString() : width.ToString()) + "px;'
  205. }
  206. else
  207. {
  208. //计算下一页的链接
  209. tmp = my.Replace(url, "page=" + loop.ToString());
  210. writeStr.Append("<a class='page_num' href='" + tmp + "' title='第" +
  211. loop.ToString() + "页''>" + loop.ToString() + "</a>");
  212. }
  213. #endregion
  214. }
  215. writeStr.Append("</div></td></tr></table>");
  216. writer.Write(writeStr.ToString());
  217. }
  218. /// <summary>
  219. /// 获取当前页面的完整URL地址信息
  220. /// </summary>
  221. /// <returns></returns>
  222. publicstring GetUrl()
  223. {
  224. string url;
  225. url = System.Web.HttpContext.Current.Request.ServerVariables["SERVER_NAME"];
  226. if (System.Web.HttpContext.Current.Request.ServerVariables["SERVER_PORT"] != "80")
  227. url += ":" + System.Web.HttpContext.Current.Request.ServerVariables["SERVER_PORT"];
  228. //strTemp = strTemp & CheckStr(Request.ServerVariables("URL"))
  229. url += System.Web.HttpContext.Current.Request.ServerVariables["SCRIPT_NAME"];
  230. if (!(System.Web.HttpContext.Current.Request.QueryString == null || System.Web.HttpContext.Current.Request.QueryString.ToString() == ""))
  231. {
  232. url += "?" + System.Web.HttpContext.Current.Request.QueryString.ToString();
  233. }
  234. string https = System.Web.HttpContext.Current.Request.ServerVariables["HTTPS"];
  235. if (https == null || https == string.Empty || https == "off")
  236. {
  237. url = "http://" + url;
  238. }
  239. else
  240. {
  241. url = "https://" + url;
  242. }
  243. return url;
  244. }
  245. }
  246. }

具体的控件代码如下,在你的VS.Net里新建一个用户控件,然后把下面的代码拷贝进去就可以用了,最下面是使用示