去年就发表过asp.net 分页-利用后台直接生成html分页 ,那种方法只是单纯的实现了分页,基本不能使用,那时就想写个自己的分页控件,无奈能力有限。最近有点时间了,就自己做出了这个分页控件。我承认,这个控件参考了别人的,但是其实里面的原理都相同,差异只是展现方式而已。

  去年就在做一个自己的后台系统,刚开始用的asp.net,做了一部分就没有做了,因为缺少权限控制类别。后面转为用asp.net mvc4做,也只是做了一部分,觉得不太方便,也许是我不太会用。再用ajax+ashx做了一部分,虽然体验不错,但是我还是放弃了,比起纯正的asp.net还是麻烦多了。我要做的系统不是很大,觉得用asp.net很方便,权限控制,通用控件可以加快步伐。所以我决定先做出来再说,怎么简单怎么做。

展示效果

属性解释:

Css:定义div和链接等的样式

SelectCss:当前选择的链接样式

CssEnable:本来想做一个默认的样式,但是感觉需要不大,所以这个属性暂时无用

PageSize:每页显示的数据条数

PreNextVisable:上一页和下一页的显示,默认为显示

TotalVisable:显示总数,默认为不显示,图上显示错误:共{0}笔

运行效果:

实现过程

  1. //****************************************************************************************
  2. //作者:轻狂书生
  3. //博客地址:http://www.cnblogs.com/xiaoshuai1992
  4. //create: 2014/5/5
  5. //功能:分页控件的实现
  6. //使用方法:正常控件使用方法
  7. //*****************************************************************************************
  8.  
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Linq;
  12. using System.Web;
  13. using System.Web.UI;
  14. using System.ComponentModel;
  15. [assembly: TagPrefix("XS.Framework.Control", "xs")]
  16. namespace pageControl
  17. {
  18. public class PageChangedEventArgs : EventArgs
  19. {
  20. int ITotalCount = ;
  21. int ICurrentPage = ;
  22. int IPageSize = ;
  23. public int ECurrentPage
  24. {
  25. get { return ICurrentPage; }
  26. set { ICurrentPage = value; }
  27. }
  28. public int ETotalCount
  29. {
  30. get { return ITotalCount; }
  31. set { ITotalCount = value; }
  32. }
  33. public int EPageSize
  34. {
  35. get { return IPageSize; }
  36. set { IPageSize = value; }
  37. }
  38. public PageChangedEventArgs(int curPage, int totalcount, int pageSize)
  39. {
  40. ECurrentPage = curPage;
  41. ETotalCount = totalcount;
  42. EPageSize = pageSize;
  43. }
  44. }
  45. public delegate void PageChangedEvent(object sender, PageChangedEventArgs e);
  46. public class xsPageControl : Control, IPostBackEventHandler
  47. {
  48. #region 属性
  49. string _preText = "上一页";
  50. string _nextText = "下一页";
  51. string _totalText = "共{0}笔";
  52. bool _totalVisable = false;//由于存在尾页号,总页数不是必须,故这里我设置默认为不打开
  53. bool _preNextVisable = true;
  54. int _pageSize = ;
  55. string _css = "xsPage";
  56. string _selectCss = "xsSelect";
  57. bool _cssEnable = true;
  58. int ITotalCount = ;
  59. int ICurrentPage = ;
  60.  
  61. [Category("Text")]
  62. public string PreText
  63. {
  64. get { return _preText; }
  65. set { _preText = value; }
  66. }
  67. [Category("Text")]
  68. public string NextText
  69. {
  70. get { return _nextText; }
  71. set { _nextText = value; }
  72. }
  73. [Category("Text")]
  74. public string TotalText
  75. {
  76. get { return _totalText; }
  77. set { _totalText = value; }
  78. }
  79. [Category("Text")]
  80. public bool TotalVisable
  81. {
  82. get { return _totalVisable; }
  83. set { _totalVisable = value; }
  84. }
  85. [Category("Text")]
  86. public bool PreNextVisable
  87. {
  88. get { return _preNextVisable; }
  89. set { _preNextVisable = value; }
  90. }
  91.  
  92. [Category("Size")]
  93. public int PageSize
  94. {
  95. get { return _pageSize; }
  96. set { _pageSize = value; }
  97. }
  98. [Category("CSS")]
  99. public string Css
  100. {
  101. get { return _css; }
  102. set { _css = value; }
  103. }
  104. [Category("CSS")]
  105. public string SelectCss
  106. {
  107. get { return _selectCss; }
  108. set { _selectCss = value; }
  109. }
  110. [Category("CSS")]
  111. /// <summary>
  112. /// 是否使用默认CSS,自定义CSS无效
  113. /// </summary>
  114. public bool CssEnable
  115. {
  116. get { return _cssEnable; }
  117. set { _cssEnable = value; }
  118. }
  119. [Browsable(false)]
  120. public int CurrentPage
  121. {
  122. set { ICurrentPage = value; }
  123. }
  124. [Browsable(false)]
  125. public int TotalPage
  126. {
  127. get
  128. {
  129. int tpage = ;
  130. if (PageSize > )
  131. {
  132. tpage = (TotalCount % PageSize == ? TotalCount / PageSize : TotalCount / PageSize + );
  133. }
  134. return tpage;
  135.  
  136. }
  137. }
  138. [Browsable(false)]
  139. public int TotalCount
  140. {
  141. get { return ITotalCount; }
  142. set { ITotalCount = value; }
  143. }
  144. #endregion
  145.  
  146. public event PageChangedEvent PageChanged;
  147.  
  148. #region 效果呈现
  149. public override void RenderControl(HtmlTextWriter writer)
  150. {
  151. Render(writer);
  152. }
  153.  
  154. protected override void Render(HtmlTextWriter writer)
  155. {
  156. if (DesignMode)
  157. {
  158. writer.AddAttribute(HtmlTextWriterAttribute.Id, this.ClientID);
  159. writer.AddAttribute(HtmlTextWriterAttribute.Name, this.UniqueID);
  160. writer.AddAttribute(HtmlTextWriterAttribute.Class, Css);
  161. writer.RenderBeginTag(HtmlTextWriterTag.Div);
  162.  
  163. if (TotalVisable)
  164. {
  165. writer.RenderBeginTag(HtmlTextWriterTag.Span);
  166. writer.Write(string.Format(TotalText, ));
  167. writer.RenderEndTag();
  168. writer.Write("&nbsp;&nbsp;");
  169. }
  170. if (PreNextVisable)
  171. {
  172. writer.AddAttribute(HtmlTextWriterAttribute.Href, "#");
  173. writer.RenderBeginTag(HtmlTextWriterTag.A);
  174. writer.Write(PreText);
  175. writer.RenderEndTag();
  176. writer.Write("&nbsp;&nbsp;");
  177. }
  178. for (int i = ; i <= ; i++)
  179. {
  180. writer.AddAttribute(HtmlTextWriterAttribute.Href, "#");
  181. writer.RenderBeginTag(HtmlTextWriterTag.A);
  182. writer.Write(i.ToString());
  183. writer.RenderEndTag();
  184. writer.Write("&nbsp;&nbsp;");
  185. }
  186. if (PreNextVisable)
  187. {
  188. writer.AddAttribute(HtmlTextWriterAttribute.Href, "#");
  189. writer.RenderBeginTag(HtmlTextWriterTag.A);
  190. writer.Write(NextText);
  191. writer.RenderEndTag();
  192. writer.Write("&nbsp;&nbsp;");
  193. }
  194. writer.RenderEndTag();
  195. }
  196. else
  197. {
  198. writer.AddAttribute(HtmlTextWriterAttribute.Id, this.ClientID);
  199. writer.AddAttribute(HtmlTextWriterAttribute.Name, this.UniqueID);
  200. writer.AddAttribute(HtmlTextWriterAttribute.Class, Css);
  201. writer.RenderBeginTag(HtmlTextWriterTag.Div);
  202.  
  203. if (TotalVisable)
  204. {
  205. writer.RenderBeginTag(HtmlTextWriterTag.Span);
  206. writer.Write(string.Format(TotalText, ITotalCount));
  207. writer.RenderEndTag();
  208. }
  209. if (PreNextVisable && ICurrentPage != )
  210. {
  211. writer.AddAttribute(HtmlTextWriterAttribute.Href, "javascript:" + Page.ClientScript.GetPostBackEventReference(this, ICurrentPage - + ""));
  212. writer.RenderBeginTag(HtmlTextWriterTag.A);
  213. writer.Write(PreText);
  214. writer.RenderEndTag();
  215. }
  216. if (TotalPage <= )
  217. {
  218. for (int i = ; i <= TotalPage; i++)
  219. {
  220. if (i == ICurrentPage)
  221. {
  222. //添加当前选择的样式
  223. writer.AddAttribute(HtmlTextWriterAttribute.Class, SelectCss);
  224. }
  225. writer.AddAttribute(HtmlTextWriterAttribute.Href, "javascript:" + Page.ClientScript.GetPostBackEventReference(this, i + ""));
  226. writer.RenderBeginTag(HtmlTextWriterTag.A);
  227. writer.Write(i.ToString());
  228. writer.RenderEndTag();
  229. }
  230. }
  231. else
  232. {
  233. if (ICurrentPage - > && ICurrentPage + < TotalPage)//前后都有的
  234. {
  235. //添加第一页
  236. writer.AddAttribute(HtmlTextWriterAttribute.Href, "javascript:" + Page.ClientScript.GetPostBackEventReference(this, + ""));
  237. writer.RenderBeginTag(HtmlTextWriterTag.A);
  238. writer.Write("");
  239. writer.RenderEndTag();
  240.  
  241. writer.RenderBeginTag(HtmlTextWriterTag.Span);
  242. writer.Write("…");
  243. writer.RenderEndTag();
  244.  
  245. for (int i = ICurrentPage - ; i <= ICurrentPage + ; i++)
  246. {
  247. if (i == ICurrentPage)
  248. {
  249. //添加当前选择的样式
  250. writer.AddAttribute(HtmlTextWriterAttribute.Class, SelectCss);
  251. }
  252. writer.AddAttribute(HtmlTextWriterAttribute.Href, "javascript:" + Page.ClientScript.GetPostBackEventReference(this, i + ""));
  253. writer.RenderBeginTag(HtmlTextWriterTag.A);
  254. writer.Write(i.ToString());
  255. writer.RenderEndTag();
  256. }
  257. //添加最后一页
  258. writer.RenderBeginTag(HtmlTextWriterTag.Span);
  259. writer.Write("…");
  260. writer.RenderEndTag();
  261. writer.AddAttribute(HtmlTextWriterAttribute.Href, "javascript:" + Page.ClientScript.GetPostBackEventReference(this, TotalPage + ""));
  262. writer.RenderBeginTag(HtmlTextWriterTag.A);
  263. writer.Write(TotalPage.ToString());
  264. writer.RenderEndTag();
  265. }
  266. else if (ICurrentPage - <= )//前面不够,后面有多余
  267. {
  268. for (int i = ; i <= ; i++)
  269. {
  270. if (i == ICurrentPage)
  271. {
  272. //添加当前选择的样式
  273. writer.AddAttribute(HtmlTextWriterAttribute.Class, SelectCss);
  274. }
  275. writer.AddAttribute(HtmlTextWriterAttribute.Href, "javascript:" + Page.ClientScript.GetPostBackEventReference(this, i + ""));
  276. writer.RenderBeginTag(HtmlTextWriterTag.A);
  277. writer.Write(i.ToString());
  278. writer.RenderEndTag();
  279. }
  280. //添加最后一页
  281. writer.RenderBeginTag(HtmlTextWriterTag.Span);
  282. writer.Write("…");
  283. writer.RenderEndTag();
  284. writer.AddAttribute(HtmlTextWriterAttribute.Href, "javascript:" + Page.ClientScript.GetPostBackEventReference(this, TotalPage + ""));
  285. writer.RenderBeginTag(HtmlTextWriterTag.A);
  286. writer.Write(TotalPage.ToString());
  287. writer.RenderEndTag();
  288.  
  289. }
  290. else if (ICurrentPage + >= TotalPage)//前面多余,后面不足
  291. {
  292. //添加第一页
  293. writer.AddAttribute(HtmlTextWriterAttribute.Href, "javascript:" + Page.ClientScript.GetPostBackEventReference(this, + ""));
  294. writer.RenderBeginTag(HtmlTextWriterTag.A);
  295. writer.Write("");
  296. writer.RenderEndTag();
  297. writer.RenderBeginTag(HtmlTextWriterTag.Span);
  298. writer.Write("…");
  299. writer.RenderEndTag();
  300. for (int i = TotalPage - ; i <= TotalPage; i++)
  301. {
  302. if (i == ICurrentPage)
  303. {
  304. //添加当前选择的样式
  305. writer.AddAttribute(HtmlTextWriterAttribute.Class, SelectCss);
  306. }
  307. writer.AddAttribute(HtmlTextWriterAttribute.Href, "javascript:" + Page.ClientScript.GetPostBackEventReference(this, i + ""));
  308. writer.RenderBeginTag(HtmlTextWriterTag.A);
  309. writer.Write(i.ToString());
  310. writer.RenderEndTag();
  311. }
  312. }
  313.  
  314. }
  315. if (PreNextVisable && ICurrentPage != TotalPage && TotalPage > )
  316. {
  317. writer.AddAttribute(HtmlTextWriterAttribute.Href, "javascript:" + Page.ClientScript.GetPostBackEventReference(this, ICurrentPage + + ""));
  318. writer.RenderBeginTag(HtmlTextWriterTag.A);
  319. writer.Write(NextText);
  320. writer.RenderEndTag();
  321. }
  322. writer.RenderEndTag();
  323. }
  324. }
  325.  
  326. #endregion
  327.  
  328. /// <summary>
  329. /// 设置翻页
  330. /// </summary>
  331. /// <param name="gotoPage"></param>
  332. protected virtual void OnPageChanged(int gotoPage)
  333. {
  334. PageChangedEventArgs e = new PageChangedEventArgs(gotoPage, TotalCount, PageSize);
  335. if (this.PageChanged != null)
  336. {
  337. PageChanged(this, e);
  338. CurrentPage = e.ECurrentPage;
  339. TotalCount = e.ETotalCount;
  340. PageSize = e.EPageSize;
  341. }
  342. }
  343. public void RaisePostBackEvent(string eventArgument)
  344. {
  345. int gotopage = Convert.ToInt32(eventArgument);
  346. OnPageChanged(gotopage);
  347. }
  348.  
  349. /// <summary>
  350. /// 第一次进入页面需要显示调用
  351. /// </summary>
  352. public void StartShowPage()
  353. {
  354. OnPageChanged();
  355. }
  356. /// <summary>
  357. /// 删除或更新后可以直接刷新
  358. /// </summary>
  359. public void RefreshPage()
  360. {
  361. OnPageChanged(ICurrentPage);
  362. }
  363. }
  364. }

