public class ucDataPager:CompositeControl,INamingContainer
    {
        private LinkButton lkbtnFirstLevel;
        private LinkButton lkbtnPreLevel;
        private LinkButton lkbtnLastLevel;
        private LinkButton lkbtnNextLevel;private List<LinkButton> lstPages;

        /// <summary>
        /// the key of the Button Click event
        /// </summary>
        private static readonly object ButtonPageClickObject = new object();

        /// <summary>
        /// 
        /// </summary>
        public ucDataPager()
        {
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="pageCount"></param>
        /// <param name="pageSize"></param>
        public ucDataPager(int pageCount, int pageSize)
        {
            PageSize = pageSize;
            ViewState["PageCount"] = pageCount;
        }

        /// <summary>
        /// the current page index
        /// </summary>
        public int PageIndex
        {
            set
            {
                if (value < 0)
                {
                    return;
                }
                if (value > PageCount - 1)
                {
                    ViewState["PageIndex"] = PageCount - 1;
                    return;
                }
                ViewState["PageIndex"] = value;

            }
            get
            {
                return ViewState["PageIndex"] == null ? 0 : Convert.ToInt32(ViewState["PageIndex"]);
            }
        }

        /// <summary>
        /// The page count of the records
        /// </summary>
        public int PageCount
        {
            set
            {
                if (value < 0)
                {
                    return;
                }
                ViewState["PageCount"] = value;
                if (value < PageIndex + 1)
                {
                    PageIndex = value - 1;
                }
            }
            get
            {
                return ViewState["PageCount"] == null ? -1 : Convert.ToInt32(ViewState["PageCount"]);
            }
        }

        /// <summary>
        /// the count of the button to show
        /// </summary>
        public int PageSize
        {
            set
            {
                if (value <= 0)
                {
                    return;
                }
                ViewState["PageSize"] = value;
            }
            get
            {
                return ViewState["PageSize"] == null ? 10 : Convert.ToInt32(ViewState["PageSize"]);
            }
        }
 /// <summary>
        /// Create child controls
        /// </summary>
        protected override void CreateChildControls()
        {
            this.Controls.Clear();
            if (PageCount <= 0)
            {
                return;
            }
            lkbtnFirstLevel = new LinkButton();
            lkbtnFirstLevel.CausesValidation = false;
            lkbtnFirstLevel.Text = "<<";
            lkbtnFirstLevel.CommandName = "First";
            this.Controls.Add(lkbtnFirstLevel);

            lkbtnLastLevel = new LinkButton();
            lkbtnLastLevel.CausesValidation = false;
            lkbtnLastLevel.Text = ">>";
            lkbtnLastLevel.CommandName = "Last";
            this.Controls.Add(lkbtnLastLevel);

            lkbtnPreLevel = new LinkButton();
            lkbtnPreLevel.CausesValidation = false;
            lkbtnPreLevel.Text = "...";
            lkbtnPreLevel.CommandName = "Pre";
            this.Controls.Add(lkbtnPreLevel);

            lkbtnNextLevel = new LinkButton();
            lkbtnNextLevel.CausesValidation = false;
            lkbtnNextLevel.Text = "...";
            lkbtnNextLevel.CommandName = "Next";
            this.Controls.Add(lkbtnNextLevel);

            lstPages = new List<LinkButton>();
            for (int i =(PageIndex/PageSize)*PageSize + 1; i <= PageCount && i <= (PageIndex/PageSize)*PageSize+PageSize; i++)
            {
                LinkButton lkbtnPage = new LinkButton();
                lkbtnPage.CausesValidation = false;
                lkbtnPage.Text = i.ToString();
                lkbtnPage.CommandName = "NewPage";
                lstPages.Add(lkbtnPage);
                this.Controls.Add(lkbtnPage);
            }
        }

        /// <summary>
        /// Render controls
        /// </summary>
        /// <param name="writer"></param>
        protected override void Render(System.Web.UI.HtmlTextWriter writer)
        {
            if (lstPages == null)
            {
                CreateChildControls();
            }
            if (lstPages == null)
            {
                return;
            }
            if (lstPages.Count <= 1 && PageIndex == 0)
            {
                return;
            }
            writer.AddAttribute(HtmlTextWriterAttribute.Id, this.ClientID);
            writer.AddAttribute(HtmlTextWriterAttribute.Name, this.UniqueID);
            writer.RenderBeginTag(HtmlTextWriterTag.Table);
            writer.RenderBeginTag(HtmlTextWriterTag.Tr);
            if (PageIndex / PageSize == 0)
            {
                lkbtnFirstLevel.Visible = false;
                lkbtnPreLevel.Visible = false;
            }
            else
            {
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                lkbtnFirstLevel.RenderControl(writer);
                writer.RenderEndTag();
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                lkbtnPreLevel.RenderControl(writer);
                writer.RenderEndTag();
            }
            foreach (LinkButton lkbtn in lstPages)
            {
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                if (lkbtn.Text == (PageIndex + 1).ToString())
                {
                    lkbtn.Enabled = false;
                }
                lkbtn.RenderControl(writer);
                writer.RenderEndTag();
            }

            if (PageIndex/PageSize == (PageCount - 1)/PageSize)
            {
                lkbtnLastLevel.Visible = false;
                lkbtnNextLevel.Visible = false;
            }
            else
            {
                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                lkbtnNextLevel.RenderControl(writer);
                writer.RenderEndTag();

                writer.RenderBeginTag(HtmlTextWriterTag.Td);
                lkbtnLastLevel.RenderControl(writer);
                writer.RenderEndTag();
            }
            writer.RenderEndTag();
            writer.RenderEndTag();
        }

        /// <summary>
        /// raise command
        /// </summary>
        /// <param name="source"></param>
        /// <param name="args"></param>
        /// <returns></returns>
        protected override bool OnBubbleEvent(object source, EventArgs args)
        {
            bool handled = false;
            if (args is CommandEventArgs)
            {
                CommandEventArgs e = (CommandEventArgs)args;
                if (e.CommandName == "First")
                {
                    PageIndex = 0;
                    MyDataPagerEventArgs myArgs = new MyDataPagerEventArgs(PageIndex);
                    OnButtonPageClick(myArgs);
                    CreateChildControls();
                    handled = true;
                }
                if (e.CommandName == "Last")
                {
                    PageIndex = ((PageCount - 1)/PageSize)*PageSize;
                    MyDataPagerEventArgs myArgs = new MyDataPagerEventArgs(PageIndex);
                    OnButtonPageClick(myArgs);
                    CreateChildControls();
                    handled = true;
                }
                if (e.CommandName == "Pre")
                {
                    PageIndex = (PageIndex / PageSize - 1) * PageSize;
                    MyDataPagerEventArgs myArgs = new MyDataPagerEventArgs(PageIndex);
                    OnButtonPageClick(myArgs);
                    CreateChildControls();
                    handled = true;
                }
                if (e.CommandName == "Next")
                {
                    PageIndex = (PageIndex / PageSize + 1) * PageSize;
                    MyDataPagerEventArgs myArgs = new MyDataPagerEventArgs(PageIndex);
                    OnButtonPageClick(myArgs);
                    CreateChildControls();
                    handled = true;
                }
                if (e.CommandName == "NewPage")
                {
                    int pageIndex = Convert.ToInt32(((LinkButton)source).Text) - 1;
                    PageIndex = pageIndex;
                    CreateChildControls();
                    MyDataPagerEventArgs myArgs = new MyDataPagerEventArgs(PageIndex);
                    OnButtonPageClick(myArgs);
                    handled = true;
                }
            }
            this.RaiseBubbleEvent(source, args);
            return handled;
        }

        /// <summary>
        /// 
        /// </summary>
        public event MyDataPagerEventHandler ButtonPageClick
        {
            add
            {
                base.Events.AddHandler(ButtonPageClickObject, value);
            }
            remove
            {
                base.Events.RemoveHandler(ButtonPageClickObject, value);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="e"></param>
        protected virtual void OnButtonPageClick(MyDataPagerEventArgs e)
        {
            MyDataPagerEventHandler ButtonPageClickHandler = (MyDataPagerEventHandler)Events[ButtonPageClickObject];
            if (ButtonPageClickHandler != null)
            {
                ButtonPageClickHandler(this, e);
            }
        }      
    }

    public delegate void MyDataPagerEventHandler(object sender,MyDataPagerEventArgs e);

    public class MyDataPagerEventArgs : EventArgs
    {
        public MyDataPagerEventArgs(int newPageIndex)
        {
            this.NewPageIndex = newPageIndex;
        }
        public int NewPageIndex
        {
            set;
            get;
        }
    }

 

用法如下,要与GridView配合使用

        private void BindData()
        {
DataTable dtResult
= .....
if (dtResult.Rows.Count > 0) { gvResult.PageSize = 10; gvResult.DataSource = dtResult; gvResult.DataBind(); ucDataPagerHeader.PageCount = gvResult.PageCount; ucDataPagerHeader.PageIndex = gvResult.PageIndex; } }

 

        protected void ucDataPagerHeader_ButtonPageClick(object sender, MyDataPagerEventArgs e)
        {
            try
            {
                gvResult.PageIndex = e.NewPageIndex;
                BindData();
            }
            catch
            {
            }
        }

 

 

 

posted on 2012-04-24 10:19  啊熊  阅读(186)  评论(0编辑  收藏  举报