KCMT开源控件之--方便简洁的分页控件2011-11-13 博客园 4inworkKMCT名字的由来,这是我在Blog中的第一篇关于控件的文章,在此我将对我的控件做一个申明,控件 名字以我的Blog名字各项的首字母命名(Keyboard,Mouse,Cigarette,Tea )希望大家在以后看我的控件的 时候能想到我的Blog。同时我选择了开源,开源更能促进技术的发展,也更能到达资源共享的目的。废话少说、直接进入主题,今天整理的是分页控件,这个控件诞生将近一年了,是我和我的一个同事 共同开发,现在被广泛用于公司的各个项目中。控件基于.net 2.0 开发。先从宏观上分析一下分页控件:作为分页控件应该具有每一页的大小(Pagesize)、总页数 (TotalPage)等属性。从实现上说我们在以前的分页过程中都是像这样传递参数xxxx.aspx?page=1,那么我们只要改变page 参数的值便可以实现分页的效果,因此我们只需要继承System.Web.UI.Control控件并重写Render()方法 即可实现该功能。贴出代码:
using System;using System.Text;using System.Text.RegularExpressions;namespace KMCT.Control{ /// <summary> /// 该控件为分页控件,其特点是分页方便,轻量级 /// </summary> public class Pager : System.Web.UI.Control { private int _pageSize, _totalPage; private static readonly Regex RX; private string query; private int curretPage; private int myTotalPage; //Filed public int TotalPage { get { return _totalPage; } set { _totalPage = value; } } public int PageSize { get { return _pageSize; } set { _pageSize = value; } } static Pager() { RX = new Regex(@"^&page=d+", RegexOptions.Compiled); } public Pager() { query = Context.Request.Url.Query.Replace("?", "&"); query = RX.Replace(query, string.Empty); string myPage = Context.Request["page"]; if (string.IsNullOrEmpty(myPage)) curretPage = 0; else { try { curretPage = int.Parse(myPage); } catch { Context.Response.Redirect(Regex.Replace(Context.Request.Url.ToString(), @"page=[^&]+", "page=0")); } } } protected override void Render(System.Web.UI.HtmlTextWriter writer) { if ((this._totalPage % this._pageSize) == 0) { myTotalPage = this._totalPage / this._pageSize; } else myTotalPage = this._totalPage / this._pageSize + 1; string str = "<div class="digg">"; if (this._pageSize > this._totalPage) { str += ""; } else { if (this._totalPage <= this._pageSize * 10) { if (this.curretPage == 0) str += "<span class="disabled"> < </span>"; else str += "<a href="?page=" + (curretPage - 1) + this.query + ""> < </a>"; for (int i = 0; i < myTotalPage; i++) { if (curretPage == i) str += "<span class="current">" + (i + 1) + "</span>"; else str += "<a href="?page=" + i + this.query + "">" + (i + 1) + "</a>"; } if (this.curretPage < myTotalPage - 1) str += "<a href="?page=" + (curretPage + 1) + this.query + ""> > </a>"; else str += "<span class="disabled"> > </span>"; } else { if (this.curretPage == 0) str += "<span class="disabled"> < </span>"; else str += "<a href="?page=" + (curretPage - 1) + this.query + ""> < </a>"; if (this.curretPage < 4) { for (int i = 0; i < 5; i++) { if (curretPage == i) str += "<span class="current">" + (i + 1) + "</span>"; else str += "<a href="?page=" + i + this.query + "">" + (i + 1) + "</a>"; } str += "<a href="?page=" + myTotalPage + this.query + "">" + myTotalPage + "</a>"; } else if (this.curretPage >= 4 && this.curretPage < myTotalPage - 6) { str += "<a href="?page=1" + this.query + "">1</a>"; for (int i = -2; i < 3; i++) { if (i == 0) str += "<span class="current">" + (this.curretPage + 1) + "</span>"; else str += "<a href="?page=" + (this.curretPage + i) + this.query + "">" + (this.curretPage + 1 + i) + "</a>"; } str += "<a href="?page=" + (myTotalPage - 1) + this.query + "">" + myTotalPage + "</a>"; } else if (curretPage > myTotalPage + 1) { Context.Response.Redirect(Regex.Replace(Context.Request.Url.ToString(), @"page=d+", "page=" + (myTotalPage - 1))); } else { str += "<a href="?page=1" + this.query + "">1</a>"; for (int i = 6; i > 0; i--) { if (curretPage == myTotalPage - i) str += "<span class="current">" + (myTotalPage - i + 1) + "</span>"; else str += "<a href="?page=" + (myTotalPage - i) + this.query + "">" + (myTotalPage - i + 1) + "</a>"; } } if (this.curretPage < myTotalPage - 1) str += "<a href="?page=" + (curretPage + 1) + this.query + ""> > </a>"; else str += "<span class="disabled"> > </span>"; } } str += "</div>"; writer.Write(str); } }}