ASP.NET分页控件

效果图

这个在用户控件一用一次

<%@ Register Assembly="Uni2Uni.ERP.Common" Namespace="Uni2Uni.ERP.Common.PageBar"
    TagPrefix="cc1" %>
<cc1:PageBar ID="pageBar" runat="server" Mode="Post" />

然后使用那个用户控件

<uc1:PageBarControl ID="PageBarControl1" runat="server" />


PageBarControl1.PageBar.Click += new EventHandler(PagerChange);
        

        private void PagerChange(object sender, EventArgs e)
        {
            var queryEntity = ViewState["queryEntity"] as DamagedQueryEntity;
            GetPageData(queryEntity, false);
        }


 private void GetPageData(DamagedQueryEntity queryEntity, bool bFirst = true)
        {
            if (bFirst)
                PageBarControl1.PageBar.CurrentIndex = 1;
            int totalCount;
            var list = bll.GetDamagedOrderPage(PageBarControl1.PageBar.CurrentIndex, PageBarControl1.PageBar.Size, out totalCount, queryEntity);
            this.PageBarControl1.PageBar.Total = totalCount;
            this.bindData.DataSource = list;
            this.bindData.DataBind();
        }


 

源码

using System;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Text;
using System.Text.RegularExpressions;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;

[assembly: WebResource("Uni2Uni.ERP.Common.PageBar.PageBar.css", "text/css", PerformSubstitution = true)]

namespace Uni2Uni.ERP.Common.PageBar
{
    public enum PageBarMode
    {
        Get,
        Post
    }

    #region - PageBar -

    /// <summary>
    /// 分页控件
    /// </summary>
    [ToolboxData("<{0}:PageBar runat="server" />")]
    [DefaultEvent("Click")]
    [DefaultProperty("Size")]
    public sealed class PageBar : WebControl, IPostBackEventHandler
    {
        #region - Properties -

        #region = Total =

        /// <summary>
        /// 总共有多少记录集合
        /// </summary>
        /// <value>The total.</value>
        [Category("Data"), Description("总共有多少记录集合")]
        public int Total
        {
            get
            {
                object o = ViewState["Total"];
                return o == null ? 0 : (int)o;
            }
            set { ViewState["Total"] = value; }
        }

        #endregion

        #region = CurrentIndex =

        /// <summary>
        /// 当前使用的页面
        /// </summary>
        /// <value>The index of the current.</value>
        [Category("Data"), Description("当前使用的页面")]
        public int CurrentIndex
        {
            get
            {
                object o = ViewState["CurrentIndex"];
                int _currentindex = ((o == null) ? 0 : (int)o);
                if (_currentindex == 0)
                {
                    _currentindex = 1;

                    if (string.IsNullOrEmpty(UrlFormatString) == false)
                    {
                        string url = Page.Request.Url.ToString();
                        string urlformat = string.Format(UrlFormatString, @"(d+)");
                        urlformat = urlformat.Replace("?", "\?");
                        urlformat = Regex.Replace(urlformat, "#.+$", string.Empty);

                        Match m = Regex.Match(url, urlformat, RegexOptions.IgnoreCase);

                        if (m.Success)
                        {
                            string value = m.Groups[1].Value;
                            if (string.IsNullOrEmpty(value) == false)
                            {
                                _currentindex = int.Parse(value);
                            }
                        }
                    }
                    else
                    {
                        if (Page.Request.QueryString[QueryStringKey] != null)
                        {
                            int.TryParse(Page.Request.QueryString[QueryStringKey], out _currentindex);
                        }
                    }
                }
                return _currentindex;
            }
            set { ViewState["CurrentIndex"] = value; }
        }

        #endregion

        #region = Size =

        /// <summary>
        /// 每个页面显示多少记录集合
        /// </summary>
        /// <value>The size.</value>
        [Category("Data"), Description("每个页面显示多少记录集合")]
        public int Size
        {
            get
            {
                object o = ViewState["Size"];
                return o == null ? 10 : (int)o;
            }
            set { ViewState["Size"] = value; }
        }

