using System; using System.ComponentModel; using System.Web.UI; using System.Web.UI.WebControls; namespace ZZZ.WebControls { [DefaultProperty("Text"), ToolboxData("<{0}:PageNavigate runat=/"server/" />")] public class PageNavigate : WebControl, IPostBackEventHandler { public PageNavigate() { } [DefaultValue(1)] public virtual int CurrentPage { get { object obj = ViewState["CurrentPage"]; return (obj is int) ? (int)obj : 1; } set { if(value < MinPage || value > MaxPage) throw new ArgumentOutOfRangeException(); ViewState["CurrentPage"] = value; } } [DefaultValue(1)] public virtual int MaxPage { get { object obj = ViewState["MaxPage"]; return (obj is int) ? (int)obj : 1; } set { if(value < MinPage) throw new ArgumentOutOfRangeException(); ViewState["MaxPage"] = value; } } [DefaultValue(1)] public virtual int MinPage { get { object obj = ViewState["MinPage"]; return (obj is int) ? (int)obj : 1; } set { if(value > MaxPage) throw new ArgumentOutOfRangeException(); ViewState["MinPage"] = value; } } [DefaultValue(10)] public virtual int ShowPagesCount { get { object obj = ViewState["ShowPagesCount"]; return (obj is int) ? (int)obj : 10; } set { ViewState["ShowPagesCount"] = value; } } [DefaultValue("<")] public virtual string PrevLinkText { get { string obj = ViewState["PrevLinkText"] as string; return (obj == null) ? "<" : obj; } set { ViewState["PrevLinkText"] = value; } } [DefaultValue(">")] public virtual string NextLinkText { get { string obj = ViewState["NextLinkText"] as string; return (obj == null) ? ">" : obj; } set { ViewState["NextLinkText"] = value; } } protected override HtmlTextWriterTag TagKey { get { return HtmlTextWriterTag.Div; } } public event PageNavigateEventHandler PageNavigateChangedEvent; protected override void RenderContents(HtmlTextWriter writer) { if(CurrentPage > MinPage) { writer.AddAttribute(HtmlTextWriterAttribute.Href, Page.ClientScript.GetPostBackClientHyperlink(this, (CurrentPage - 1).ToString())); writer.RenderBeginTag(HtmlTextWriterTag.A); writer.WriteEncodedText(PrevLinkText); writer.RenderEndTag(); } writer.WriteEncodedText(" "); int start = Math.Max(MinPage, CurrentPage - (ShowPagesCount >> 1) + 1); int end = Math.Min(start + ShowPagesCount - 1, MaxPage); start = Math.Max(MinPage, end - ShowPagesCount + 1); for(int i = start;i <= end;i++) { writer.WriteEncodedText("["); if(i != CurrentPage) writer.AddAttribute(HtmlTextWriterAttribute.Href, Page.ClientScript.GetPostBackClientHyperlink(this, i.ToString())); writer.RenderBeginTag(HtmlTextWriterTag.A); writer.WriteEncodedText(i.ToString()); writer.RenderEndTag(); writer.WriteEncodedText("] "); } if(CurrentPage < MaxPage) { writer.AddAttribute(HtmlTextWriterAttribute.Href, Page.ClientScript.GetPostBackClientHyperlink(this, (CurrentPage + 1).ToString())); writer.RenderBeginTag(HtmlTextWriterTag.A); writer.WriteEncodedText(NextLinkText); writer.RenderEndTag(); } writer.WriteEncodedText(" "); writer.WriteEncodedText("(" + MinPage.ToString() + "/" + MaxPage.ToString() + ")"); writer.WriteEncodedText(" "); writer.AddAttribute(HtmlTextWriterAttribute.Name, base.ClientID + "$Page"); writer.AddAttribute(HtmlTextWriterAttribute.Type, "text"); writer.AddAttribute(HtmlTextWriterAttribute.Style, "width:30px"); writer.AddAttribute(HtmlTextWriterAttribute.Value, CurrentPage.ToString()); writer.RenderBeginTag(HtmlTextWriterTag.Input); writer.RenderEndTag(); writer.WriteEncodedText(" "); writer.AddAttribute(HtmlTextWriterAttribute.Type, "button"); writer.AddAttribute(HtmlTextWriterAttribute.Value, "Go"); writer.AddAttribute(HtmlTextWriterAttribute.Onclick, Page.ClientScript.GetPostBackEventReference(this, "-")); writer.RenderBeginTag(HtmlTextWriterTag.Input); writer.RenderEndTag(); } #region IPostBackEventHandler Members public void RaisePostBackEvent(string eventArgument) { try { if(eventArgument == "-") CurrentPage = int.Parse(Page.Request.Form[base.ClientID + "$Page"]); else CurrentPage = int.Parse(eventArgument); } catch { } if(PageNavigateChangedEvent != null) { PageNavigateChangedEvent(this, new PageNavigateEventArgs(CurrentPage)); } } #endregion } public delegate void PageNavigateEventHandler(object sender, PageNavigateEventArgs e); public class PageNavigateEventArgs : EventArgs { public PageNavigateEventArgs(int newPage) { this.NewPage = newPage; } public int NewPage { get; set; } public override string ToString() { return "NewPage=" + NewPage.ToString(); } } }