重要代码解释,其他可以看注释

1:控件继承自Control, IPostBackEventHandler

链接调用的为Page.ClientScript.GetPostBackEventReference()方法,点击时进入RaisePostBackEvent 方法

RaisePostBackEvent 方法实现接口IPostBackEventHandler,在进入页面时进入调用OnPageChanged()方法实现分页

2:PageChangedEventArgs 类

定义为PageChanged的参数,可以把当前的页数,总数,每页显示数带到页面进行查询,也可以在页面设置这些属性,实现控件的显示

页面使用

拖入控件,设置好属性,把要实现的数据查询和绑定写在pagechanged里面,参数里面包含了分页的参数(当前页数,每页显示数)

  1. protected void xsPageControl1_PageChanged(object sender, PageChangedEventArgs e)
  2. {
  3. }

进入页面地方使用

  1. xsPageControl1.StartShowPage();

页面数据修改或删除后刷新当页

  1. xsPageControl1.RefreshPage();

源码下载

pageControl.zip

以后还会对其进行修改和完善,也可以写一下类别配合其使用,这个控件没有与其他控件关联,也没用和数据库关联,可以自行对任意需要分页显示的控件进行分页。

20140508修改

几天的测试发现了里面的bug

当前页面的刷新会找不到当前的页数,是因为页面刷新后控件类重新生成,当前页面的值也就回到了原点。