        #endregion

        #region = Displaysize =

        /// <summary>
        /// 显示页脚,控件显示多少页面数
        /// </summary>
        /// <value>The displaysize.</value>
        [Category("Data"), Description("控件显示多少页面数")]
        public int Displaysize
        {
            get
            {
                object o = ViewState["Displaysize"];
                return o == null ? 10 : (int)o;
            }
            set { ViewState["Displaysize"] = value; }
        }

        #endregion

        #region = Unit =

        /// <summary>
        /// 记录的单位
        /// </summary>
        /// <value>The unit.</value>
        [Category("Appearance"), Description("记录的单位")]
        public string Unit
        {
            get
            {
                object o = ViewState["Unit"];
                return o == null ? string.Empty : (string)o;
            }
            set { ViewState["Unit"] = value; }
        }

        #endregion

        #region = UrlFormatString =

        [
            Category("Property"),
            Description("获取或设置 URL 显示格式。"),
            DefaultValue("")
        ]
        public string UrlFormatString
        {
            get
            {
                object o = ViewState["UrlFormatString"];
                return o == null ? string.Empty : (string)o;
            }
            set { ViewState["UrlFormatString"] = value; }
        }

        #endregion

        #region = QueryStringKey =

        /// <summary>
        /// 传递值是使用的关键字
        /// </summary>
        /// <value>The query string key.</value>
        [Description("传递值是使用的关键字"), DefaultValue("page")]
        public string QueryStringKey
        {
            get
            {
                object o = ViewState["QueryStringKey"];
                return o == null ? "page" : (string)o;
            }
            set { ViewState["QueryStringKey"] = value; }
        }

        #endregion

        #region = 跳转的页数 =
        /// <summary>
        /// 跳转的页数
        /// </summary>
        [Browsable(true)]
        [Bindable(true, BindingDirection.TwoWay)]
        [DefaultValue("")]
        [Localizable(true)]
        [PersistenceMode(PersistenceMode.EncodedInnerDefaultProperty)]
        [Description("跳转的页数")]
        public string Text
        {
            get
            {
                return ViewState["Text"] == null ? "" : ViewState["Text"].ToString();
            }
            set
            {
                ViewState["Text"] = value;
            }
        }
        #endregion

        #region = Format =

        /// <summary>
        /// 数字格式化
        /// </summary>
        /// <value>The format.</value>
        [Description("数字格式化"), DefaultValue("")]
        public string Format
        {
            get
            {
                object o = ViewState["Format"];
                return o == null ? string.Empty : (string)o;
            }
            set { ViewState["Format"] = value; }
        }

        #endregion

        #region = NextPageImageUrl =

        /// <summary>
        /// 下一页图片路径
        /// </summary>
        /// <value>The next page image URL.</value>
        [Description("下一页图片路径"), DefaultValue("")]
        public string NextPageImageUrl
        {
            get
            {
                object o = ViewState["NextPageImageUrl"];
                return o == null ? string.Empty : (string)o;
            }
            set { ViewState["NextPageImageUrl"] = value; }
        }

        #endregion

        #region = LastPageImageUrl =

        private string _lastimage = string.Empty;

        /// <summary>
        /// 上一页图片路径
        /// </summary>
        /// <value>The last page image URL.</value>
        [Description("上一页图片路径"), DefaultValue("")]
        public string LastPageImageUrl
        {
            get
            {
                object o = ViewState["LastPageImageUrl"];
                return o == null ? string.Empty : (string)o;
            }
            set { ViewState["LastPageImageUrl"] = value; }
        }

        #endregion

        #region = Mode =

        [
            Category("Property"),
            Description("Pagebar的模式"),
            DefaultValue("")
        ]
        public PageBarMode Mode
        {
            get
            {
                object o = ViewState["Mode"];
                return o == null ? PageBarMode.Get : (PageBarMode)o;
            }
            set { ViewState["Mode"] = value; }
        }

        #endregion

        #region = ValidationGroup =

