效果图
这个在用户控件一用一次
<%@ 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 }