English versionEnglish
杨涛的个人主页

UrlPager分页控件

UrlPager.cs

    /*
 ASP.NET UrlPager control
 Copyright:2009-2010 Webdiyer (http://www.webdiyer.com)
 Source code released under Ms-PL license
 */
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Security.Permissions;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.Routing;
using System.Web.UI.WebControls;

namespace Webdiyer.WebControls
{
    [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]
    [DefaultProperty("PageSize")]
    [DefaultEvent("PageChanged")]
    [ParseChildren(false)]
    [PersistChildren(false)]
    [Designer(typeof(UrlPagerDesigner))]
    [System.Drawing.ToolboxBitmap(typeof(UrlPager), "UrlPager.bmp")]
    [ToolboxData("<{0}:UrlPager runat=server></{0}:UrlPager>")]
    public partial class UrlPager : Panel
    {
        #region control rendering logic

        public override void RenderBeginTag(HtmlTextWriter writer)
        {
            writer.WriteLine(CopyrightText);
            base.RenderBeginTag(writer);
        }

        public override void RenderEndTag(HtmlTextWriter writer)
        {
            base.RenderEndTag(writer);
            writer.WriteLine();
            writer.Write(CopyrightText);
        }

        protected override void OnLoad(EventArgs e)
        {
            int pageIndex;
            object obj = Page.RouteData.Values[PageIndexParameterName];
            if (obj != null)
                int.TryParse(obj.ToString(), out pageIndex);
            else
                int.TryParse(Page.Request.QueryString[PageIndexParameterName], out pageIndex);
            if (pageIndex > 1)
                CurrentPageIndex = pageIndex;
            if (!Page.IsPostBack)
                OnPageChanged(EventArgs.Empty);
            base.OnLoad(e);
        }

        protected override void RenderContents(HtmlTextWriter output)
        {
            if (PageCount <= NumericPagerItemCount && AutoHide)
                return;
            output.Indent = 0;
            if (RouteValues == null)
                RouteValues = new RouteValueDictionary();
            if (InheritsRouteValues)
            {
                var currentValue = Page.RouteData.Values;
                if (currentValue != null && currentValue.Count > 0)
                {
                    foreach (KeyValuePair<string, object> routeElement in currentValue)
                    {
                        if (!RouteValues.ContainsKey(routeElement.Key))
                            RouteValues.Add(routeElement.Key, routeElement.Value);
                    }
                }
            }

            //this is an important trick, it's not the same as CurrentPageIndex-1
            int startIndex = ((CurrentPageIndex - 1)/NumericPagerItemCount)*NumericPagerItemCount;

            int endIndex = ((startIndex + NumericPagerItemCount) > PageCount)
                               ? PageCount
                               : (startIndex + NumericPagerItemCount);

            AddNavigationPageItem(output, 1, FirstPageText, PagerItemType.FirstPage);
            AddNavigationPageItem(output, CurrentPageIndex - 1, PrevPageText, PagerItemType.PrevPage);

            if (ShowMorePagerItems && startIndex > 0)
                AddMorePageItem(output, startIndex);

            if (AlwaysShowFirstLastPageNumber && startIndex > 1)
                AddNumericPagerItem(output, 1);

            if (ShowNumericPagerItems)
            {
                for (int i = startIndex + 1; i <= endIndex; i++)
                {
                    AddNumericPagerItem(output, i);
                }
            }
            if (ShowMorePagerItems && PageCount > NumericPagerItemCount && endIndex < PageCount)
                AddMorePageItem(output, endIndex + 1);

            if (AlwaysShowFirstLastPageNumber && endIndex < PageCount)
                AddNumericPagerItem(output, PageCount);

            AddNavigationPageItem(output, CurrentPageIndex + 1, NextPageText, PagerItemType.NextPage);
            AddNavigationPageItem(output, PageCount, LastPageText, PagerItemType.LastPage);
        }

