http://blog.csdn.net/JavaProgramers/archive/2006/08/09/1042278.aspx
由于.net自带的分页功能极其死板,自定义性不强不能满足需求
俺花了一个多星期的时间 写成的一个.net分页控件

特性:
1、支持datagrid,datalist等分种数据显示控件,理论上只要有datasource的控件都可以
2、支持url方式分页,url分页的每一页都可以被搜索引擎搜到,并且支持url重写
3、控件样式可自定义
4、封装完全,使用过程序只需写一行代码

 /******************************************************************
 ** 文件名:Pager.cs
 ** 创建人:杨响武
 ** 日 期:2005年7月27日
 ** 修改人:
 ** 日 期:
 ** 描 述:
 **
 **----------------------------------------------------------------
 ******************************************************************/
 
 using System;
 using System.Web.UI.WebControls;
 using System.Web.UI.HtmlControls;
 using System.Web;
 using System.Web.UI;
 using System.Text.RegularExpressions;
 
 namespace MyCompany.Controls
 {
     /// <summary>
     /// 分页控件
     /// </summary>
     public class Pager : Label, INamingContainer
     {
         #region 成员变量和构造函数
         HttpContext context = HttpContext.Current;
         Label countLabel;
         HyperLink previousButton;
         HyperLink nextButton;
         HyperLink firstButton;
         HyperLink lastButton;
         HyperLink[] pagingLinkButtons;
        
         public override ControlCollection Controls
         {
             get
             {
                 EnsureChildControls();
                 return base.Controls;
             }
         }
 
         protected override void CreateChildControls()
         {
             Controls.Clear();
 
             AddCountLabel();
 
             AddPageButtons();
 
             AddPreviousNextHyperLinks();
 
             AddFirstLastHyperLinks();
         }
         #endregion
 
         #region 呈现方法
         protected override void Render(HtmlTextWriter writer)
         {
 //            修改总页数小于等于1的时候不呈现任何控件
 //            int totalPages = CalculateTotalPages();
 //
 //            if (totalPages <= 1)
 //                return;
 
             AddAttributesToRender(writer);
 
             writer.AddAttribute(HtmlTextWriterAttribute.Class, this.CssClass, false);
 
             RenderCountLabel(writer);
 
             RenderFirst(writer);
 
             RenderPrevious(writer);
 
             RenderPagingButtons(writer);
            
             RenderNext(writer);
 
             RenderLast(writer);
         }
 
         void RenderCountLabel(HtmlTextWriter writer)
         {
             countLabel.RenderControl(writer);
 
             LiteralControl l = new LiteralControl("&nbsp;");
             l.RenderControl(writer);
         }
 
         void RenderFirst (HtmlTextWriter writer)
         {
             firstButton.RenderControl(writer);
 
             LiteralControl l = new LiteralControl("&nbsp;");
             l.RenderControl(writer);
         }
 
         void RenderLast (HtmlTextWriter writer)
         {
             lastButton.RenderControl(writer);
 
             LiteralControl l = new LiteralControl("&nbsp;");
             l.RenderControl(writer);
         }
 
         void RenderPrevious (HtmlTextWriter writer)
         {
             previousButton.RenderControl(writer);
 
             LiteralControl l = new LiteralControl("&nbsp;");
             l.RenderControl(writer);
         }
 
         void RenderNext(HtmlTextWriter writer)
         {
             nextButton.RenderControl(writer);
 
             LiteralControl l = new LiteralControl("&nbsp;");
             l.RenderControl(writer);
         }
 
         private void RenderButtonRange(int start, int end, HtmlTextWriter writer)
         {
             for (int i = start; i < end; i++)
             {
                 if (PageIndex == i)
                 {
                     Literal l = new Literal();
                     l.Text = "<font color =red>" + (i + 1).ToString() + "</font>";
 
                     l.RenderControl(writer);
                 }
                 else
                 {
                     pagingLinkButtons[i].RenderControl(writer);
                 }
                 if (i < (end - 1))
                     writer.Write("&nbsp;");
             }
 
             LiteralControl l1 = new LiteralControl("&nbsp;");
             l1.RenderControl(writer);
         }
 
         private void RenderPagingButtons(HtmlTextWriter writer)
         {
             int totalPages;
 
             totalPages = CalculateTotalPages();
 
             if (totalPages <= 10)
             {
                 RenderButtonRange(0, totalPages, writer);
             }
             else
             {
                 int lowerBound = (PageIndex - 4);
                 int upperBount = (PageIndex + 6);
 
                 if (lowerBound <= 0)
                     lowerBound = 0;
 
                 if (PageIndex <= 4)
                     RenderButtonRange(0, 10, writer);
 
                 else if (PageIndex < (totalPages - 5))
                     RenderButtonRange(lowerBound, (PageIndex + 6), writer);
 
                 else if (PageIndex >= (totalPages - 5))
                     RenderButtonRange((totalPages - 10), totalPages, writer);
             }
         }
 
         #endregion
 
         #region 控件树方法
         /// <summary>
         /// 信息标签
         /// </summary>
         void AddCountLabel()
         {
             countLabel = new Label();
             countLabel.ID = "countLabel";
             countLabel.Text = string.Format(text, CalculateTotalPages().ToString("n0"));
 
             Controls.Add(countLabel);
         }
 
         private void AddPageButtons()
         {
             pagingLinkButtons = new HyperLink[CalculateTotalPages()];
 
             for (int i = 0; i < pagingLinkButtons.Length; i++)
             {
                 pagingLinkButtons[i] = new HyperLink();
                 pagingLinkButtons[i].EnableViewState = false;
                 pagingLinkButtons[i].Text = (i + 1).ToString();
                 pagingLinkButtons[i].ID = i.ToString();
                 pagingLinkButtons[i].CssClass = linkCss;
                 pagingLinkButtons[i].NavigateUrl = GetHrefString(i);
 
                 Controls.Add(pagingLinkButtons[i]);
             }
         }
 
         /// <summary>
         /// 首页末页
         /// </summary>
         void AddFirstLastHyperLinks()
         {
             firstButton = new HyperLink();
             firstButton.ID = "First";
             firstButton.Text = "首页";
             if(PageIndex != 0 && CalculateTotalPages() > 0)
             {
                 firstButton.NavigateUrl = GetHrefString(0);
             }
             else
             {
                 firstButton.Enabled = false;
             }
            
             Controls.Add(firstButton);
 
             lastButton = new HyperLink();
             lastButton.ID = "Last";
             lastButton.Text = "末页";
             if(PageIndex != CalculateTotalPages() - 1)
             {
                 lastButton.NavigateUrl = GetHrefString(CalculateTotalPages() - 1);
             }
             else
             {
                 lastButton.Enabled = false;
             }
             Controls.Add(lastButton);
         }
 
         /// <summary>
         /// 上一页下一页
         /// </summary>
         void AddPreviousNextHyperLinks()
         {
             previousButton = new HyperLink();
             previousButton.ID = "Prev";
             previousButton.Text = "上一页";
             if (HasPrevious)
             {
                 previousButton.NavigateUrl = GetHrefString(PageIndex - 1);
             }
             else
             {
                 previousButton.Enabled = false;
             }
             Controls.Add(previousButton);
 
             nextButton = new HyperLink();
             nextButton.ID = "Next";
             nextButton.Text = "下一页";
             if(HasNext)
             {
                 nextButton.NavigateUrl = GetHrefString(PageIndex + 1);
             }
             else
             {
                 nextButton.Enabled = false;
             }
             Controls.Add(nextButton);
         }
         #endregion
 
         #region 私有属性
         private bool HasPrevious
         {
             get
             {
                 if (PageIndex > 0)
                     return true;
 
                 return false;
             }
         }
 
         private bool HasNext
         {
             get
             {
                 if (PageIndex + 1 < CalculateTotalPages() )
                     return true;
 
                 return false;
             }
         }
         #endregion
 
         #region 帮助方法和公共属性
        
         /// <summary>
         /// 获取分页导航按钮的超链接字符串
         /// </summary>
         /// <param name="pageIndex">该分页按钮相对应的页索引</param>
         /// <returns>分页导航按钮的超链接字符串</returns>
         private string GetHrefString(int pageIndex)
         {
             string url = Page.Request.RawUrl;
 
             if (Regex.IsMatch(url, @"(\d+).shtml", RegexOptions.IgnoreCase))
             {
                 url = Regex.Replace(url, @"(\d+).shtml", pageIndex + ".shtml");
             }
 
             if (Regex.IsMatch(url, @"PageIndex=(\d+)", RegexOptions.IgnoreCase))
             {
                 url = Regex.Replace(url, @"PageIndex=(\d+)", "PageIndex=" + pageIndex.ToString());
             }
 
             return Page.Server.UrlPathEncode(url);
         }
 
         public int CalculateTotalPages()
         {
             int totalPagesAvailable;
 
             if (TotalRecords == 0)
                 return 0;
 
             totalPagesAvailable = TotalRecords / PageSize;
 
             if ((TotalRecords % PageSize) > 0)
                 totalPagesAvailable++;
 
             return totalPagesAvailable;
         }
 
         /// <summary>
         /// 当前页
         /// </summary>
         public int PageIndex
         {
             get
             {
                 int _pageIndex = 0;
 
                 if ((!Page.IsPostBack) && (context.PageIndex > 0))
                     _pageIndex = context.PageIndex;
                 else
                     _pageIndex = Convert.ToInt32(ViewState["PageIndex"]);
 
                 if (_pageIndex < 0)
                     return 0;
                 else
                 {
                     if (_pageIndex > CalculateTotalPages()-1)
                         return CalculateTotalPages()-1;
                     else
                         return _pageIndex;
                 }
             }
             set
             {
                 ViewState["PageIndex"] = value;
             }
         }
 
         /// <summary>
         /// 每页记录数
         /// </summary>
         public int PageSize
         {
             get
             {
                 int pageSize = Convert.ToInt32(ViewState["PageSize"]);
 
                 if (pageSize == 0)
                 {
                     return 10;
                 }
 
                 return pageSize;
             }
             set
             {
                 ViewState["PageSize"] = value;
             }
 
         }
 
         /// <summary>
         /// 总记录数
         /// </summary>
         public int TotalRecords
         {
             get
             {
                 return Convert.ToInt32(ViewState["TotalRecords"]);
             }
             set
             {
                 ViewState["TotalRecords"] = value;
             }
         }
 
         private string text = "共{0}页";
 
         private string linkCss = "";
         /// <summary>
         /// 链接样式
         /// </summary>
         public string LinkCss
         {
             get { return linkCss; }
             set { linkCss = value;}
         }
 
         private string textCss = "";
         /// <summary>
         /// 文字样式
         /// </summary>
         public string TextCss
         {
             get { return textCss; }
             set { textCss = value;}
         }
 
         public string TextFormat
         {
             get
             {
                 return text;
             }
             set
             {
                 text = value;
             }
         }
 
         #endregion
     }
 }
 
 在页面上只需要向下面这样写:
 <%@ Control Language="c#" %>
 <%@ Register TagPrefix="Anchor" Namespace="MyCompany.Controls" Assembly="MyCompany.Controls" %>
 <ANCHOR:PAGER id="Pager1" runat="server"></ANCHOR:PAGER>
   

 

posted on 2007-01-12 15:53  mbskys  阅读(161)  评论(0)    收藏  举报