        [Category("Behavior"), DefaultValue(""), Themeable(false), Description("PostBackControl_ValidationGroup")]
        public string ValidationGroup
        {
            get
            {
                var text1 = (string)ViewState["ValidationGroup"];
                if (text1 != null)
                {
                    return text1;
                }
                return string.Empty;
            }
            set { ViewState["ValidationGroup"] = value; }
        }

        #endregion

        #region = CausesValidation =

        /// <summary>
        /// 获取或设置一个值,该值指示在单击 LinkButton 控件时是否执行验证。 
        /// </summary>
        /// <value><c>true</c> if [causes validation]; otherwise, <c>false</c>.</value>
        [Category("Behavior"), Themeable(false), Description("Button_CausesValidation"), DefaultValue(true)]
        public bool CausesValidation
        {
            get
            {
                object obj1 = ViewState["CausesValidation"];
                if (obj1 != null)
                {
                    return (bool)obj1;
                }
                return true;
            }
            set { ViewState["CausesValidation"] = value; }
        }

        #endregion

        #region = Target =

        /// <summary>
        /// Gets or sets the target.
        /// </summary>
        /// <value>The target.</value>
        [
            Category("Navigation"),
            TypeConverter(typeof(TargetConverter)),
            DefaultValue(""),
            Description("HyperLink_Target")]
        public string Target
        {
            get
            {
                var text1 = (string)ViewState["Target"];
                if (text1 != null)
                {
                    return text1;
                }
                return "_self";
            }
            set { ViewState["Target"] = value; }
        }

        #endregion

        #endregion

        #region - Event -

        #region = OnClick =

        private static readonly object EventClick = new object();

        [Description("PageBar_OnClick"), Category("Action")]
        public event EventHandler Click
        {
            add { Events.AddHandler(EventClick, value); }
            remove { Events.RemoveHandler(EventClick, value); }
        }

        #endregion

        #endregion

        #region = OnPreRender =

        /// <summary>
        /// Raises the <see cref="E:System.Web.UI.Control.PreRender"></see> event.
        /// </summary>
        /// <param name="e">An <see cref="T:System.EventArgs"></see> object that contains the event data.</param>
        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);

            string cssKey = "PageBarCss";