所以我考虑把CurrentPage 这个属性变为用页面缓存进行保存,经测试成功

  1. public int CurrentPage
  2. {
  3. get { return Convert.ToInt32(ViewState[UniqueID + "xsCurrentPage"] == null ? : ViewState[UniqueID + "xsCurrentPage"]); }
  4. set { ViewState[UniqueID + "xsCurrentPage"] = value; }
  5. }

20140509修改

昨天发现了一个bug,如果数据有6条,每页显示5条。我这时选到第二页,删除第6条,调用RefreshPage()是当前页面记录的2,可是由于删除其实没有第二页了。

解决办法是在OnPageChanged 发生后判断总页数和当前页,如果当前页大于总页数,执行OnPageChanged(总页数)。这样可以解决,可是得查询2遍了

asp.net 分页-自己写分页控件的更多相关文章

  1. asp.net 弹出式日历控件 选择日期 Calendar控件

    原文地址:asp.net 弹出式日历控件 选择日期 Calendar控件 作者:逸苡 html代码: <%@ Page Language="C#" CodeFile=&quo ...

  2. jQuery Validate 验证,校验规则写在控件中的具体例子

    将校验规则写到控件中 <script src="../js/jquery.js" type="text/javascript"></scrip ...

  3. 自写JQ控件-树状菜单控件[demo下载]

    一个多月没有写博客了,最近也弄一个基于JQ的树状菜单控件,在此分享给大家.另外呢,通过这个例子分享一下怎么写JQ控件的. 事实上工作中,也是经常遇到的,有些时候自己想实现一些前端效果,用网上一些插件吧 ...

  4. ASP.NET MVC 中使用用户控件——转

    讲讲怎么在 ASP.NET MVC2中使用用户控件.首先我们新建一个用户控件,   我们命名为SelectGroup.ascx,代码如下 <%@ Control Language="C ...

  5. ASP.NET的面包屑导航控件、树形导航控件、菜单控件

    原文:http://blog.csdn.net/pan_junbiao/article/details/8579293 ASP.NET的面包屑导航控件.树形导航控件.菜单控件. 1. 面包屑导航控件— ...

  6. 分页技术之GridView控件

    GridView控件实现分页技术 第一步:设置GridView控件的属性,跟分页相关的属性设置如下: AllowPaging="true":允许分页, PageSize=" ...

  7. 使用Sql分页方法给Repeater控件分页的方法

    页面代码 <div class="bookList"> <asp:Repeater ID="rpBooks" runat="serv ...

  8. asp.net自带的异步刷新控件使用

    一直都是使用jquery的$.ajax,由于刚刚加入的公司是用asp.net的,webform与之前的ajax加在一起显得很混乱,后来发现asp.net已经封装了一下ajax功能,就查了一下,并且做了 ...

  9. Asp.Net 之 母版页中对控件ID的处理

    一.问题提出 由于总体排版和设计的需要,我们往往创建母版页来实现整个网站的统一性,最近我由于统一性的需要,把原来整个项目单独的页面全部套用了母版页.但是出现了一系列失效错误. 二. 抽象模型 由于整个 ...

