桂林网站建设
您的位置: 首页> asp.net

我要叫喊

学习本类知识需要注意某些知识点,它们之间有些关联

      技术文档
      本站业务
      本类热点
  1. DateTime.ToStrin...
  2. asp.net中的日历控...
  3. win2003服务器asp对...
  4. asp.net C# cookie清...
  5. ASP读写cookie的...
  6. ASP和ASP.NE...
  7. asp和asp.net共享s...
  8. between "Chinese_P...
  9. 比较详细的Data...
  10. datalist嵌套datali...
ASP.Net分页控件发布

  由于.net自带的分页功能极其死板,自定义性不强不能满足需求,俺花了一个多星期的时间 写成的一个.net分页控件。

  特性:

  1、支持datagrid,datalist等分种数据显示控件,理论上只要有datasource的控件都可以

  2、支持url方式分页,url分页的每一页都可以被搜索引擎搜到,并且支持url重写

  3、控件样式可自定义

  4、封装完全,使用过程序只需写一行代码

 

/******************************************************************
 2 ** 文件名:Pager.cs
 3 ** 创建人:杨响武
 4 ** 日 期:2005年7月27日
 5 ** 修改人:
 6 ** 日 期:
 7 ** 描 述:
 8 **
 9 **----------------------------------------------------------------
******************************************************************/

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
    }
}

  在页面上只需要向下面这样写:

1 <%@ Control Language="c#" %>
2 <%@ Register TagPrefix="Anchor" Namespace="MyCompany.Controls" Assembly="MyCompany.Controls" %>
3 <ANCHOR:PAGER id="Pager1" runat="server"></ANCHOR:PAGER>