using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.ComponentModel; using System.Drawing; namespace Dimon.Web.Controls { public delegate void PagerEventHandler(Object sender, PagerEventArgs e); public class PagerEventArgs : EventArgs { public int SelectedPage; public PagerEventArgs(int SelectedPage) { this.SelectedPage = SelectedPage; } } [DefaultProperty("CurrentPageIndex"), ToolboxData("<{0}:Pager runat=server>")] public class Pager : WebControl, IPostBackEventHandler { public event PagerEventHandler Navigate; [Bindable(true), Category("Data"), DefaultValue(0), Description("Count of rows in Data Source") ] public int RowsCount { get { try { return (int) ViewState["RowsCount"]; } catch { return 0; } } set { ViewState["RowsCount"] = value; } } [Bindable(true), Category("Data"), DefaultValue(0), Description("Current Page Index") ] public int CurrentPage { get { try { return (int) ViewState["CurrentPage"]; } catch { return 0; } } set { ViewState["CurrentPage"] = value; } } [Bindable(true), Category("Data"), DefaultValue(10), Description("Page Size") ] public int PageSize { get { try { return (int) ViewState["PageSize"]; } catch { return 0; } } set { ViewState["PageSize"] = value; } } [Bindable(true), Category("Appearance"), DefaultValue(true), Description("Show table cell with Page Title.") ] public bool ShowInfo { get { return ViewState["ShowPageTitle"] != null ? (bool) ViewState["ShowPageTitle"] : true; } set { ViewState["ShowPageTitle"] = value; } } [Bindable(true), Category("Appearance"), DefaultValue(true), Description("Show table cell with Prev-Next buttons.") ] public bool ShowPrevNext { get { return ViewState["ShowPrevNext"] != null ? (bool) ViewState["ShowPrevNext"] : true; } set { ViewState["ShowPrevNext"] = value; } } [Bindable(true), Category("Appearance"), DefaultValue(true), Description("Show table cell with Nav buttons.") ] public bool ShowNav { get { return ViewState["ShowNav"] != null ? (bool) ViewState["ShowNav"] : true; } set { ViewState["ShowNav"] = value; } } //{0} - первая запись на странице //{1} - последняя запись на странице //{2} - всего записей //{3} - номер страницы //{4} - всего страниц [Bindable(true), Category("Appearance"), DefaultValue("Results: {0} - {1} of {2}"), Description("Info string about current page.") ] public string InfoTitle { get { return ViewState["PageNumTitle"] != null ? (string) ViewState["PageNumTitle"] : ""; } set { ViewState["PageNumTitle"] = value; } } [Bindable(true), Category("Appearance"), DefaultValue("Pages: "), Description("Info string about current page.") ] public string NavTitle { get { return ViewState["NavTitle"] != null ? (string) ViewState["NavTitle"] : ""; } set { ViewState["NavTitle"] = value; } } [Bindable(true), Category("Appearance"), DefaultValue("< Prev"), Description("Text for link to previous page.") ] public string PrevPageText { get { return ViewState["PrevPageText"] != null ? (string) ViewState["PrevPageText"] : ""; } set { ViewState["PrevPageText"] = value; } } [Bindable(true), Category("Appearance"), DefaultValue("Next >"), Description("Text for link to next page.") ] public string NextPageText { get { return ViewState["NextPageText"] != null ? (string) ViewState["NextPageText"] : ""; } set { ViewState["NextPageText"] = value; } } [Bindable(true), Category("Appearance"), DefaultValue("<< First"), Description("Text for link to first page.") ] public string FirstPageText { get { return ViewState["FirstPageText"] != null ? (string) ViewState["FirstPageText"] : ""; } set { ViewState["FirstPageText"] = value; } } [Bindable(true), Category("Appearance"), DefaultValue("Last >>"), Description("Text for link to last page.") ] public string LastPageText { get { return ViewState["LastPageText"] != null ? (string) ViewState["LastPageText"] : ""; } set { ViewState["LastPageText"] = value; } } [Bindable(true), Category("Appearance"), DefaultValue("-1")] public int CellSpacing { get { if(ControlStyleCreated) return ((TableStyle) ControlStyle).CellSpacing; return -1; } set { ((TableStyle) ControlStyle).CellSpacing = value; } } [Bindable(true), Category("Appearance"), DefaultValue("-1")] public int CellPadding { get { if(ControlStyleCreated) return ((TableStyle) ControlStyle).CellPadding; return -1; } set { ((TableStyle) ControlStyle).CellPadding = value; } } [Bindable(true), Category("Appearance"), DefaultValue("NotSet")] public HorizontalAlign HorizontalAlign { get { if(ControlStyleCreated) return ((TableStyle) ControlStyle).HorizontalAlign; return HorizontalAlign.NotSet; } set { ((TableStyle) ControlStyle).HorizontalAlign = value; } } private TableItemStyle infoCellStyle; [Bindable(true), Category("Style"), DesignerSerializationVisibility(DesignerSerializationVisibility.Content), PersistenceMode(PersistenceMode.InnerProperty)] public TableItemStyle InfoCellStyle { get { if (infoCellStyle == null) infoCellStyle = new TableItemStyle(); return infoCellStyle; } } private TableItemStyle prevNextCellStyle; [Bindable(true), Category("Style"), DesignerSerializationVisibility(DesignerSerializationVisibility.Content), PersistenceMode(PersistenceMode.InnerProperty)] public TableItemStyle PrevNextCellStyle { get { if (prevNextCellStyle == null) prevNextCellStyle = new TableItemStyle(); return prevNextCellStyle; } } private TableItemStyle navBtnsCellStyle; [Bindable(true), Category("Style"), DesignerSerializationVisibility(DesignerSerializationVisibility.Content), PersistenceMode(PersistenceMode.InnerProperty)] public TableItemStyle NavBtnsCellStyle { get { if (navBtnsCellStyle == null) navBtnsCellStyle = new TableItemStyle(); return navBtnsCellStyle; } } protected override HtmlTextWriterTag TagKey { get { return HtmlTextWriterTag.Table; } } public Pager() { ShowNav = true; ShowInfo = true; ShowPrevNext = true; PrevPageText = "< Prev"; NextPageText = "Next >"; FirstPageText = "<< First"; LastPageText = "Last >>"; InfoTitle = "Results: {0} - {1} of {2}"; NavTitle = "Pages: "; } protected override Style CreateControlStyle() { return new TableStyle(); } protected override void RenderContents(HtmlTextWriter output) { int pagesTotal = RowsCount % PageSize == 0 ? RowsCount / PageSize : RowsCount / PageSize + 1; output.RenderBeginTag(HtmlTextWriterTag.Tr); if(ShowInfo) { if(infoCellStyle != null) infoCellStyle.AddAttributesToRender(output); output.RenderBeginTag(HtmlTextWriterTag.Td); output.Write(InfoTitle, CurrentPage * PageSize + 1, (CurrentPage + 1) * PageSize < RowsCount ? (CurrentPage + 1) * PageSize : RowsCount, RowsCount, CurrentPage, pagesTotal); output.RenderEndTag(); } if(ShowPrevNext) { if(prevNextCellStyle != null) prevNextCellStyle.AddAttributesToRender(output); output.RenderBeginTag(HtmlTextWriterTag.Td); if(CurrentPage > 0) { if(FirstPageText != "") { output.AddAttribute(HtmlTextWriterAttribute.Href, Page.GetPostBackClientHyperlink(this, "0")); output.RenderBeginTag(HtmlTextWriterTag.A); output.Write(FirstPageText); output.RenderEndTag(); output.Write(" "); } output.AddAttribute(HtmlTextWriterAttribute.Href, Page.GetPostBackClientHyperlink(this, (CurrentPage - 1).ToString())); output.RenderBeginTag(HtmlTextWriterTag.A); output.Write(PrevPageText); output.RenderEndTag(); output.Write("  "); } if(CurrentPage + 1 < pagesTotal) { output.AddAttribute(HtmlTextWriterAttribute.Href, Page.GetPostBackClientHyperlink(this, (CurrentPage + 1).ToString())); output.RenderBeginTag(HtmlTextWriterTag.A); output.Write(NextPageText); output.RenderEndTag(); if(LastPageText != "") { output.Write(" "); output.AddAttribute(HtmlTextWriterAttribute.Href, Page.GetPostBackClientHyperlink(this, (pagesTotal - 1).ToString())); output.RenderBeginTag(HtmlTextWriterTag.A); output.Write(LastPageText); output.RenderEndTag(); } } output.RenderEndTag(); } if(ShowNav) { if(navBtnsCellStyle != null) navBtnsCellStyle.AddAttributesToRender(output); output.RenderBeginTag(HtmlTextWriterTag.Td); int[,] pageRanges = new int[3, 2] { {1, 2}, {CurrentPage - 2, CurrentPage + 2}, {pagesTotal - 1, pagesTotal} }; if (pageRanges[0, 1] + 1 >= pageRanges[1, 0]) { if(pageRanges[0, 1] < pageRanges[1, 1]) pageRanges[0, 1] = pageRanges[1, 1]; pageRanges[1, 0] = -1000; } if((pageRanges[1, 0] != pageRanges[1, 1]) && (pageRanges[1,1] + 1 >= pageRanges[2,0])) { if (pageRanges[2, 0] > pageRanges[1, 0]) pageRanges[2, 0] = pageRanges[1, 0]; pageRanges[1, 0] = -1000; } if (pageRanges[0, 1] + 1 >= pageRanges[2, 0]) { pageRanges[0, 1] = pageRanges[2, 1]; pageRanges[2, 0] = -1000; } output.RenderBeginTag(HtmlTextWriterTag.B); output.Write (NavTitle); output.RenderEndTag(); output.Write(" "); for(int rangeIndex = 0; rangeIndex <= 2; rangeIndex++) { if(pageRanges[rangeIndex, 0] != -1000) { if(rangeIndex != 0) output.Write (". . . "); int pgIndex = pageRanges[rangeIndex, 0]; do { if(pgIndex == CurrentPage + 1) { output.RenderBeginTag(HtmlTextWriterTag.B); output.Write(pgIndex.ToString()); output.RenderEndTag(); output.Write(" "); } else { output.AddAttribute(HtmlTextWriterAttribute.Href, Page.GetPostBackClientHyperlink(this, (pgIndex - 1).ToString())); output.RenderBeginTag(HtmlTextWriterTag.A); output.Write(pgIndex.ToString()); output.RenderEndTag(); output.Write(" "); } pgIndex++; } while (pgIndex <= pageRanges[rangeIndex,1]); } } output.RenderEndTag(); } output.RenderEndTag(); } public void RaisePostBackEvent(string arg) { int cmd = Int32.Parse(arg); PagerEventArgs e = new PagerEventArgs(); e.SelectedPage = cmd; CurrentPage = cmd; OnNavigate(e); } [Category("Navigation")] protected virtual void OnNavigate(PagerEventArgs e) { if (Navigate != null) Navigate(this, e); } } }