随机推荐

  1. [转] - MC、MC、MCMC简述

    贝叶斯集锦(3):从MC.MC到MCMC 2013-07-31 23:03:39 #####一份草稿 贝叶斯计算基础 一.从MC.MC到MCMC 斯坦福统计学教授Persi Diaconis是一位传奇 ...

  2. [转载]触发ASSERT(afxCurrentResourceHandle != NULL)错误的原因

    触发ASSERT(afxCurrentResourceHandle != NULL)错误的原因 Debug Assert error afxwin1.inl line:22 翻译参考 http://w ...

  3. PHP如何关闭notice级别的错误提示

    1.在php.ini文件中改动error_reporting改为:error_reporting=E_ALL & ~E_NOTICE2.如果你不能操作php.ini文件,你可以使用如下方法在你 ...

  4. MVC VS2012 Code First 数据库迁移教程

    1.在“服务资源管理器”连接数据库 2.打开工具-Nuget程序包管理器“程序包管理器控制台” 3.控制台输入命令:PM> Enable-Migrations -StartUpProjectNa ...

  5. createElement,createTextNode,appendChild

    <html> <head> <meta charset="UTF-8"> <title></title> <scr ...

  6. git管理maven项目实现

    1,在自己的git网新建一个项目.复制项目的地址. 2.在合适的目录  执行 git clone命令,这样就把git的本地仓库建立好了. 3,java中 ,新建maven项目, 在location这里 ...

  7. java之数组(笔记)

    1.与c++不同的声明 int[] i, j; int i[], j; 这两种声明在c++中是同等的,但是在Java中,前者是声明两个,后者是只有i是数组. 2.数组可以看作是特殊的类 3.数组的cl ...

  8. angularJs内置指令63个

  9. [转]线性插值&双线性插值&三线性插值

    转自:http://www.cnblogs.com/yingying0907/archive/2012/11/21/2780092.html 內插是数学领域数值分析中的通过已知的离散数据求未知数据的过 ...

  10. LeetCode Best Time to Buy and Sell Stock with Cooldown

    原题链接在这里:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/ 题目: Say you hav ...