            if (Page == null || Page.Header == null)
            {
                return;
            }
            if (string.IsNullOrEmpty(CssClass))
            {
                CssClass = "PageBar";
            }
            if (Page.Header.FindControl(cssKey) == null && CssClass == "PageBar")
            {
                string css = Page.ClientScript.GetWebResourceUrl(GetType(), "Uni2Uni.ERP.Common.PageBar.PageBar.css");
                var hl = new HtmlLink();
                hl.ID = cssKey;
                hl.Href = css;
                hl.Attributes["type"] = "text/css";
                hl.Attributes["rel"] = "stylesheet";

                //this.Page.Header.Controls.Add(hl);

                CssClass = "PageBar";
            }
        }

        #endregion

        #region = RenderContents =

        /// <summary>
        /// Renders the contents of the control to the specified writer. This method is used primarily by control developers.
        /// </summary>
        /// <param name="writer">A <see cref="T:System.Web.UI.HtmlTextWriter"></see> that represents the output stream to render HTML content on the client.</param>
        protected override void RenderContents(HtmlTextWriter writer)
        {
            base.RenderContents(writer);

            #region - Valid -

            if (IsEnabled == false)
            {
                return;
            }

            if (Size == 0 || Displaysize == 0)
            {
                return;
            }

            #endregion

            if (Total > 0 && CurrentIndex > 0)
            {
                double dPageCount = 1.0 * Total / Size;
                int PageCount = Convert.ToInt32(Math.Ceiling(dPageCount)); //共多少页

                PostBackOptions options = GetPostBackOptions("{0}");
                string srt = Page.ClientScript.GetPostBackEventReference(options, true);

                //---【新添加】
                //只能输入正整数
                string js = "<script type="text/javascript">var postbackstring="" + srt + "";var total=" + PageCount + "; function PositiveInteger(element, keyCode) {if (keyCode == 9 || keyCode == 116 || (keyCode >= 35 && keyCode <= 40)) {return true;}if ($(element).val().length == 0 && (keyCode == 96 || keyCode==48)){return false;}return (keyCode >= 96 && keyCode <= 105 || keyCode == 8 || (keyCode >= 48 && keyCode <= 57));}function validatePage(element){if($("#goPage").val()==""){alert("请输入跳转页数。");return false;}if($("#goPage").val()>total){alert("跳转页数不能大于总页数。");return false;}$(element).attr("href",postbackstring.replace("{0}",$("#goPage").val()));return true;}</script>";
                writer.Write(js);

                if (CurrentIndex > PageCount)
                {
                    CurrentIndex = PageCount;
                }

                //总共2784主题
                writer.Write(PageBarResource.Total);
                //writer.Write("总共");
                writer.Write(" ");
                writer.RenderBeginTag(HtmlTextWriterTag.Label);
                writer.Write(Total.ToString(Format));
                writer.RenderEndTag();
                writer.Write(Unit);
                writer.Write(", ");

                writer.Write(PageBarResource.Page);
                //writer.Write("当前");
                writer.Write(" ");
                writer.RenderBeginTag(HtmlTextWriterTag.Label);
                writer.Write(CurrentIndex.ToString(Format));
                writer.RenderEndTag();
                writer.Write("/");
                writer.RenderBeginTag(HtmlTextWriterTag.Label);
                writer.Write(PageCount.ToString(Format));
                writer.RenderEndTag();

                if (PageCount > 1)
                {
                    writer.Write(",");
                    int PagerGroup = Convert.ToInt32(Math.Ceiling(1.0 * PageCount / Displaysize)); //共多少页组
                    int CurrentGroup = (CurrentIndex - 1) / Displaysize + 1; //当前页组

                    int displaystart = (CurrentGroup - 1) * Displaysize + 1;
                    int displayend = displaystart + Displaysize;

                    if (displayend > (PageCount + 1))
                    {
                        displayend = PageCount + 1;
                    }

                    #region 显示后三的算法----------【新添加】
                    ////显示后三的算法----------【新添加】
                    //if (PageCount > Displaysize && CurrentIndex > Displaysize - 3)
                    //{
                    //    displaystart = CurrentIndex - (Displaysize - 4);
                    //    displayend = CurrentIndex + 4;
                    //    if (displayend - 1 >= PageCount)
                    //    {
                    //        displayend = PageCount + 1;
                    //    }
                    //} 
                    #endregion


                    //显示中间的算法----------【新添加】
                    if (PageCount > Displaysize && CurrentIndex >= Displaysize - ((Displaysize / 2) - 1))
                    {
                        displaystart = CurrentIndex - (Displaysize - (Displaysize / 2));
                        displayend = CurrentIndex + (Displaysize / 2);
                        if (displayend - 1 >= PageCount)
                        {
                            displayend = PageCount + 1;
                        }
                    }

                    //首页-------【新添加】
                    if (CurrentIndex != 1)
                    {
                        writer.RenderBeginTag(HtmlTextWriterTag.Span);
                        LinkText("【首页】", 1, writer);
                        writer.RenderEndTag();
                    }
                    else
                    {
                        //---【新添加】
                        writer.RenderBeginTag(HtmlTextWriterTag.Label);
                        writer.Write("【首页】");
                        writer.RenderEndTag();
                    }
                    //上一页
                    if (CurrentIndex > 1)
                    {
                        writer.RenderBeginTag(HtmlTextWriterTag.Span);
                        if (string.IsNullOrEmpty(LastPageImageUrl))
                        {
                            LinkText(PageBarResource.Previous, CurrentIndex - 1, writer);
                            //LinkText("【上一页】", this.CurrentIndex - 1, writer);
                        }
                        else
                        {
                            LinkText(
                                "<img alt="" + PageBarResource.Previous + "" src="" + LastPageImageUrl + "" />",
                                CurrentIndex - 1, writer);
                            //LinkText("<img alt="" +"【上一页】" + "" src="" + this.LastPageImageUrl + "" />", this.CurrentIndex - 1, writer);
                        }
                        writer.RenderEndTag();
                    }
                    else  
                    {
                        //---【新添加】
                        writer.RenderBeginTag(HtmlTextWriterTag.Label);
                        writer.Write("【上一页】");
                        writer.RenderEndTag();
                    }

                    //上一组
                    if (CurrentGroup > 1 || displaystart != 1)
                    {
                        writer.AddAttribute(HtmlTextWriterAttribute.Title, "上"+Displaysize+"页");
                        writer.RenderBeginTag(HtmlTextWriterTag.Span);
                        int index = CurrentIndex - Displaysize;
                        if (index < 1)
                        {
                            index = 1;
                        }
                        LinkText("<<", index, writer);
                        writer.RenderEndTag();
                    }
                    else
                    {
                        //---【新添加】
                        writer.RenderBeginTag(HtmlTextWriterTag.Label);
                        writer.Write("<<");
                        writer.RenderEndTag();
                    }
                    string attr = string.Empty;

                    //显示数字
                    for (int i = displaystart; i < displayend; i++)
                    {
                        writer.RenderBeginTag(HtmlTextWriterTag.Span);
                        if (i != CurrentIndex)
                        {
                            LinkText(i.ToString() + " ", i, writer);
                        }
                        else
                        {
                            //当前页
                            writer.RenderBeginTag(HtmlTextWriterTag.Label);
                            writer.Write(i + " ");
                            writer.RenderEndTag();
                        }
                        writer.RenderEndTag();
                    }

                    
                    //下一组
                    if (displayend - 1 < PageCount)
                    {
                        writer.AddAttribute(HtmlTextWriterAttribute.Title, "下" + Displaysize + "页");
                        writer.RenderBeginTag(HtmlTextWriterTag.Span);
                        int index = CurrentIndex + Displaysize;
                        if (index > PageCount)
                        {
                            index = PageCount;
                        }
                        LinkText(">>", index, writer);
                        writer.RenderEndTag();
                    }
                    else
                    {
                        //---【新添加】
                        writer.RenderBeginTag(HtmlTextWriterTag.Label);
                        writer.Write(">>");
                        writer.RenderEndTag();
                    }

                    //下一页
                    if (CurrentIndex < PageCount)
                    {
                        writer.RenderBeginTag(HtmlTextWriterTag.Span);
                        if (string.IsNullOrEmpty(NextPageImageUrl))
                        {
                            LinkText(PageBarResource.Next, CurrentIndex + 1, writer);
                            //LinkText("【下一页】", this.CurrentIndex + 1, writer);
                        }
                        else
                        {
                            LinkText("<img alt="" + PageBarResource.Next + "" src="" + NextPageImageUrl + "" />",
                                     CurrentIndex + 1, writer);
                            //LinkText("<img alt="" + "【下一页】" + "" src="" + this.NextPageImageUrl + "" />", this.CurrentIndex + 1, writer);
                        }
                        writer.RenderEndTag();
                    }
                    else
                    {
                        //---【新添加】
                        writer.RenderBeginTag(HtmlTextWriterTag.Label);
                        writer.Write("【下一页】");
                        writer.RenderEndTag();
                    }

                    //尾页-------【新添加】
                    if (CurrentIndex != PageCount)
                    {
                        writer.RenderBeginTag(HtmlTextWriterTag.Span);
                        LinkText("【尾页】", PageCount, writer);
                        writer.RenderEndTag();
                    }
                    else
                    {
                        //---【新添加】
                        writer.RenderBeginTag(HtmlTextWriterTag.Label);
                        writer.Write("【尾页】");
                        writer.RenderEndTag();
                    }


                    //跳转---【新添加】
                    if (PagerGroup > 1)
                    {
                        writer.AddAttribute(HtmlTextWriterAttribute.Type, "text");
                        writer.AddAttribute(HtmlTextWriterAttribute.Id, "goPage");
                        writer.AddAttribute(HtmlTextWriterAttribute.Value, Text);
                        writer.AddAttribute("onkeydown", "return PositiveInteger(this,event.keyCode);");
                        writer.AddStyleAttribute(HtmlTextWriterStyle.Height, "10px");
                        writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "40px");
                        writer.AddStyleAttribute(HtmlTextWriterStyle.Position, "relative");
                        writer.AddStyleAttribute(HtmlTextWriterStyle.Top, "4px");
                        writer.AddAttribute(HtmlTextWriterAttribute.Maxlength, PageCount.ToString().Length.ToString());
                        writer.RenderBeginTag(HtmlTextWriterTag.Input);
                        writer.RenderEndTag();

                        writer.AddAttribute("onclick", "return validatePage(this);");
                        writer.AddAttribute(HtmlTextWriterAttribute.Href, "javascript:void(0)");
                        writer.RenderBeginTag(HtmlTextWriterTag.A);
                        writer.Write("【跳转】");
                        writer.RenderEndTag();
                    }

                }
            }
            else
            {
                Visible = false;
            }
        }

        #endregion

        #region - LinkText -

        private void LinkText(string text, int index, HtmlTextWriter write)
        {
            var strHtml = new StringBuilder();
            //href
            if (Mode == PageBarMode.Get)
            {
                #region = 获取和解析当前的url =

                if (string.IsNullOrEmpty(UrlFormatString))
                {
                    strHtml.Append(UrlHelper.Current.Path);
                    strHtml.Append("?");
                    NameValueCollection querys = Page.Request.QueryString;

                    foreach (string s in querys.Keys)
                    {
                        if (s != QueryStringKey)
                        {
                            strHtml.AppendFormat("{0}={1}&", s, Page.Server.UrlEncode(querys[s]));
                        }
                    }

                    strHtml.AppendFormat("{0}={1}", QueryStringKey, index);
                }
                else
                {
                    strHtml.AppendFormat(UrlFormatString, index);
                }

                #endregion
            }
            else
            {
                PostBackOptions options = GetPostBackOptions(index.ToString());

                string js = null;
                if (options != null)
                {
                    js = Page.ClientScript.GetPostBackEventReference(options, true);
                }
                if (string.IsNullOrEmpty(js))
                {
                    js = "javascript:void(0)";
                }
                strHtml.Append(js);
            }

            //text
            write.AddAttribute(HtmlTextWriterAttribute.Href, strHtml.ToString());
            if (Mode == PageBarMode.Get)
            {
                write.AddAttribute(HtmlTextWriterAttribute.Target, Target);
            }
            write.RenderBeginTag(HtmlTextWriterTag.A);
            write.Write(text);
            write.RenderEndTag();
        }

        #endregion

        #region - GetPostBackOptions -

        private PostBackOptions GetPostBackOptions(string index)
        {
            var options1 = new PostBackOptions(this, index);
            options1.RequiresJavaScriptProtocol = true;

            if (CausesValidation && (Page.GetValidators(ValidationGroup).Count > 0))
            {
                options1.PerformValidation = true;
                options1.ValidationGroup = ValidationGroup;
            }
            return options1;
        }

        #endregion

        #region - OnClick -

        private void OnClick(EventArgs e)
        {
            var handler1 = (EventHandler)base.Events[EventClick];
            if (handler1 != null)
            {
                handler1(this, e);
            }
        }

        #endregion

        #region IPostBackEventHandler Members

        public void RaisePostBackEvent(string eventArgument)
        {
            if (CausesValidation)
            {
                Page.Validate(ValidationGroup);
            }

            int _currentindex;
            if (int.TryParse(eventArgument, out _currentindex))
            {
                CurrentIndex = _currentindex;
            }

            OnClick(EventArgs.Empty);
        }

        #endregion
    }

    #endregion
}


 

原文地址:https://www.cnblogs.com/pangblog/p/3395407.html