无刷新分页控件

来源:互联网 发布:淘宝订单查询系统 编辑:程序博客网 时间:2024/04/20 06:02

using System;

using System.Text;

using System.Collections;

using System.Collections.Generic;

using System.Text.RegularExpressions;

using System.IO;

using System.Web.UI;

using System.Globalization;

using System.Web.UI.WebControls;

using System.Web.UI.HtmlControls;

using NetFocus.Web.Core;

namespace NetFocus.Web.Applications.PersonalBlog

{

    public interface IPageIndexChangedEventHandler

    {

        void BindData(int pageIndex, int pageSize);

    }

    public class AjaxPager : Control, ICallbackEventHandler, INamingContainer

    {

        #region Member Variables

        private int lowerBound;

        private int upperBound;

        private HyperLink previousLink;

        private HyperLink nextLink;

        private HyperLink firstLink;

        private HyperLink lastLink;

        private Control targetControl;

        #endregion

        #region Public Properties

        public int PageIndex

        {

            get

            {

                int pageIndex = 1;

                if (Page != null && Page.IsPostBack && ViewState["PageIndex"] != null)

                {

                    pageIndex = (int)ViewState["PageIndex"];

                }

                if (pageIndex < 1)

                {

                    return 1;

                }

                else

                {

                    return pageIndex;

                }

            }

            set

            {

                ViewState["PageIndex"] = value;

            }

        }

        public int PageSize

        {

            get

            {

                int pageSize = Convert.ToInt32(ViewState["PageSize"]);

                if (pageSize <= 0)

                {

                    return 10;

                }

                return pageSize;

            }

            set

            {

                ViewState["PageSize"] = value;

            }

        }

        public int LeftLength

        {

            get

            {

                return PageLength / 2;

            }

        }

        public int RightLength

        {

            get

            {

                return PageLength / 2;

            }

        }

        public int PageLength

        {

            get

            {

                int pageLength = Convert.ToInt32(ViewState["PageLength"]);

                if (pageLength <= 3)

                    return 3;

                if (pageLength % 2 == 0)

                {

                    return pageLength + 1;

                }

                return pageLength;

            }

            set

            {

                ViewState["PageLength"] = value;

            }

        }

        public int TotalPages

        {

            get

            {

                return CalculateTotalPages(TotalRecords);

            }

        }

        public int TotalRecords

        {

            get

            {

                return Convert.ToInt32(ViewState["TotalRecords"]);

            }

            set

            {

                ViewState["TotalRecords"] = value;

            }

        }

        public string DataWrapperID

        {

            get

            {

                string s = ViewState["DataWrapperID"] as string;

                if (s == null)

                {

                    s = string.Empty;

                }

                return s;

            }

            set

            {

                ViewState["DataWrapperID"] = value;

            }

        }

        public string TargetControlID

        {

            get

            {

                string s = ViewState["TargetControlID"] as string;

                if (s == null)

                {

                    s = string.Empty;

                }

                return s;

            }

            set

            {

                ViewState["TargetControlID"] = value;

            }

        }

        #endregion

        #region Overrides Methods

        protected override void OnLoad(EventArgs e)

        {

            if (!Page.IsPostBack)

            {

                CreatePageLinks();

                RegisterClientScripts();

            }

            else

            {

                targetControl = Globals.FindControl(this, TargetControlID);

            }

        }

        protected override void Render(HtmlTextWriter writer)

        {

            if (TotalPages <= 1)

            {

                return;

            }

            RenderFirst(writer);

            RenderPrevious(writer);

            RenderPagingButtons(writer);

            RenderNext(writer);

            RenderLast(writer);

        }

        #endregion

        #region Public Methods

        public virtual int CalculateTotalPages(int totalRecords)

        {

            int totalPagesAvailable;

            if (totalRecords == 0)

            {

                return 0;

            }

            totalPagesAvailable = totalRecords / PageSize;

            if ((totalRecords % PageSize) > 0)

            {

                totalPagesAvailable++;

            }

            return totalPagesAvailable;

        }

        #endregion

        #region ICallbackEventHandler Implementation

        public void RaiseCallbackEvent(string pageIndex)

        {

            int currentPageIndex = int.Parse(pageIndex);

            if (currentPageIndex != PageIndex)

            {

                ((IPageIndexChangedEventHandler)targetControl).BindData(currentPageIndex, PageSize);

            }

            PageIndex = currentPageIndex;

            CreatePageLinks();

        }

        public string GetCallbackResult()

        {

            return RenderControl(targetControl);

        }

        #endregion

    }

}

 

 