        private void AddNumericPagerItem(HtmlTextWriter writer, int pageIndex)
        {
            string linkText;
            if (CurrentPageIndex == pageIndex)
            {
                linkText = CurrentPageNumberFormatString == null
                               ? pageIndex.ToString()
                               : string.Format(CurrentPageNumberFormatString, pageIndex);
                writer.Write(CurrentPagerItemWrapperFormatString == null
                    ? linkText : string.Format(CurrentPagerItemWrapperFormatString, linkText));
            }
            else
            {
                linkText = PageNumberFormatString != null
                               ? string.Format(PageNumberFormatString, pageIndex)
                               : pageIndex.ToString();
                if (RouteValues.ContainsKey(PageIndexParameterName))
                    RouteValues[PageIndexParameterName] = pageIndex;
                else
                    RouteValues.Add(PageIndexParameterName, pageIndex);
                var itemBuilder = new StringBuilder("<a href=\"");
                if (DesignMode)
                    itemBuilder.Append("http://en.webdiyer.com/");
                else
                    itemBuilder.Append(GetRouteUrl(RouteName, RouteValues));
                itemBuilder.Append("\">");
                itemBuilder.Append(linkText);
                itemBuilder.Append("</a>");
                writer.Write(NumericPagerItemWrapperFormatString == null
                                 ? itemBuilder.ToString()
                                 : string.Format(NumericPagerItemWrapperFormatString, itemBuilder));
            }
        }

        private void AddMorePageItem(HtmlTextWriter writer, int pageIndex)
        {
            if (RouteValues.ContainsKey(PageIndexParameterName))
                RouteValues[PageIndexParameterName] = pageIndex;
            else
                RouteValues.Add(PageIndexParameterName, pageIndex);
            var itemBuilder = new StringBuilder("<a href=\"");
            if (DesignMode)
                itemBuilder.Append("http://en.webdiyer.com/");
            else
                itemBuilder.Append(GetRouteUrl(RouteName, RouteValues));
            itemBuilder.Append("\">").Append(MorePageText);
            itemBuilder.Append("</a>");
            writer.Write(MorePagerItemWrapperFormatString == null
                             ? itemBuilder.ToString()
                             : string.Format(MorePagerItemWrapperFormatString, itemBuilder));
        }

        private void AddNavigationPageItem(HtmlTextWriter writer, int pageIndex, 
                                            string linkText, PagerItemType pagerItemType)
        {
            if (!ShowFirstLast && (pagerItemType == PagerItemType.FirstPage || 
                                        pagerItemType == PagerItemType.LastPage))
                return;
            if (!ShowPrevNext && (pagerItemType == PagerItemType.PrevPage || 
                                        pagerItemType == PagerItemType.NextPage))
                return;
            string anchorElement;
            bool disabled = false;
            if (pagerItemType == PagerItemType.FirstPage || pagerItemType == PagerItemType.PrevPage)
            {
                if (CurrentPageIndex <= 1)
                {
                    if (!ShowInactivePagerItems)
                        return;
                    disabled = true;
                }
            }

            if (pagerItemType == PagerItemType.NextPage || pagerItemType == PagerItemType.LastPage)
            {
                if (CurrentPageIndex >= PageCount)
                {
                    if (!ShowInactivePagerItems)
                        return;
                    disabled = true;
                }
            }
            if (disabled)
                anchorElement = string.Format("<a disabled=\"disabled\">{0}</a>", linkText);
            else
            {
                if (RouteValues.ContainsKey(PageIndexParameterName))
                    RouteValues[PageIndexParameterName] = pageIndex;
                else
                    RouteValues.Add(PageIndexParameterName, pageIndex);
                anchorElement = string.Format("<a href=\"{0}\">{1}</a>", 
                            DesignMode ? "http://en.webdiyer.com/" : GetRouteUrl(RouteName, RouteValues),
                                              linkText);
            }
            writer.Write(NavigationPagerItemWrapperFormatString == null
                             ? anchorElement
                             : string.Format(NavigationPagerItemWrapperFormatString, anchorElement));
        }


        #endregion

        #region methods
        protected virtual void OnPageChanged(EventArgs e)
        {
            var handler = (EventHandler)Events[EventPageChanged];
            if (handler != null)
                handler(this, e);
        }
        #endregion

        #region events

        public event EventHandler PageChanged
        {
            add
            {
                Events.AddHandler(EventPageChanged, value);
            }
            remove
            {
                Events.RemoveHandler(EventPageChanged, value);
            }
        }

        #endregion
    }
}