private void RenderFirst(HtmlTextWriter writer)

        {

            if ((PageIndex > LeftLength + 1) && (TotalPages > PageLength))

            {

                firstLink.RenderControl(writer);

                LiteralControl l = new LiteralControl("&nbsp;...&nbsp;");

                l.RenderControl(writer);

            }

        }

        private void RenderLast(HtmlTextWriter writer)

        {

            if (((PageIndex + RightLength) < TotalPages) && (TotalPages > PageLength))

            {

                LiteralControl l = new LiteralControl("&nbsp;...&nbsp;");

                l.RenderControl(writer);

                lastLink.RenderControl(writer);

            }

        }

        private void RenderPrevious(HtmlTextWriter writer)

        {

            if (PageIndex > 1)

            {

                previousLink.RenderControl(writer);

                Literal l = new Literal();

                l.Text = "&nbsp;";

                l.RenderControl(writer);

            }

        }

        private void RenderNext(HtmlTextWriter writer)

        {

            if (PageIndex < TotalPages)

            {

                Literal l = new Literal();

                l.Text = "&nbsp;";

                l.RenderControl(writer);

                nextLink.RenderControl(writer);

            }

        }

        private void RenderButtonRange(int start, int end, HtmlTextWriter writer)

        {

            for (int i = start; i <= end; i++)

            {

                if (PageIndex == i)

                {

                    Literal l = new Literal();

                    //l.Text = "<span class=/"currentPage/">[" + i.ToString() + "]</span>";

                    l.Text = i.ToString();

                    l.RenderControl(writer);

                }

                else

                {

                    Controls[i - start].RenderControl(writer);

                }

                if (i < end)

                {

                    writer.Write(" ");

                }

            }

        }

        private void RenderPagingButtons(HtmlTextWriter writer)

        {

            RenderButtonRange(lowerBound, upperBound, writer);

        }

        private string RenderControl(Control control)

        {

            StringWriter writer1 = new StringWriter(CultureInfo.InvariantCulture);

            HtmlTextWriter writer2 = new HtmlTextWriter(writer1);

            control.RenderControl(writer2);

            writer2.Flush();

            writer2.Close();

            return writer1.ToString();

        }

        private string CreateOnClickScript(int pageIndex)

        {

            return string.Format("javascript:turnPage({0});", pageIndex);

        }

        private void InitPageBounds()

        {

            lowerBound = PageIndex - LeftLength;

            upperBound = PageIndex + RightLength;

            if (lowerBound < 1)

            {

                upperBound += 1 - lowerBound;

                lowerBound = 1;

            }

            if (upperBound > TotalPages)

            {

                lowerBound -= upperBound - TotalPages;

                upperBound = TotalPages;

            }

            if (lowerBound < 1)

            {

                lowerBound = 1;

            }

            if (upperBound > TotalPages)

            {

                upperBound = TotalPages;

            }

        }

        private void AddPageLinks()

        {

            InitPageBounds();

            HyperLink link;

            for (int i = lowerBound; i <= upperBound; i++)

            {

                link = new HyperLink();

                link.EnableViewState = false;

                link.Text = i.ToString();

                link.ID = i.ToString();

                link.NavigateUrl = CreateOnClickScript(i);

                Controls.Add(link);

            }

        }

        private void AddFirstLastLinks()

        {     

            firstLink = new HyperLink();

            firstLink.ID = "First";

            firstLink.Text = "µÚÒ»Ò³";

            firstLink.NavigateUrl = CreateOnClickScript(1);

            Controls.Add(firstLink);

            lastLink = new HyperLink();

            lastLink.ID = "Last";

            lastLink.Text = "×îºóÒ»Ò³";

            lastLink.NavigateUrl = CreateOnClickScript(TotalPages);

            Controls.Add(lastLink);

        }

        private void AddPreviousNextLinks()

        {

            previousLink = new HyperLink();

            previousLink.ID = "Prev";

            previousLink.Text = "ÉÏÒ»Ò³";

            previousLink.NavigateUrl = CreateOnClickScript(PageIndex - 1);

            Controls.Add(previousLink);

            nextLink = new HyperLink();

            nextLink.ID = "Next";

            nextLink.Text = "ÏÂÒ»Ò³";

            nextLink.NavigateUrl = CreateOnClickScript(PageIndex + 1);

            Controls.Add(nextLink);

        }

        private void CreatePageLinks()

        {

            Controls.Clear();

            AddPageLinks();

            AddPreviousNextLinks();

            AddFirstLastLinks();

        }

        private void RegisterClientScripts()

        {

            string turnPageScript = "function turnPage(pageIndex) { CallServer(pageIndex,'" + DataWrapperID + "');}";

            string receiveCallBackScript = "function ReceiveCallback(arg,context){ document.getElementById(context).innerHTML = arg; }";

            string callbackReference = Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveCallback", "context", false);

            Page.ClientScript.RegisterClientScriptBlock(this.GetType(), this.ClientID + "TurnPageScript", turnPageScript, true);

            Page.ClientScript.RegisterClientScriptBlock(this.GetType(), this.ClientID + "ReceiveCallBackScript", receiveCallBackScript, true);

            Page.ClientScript.RegisterClientScriptBlock(this.GetType(), this.ClientID + "CallServer", string.Format("function CallServer(arg,context){{ {0} }}", callbackReference), true);

        }

原创粉丝点击