【开源】QuickPager ASP.NET2.0分页控件V2.0.0.1——分页控件的源码(一) 主体

时间:2022-04-28
本文章向大家介绍【开源】QuickPager ASP.NET2.0分页控件V2.0.0.1——分页控件的源码(一) 主体,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
namespace JYK.Controls
{
    /**//// <summary>
    /// 分页控件
    /// PageGetData.cs 负责提取数据
    /// PageSQL.cs 负责生成SQl语句
    /// PageUI.cs 负责分页控件的页面内容
    /// </summary>
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:JYKPage runat=server></{0}:JYKPage>")]
    public class JYKPage : WebControl, INamingContainer, IPostBackEventHandler 

    {
        /**//// <summary>
        /// 访问数据库用的实例
        /// </summary>
        private  DataAccessHelp dal = null;

        /**//// <summary>
        /// 生成SQL语句的部分
        /// </summary>
        private PageManage.PageSQL MgrPageSQL = null;

        /**//// <summary>
        /// 提取数据的部分
        /// </summary>
        private PageManage.PageGetData MgrGetData = null;

        /**//// <summary>
        /// 提取数据的部分
        /// </summary>
        private PageManage.PageUI MgrPageUI = null;

        /**//// <summary>
        /// 设置显示数据的控件
        /// </summary>
        public System.Web.UI.WebControls.WebControl ControlGrid;
 
        成员#region 成员
        
        页面显示#region 页面显示
        /**//// <summary>
        /// 上一页 的文字
        /// </summary>
        private string pPrevText = "上一页";   //上一页

        /**//// <summary>
        /// 下一页 的文字
        /// </summary>
        private string pNextText = "下一页";   //下一页

        /**//// <summary>
        /// 首页 的文字
        /// </summary>
        private string pFirstText = "首页";   //首页

        /**//// <summary>
        /// 末页 的文字
        /// </summary>
        private string pLastText = "末页";   //末页
        
        /**//// <summary>
        /// 去指定页号 的文字
        /// </summary>
        private string pGOText = "GO";   //GO
        
        #endregion

        #endregion

        属性#region 属性

        存放分页算法模版的属性#region 存放分页算法模版的属性
        //记录数
        记录相关#region 记录相关
        一页的记录数#region 一页的记录数
        /**//// <summary>
        /// 一页的记录数
        /// </summary>
        [Bindable(true)]
        [Category("记录集")]
        [DefaultValue("")]
        [Localizable(true)]
        public Int32 PageSize
        {
            set { ViewState["PageSize"] = value; }
            get
            {
                //没有设置的话,使用默认值:一页20条记录
                if (ViewState["PageSize"] == null) { return 20; }
                else { return (Int32)ViewState["PageSize"]; }
            }
        }
        #endregion

        符合条件的记录数#region 符合条件的记录数
        /**//// <summary>
        /// 符合条件的记录数
        /// </summary>
        [Bindable(true)]
        [Category("记录集")]
        [DefaultValue("")]
        [Localizable(true)]
        public Int32 PageRecordCount
        {
            set { ViewState["PageRecordCount"] = value; }
            get
            {
                //没有设置的话,返回 0 
                if (ViewState["PageRecordCount"] == null) { return 0; }
                else { return (Int32)ViewState["PageRecordCount"]; }
            }
        }
        #endregion

        页数#region 页数
        /**//// <summary>
        /// 页数
        /// </summary>
        [Bindable(true)]
        [Category("记录集")]
        [DefaultValue("")]
        [Localizable(true)]
        public Int32 PageCount
        {
            set { ViewState["PageCount"] = value; }
            get
            {
                //没有设置的话,返回 0 
                if (ViewState["PageCount"] == null) { return 0; }
                else { return (Int32)ViewState["PageCount"]; }
            }
        }
        #endregion

        想要查看哪一页的数据#region 想要查看哪一页的数据
        /**//// <summary>
        /// 想要查看那一页的数据
        /// </summary>
        [Bindable(true)]
        [Category("记录集")]
        [DefaultValue("")]
        [Localizable(true)]
        public Int32 PageIndex
        {
            set { ViewState["PageIndex"] = value; }
            get
            {
                if (ViewState["PageIndex"] == null) { return 1; }
                else { return (Int32)ViewState["PageIndex"]; }
            }
        }
        #endregion

        #endregion
        //SQL语句的基础
        分页算法需要的属性#region 分页算法需要的属性
        表名、视图名#region 表名、视图名
        /**//// <summary>
        /// 表名、视图名
        /// </summary>
        [Bindable(true)]
        [Category("SQL语句")]
        [DefaultValue("")]
        [Localizable(true)]
        public string TableName
        {
            set { ViewState["TableName"] = value; }
            get
            {
                if (ViewState["TableName"] == null)
                {
                    if ((base.Site != null) && base.Site.DesignMode)
                    {
                        return "TableName";
                    }
                    else
                    {
                        CommandClass.MsgBox("没有设置TableName属性!", true);
                        return null;
                    }
                }
                else { return ViewState["TableName"].ToString(); }
            }
        }
        #endregion

        表的主键#region 表的主键
        /**//// <summary>
        /// 表的主键
        /// </summary>
        [Bindable(true)]
        [Category("SQL语句")]
        [DefaultValue("")]
        [Localizable(true)]
        public string TableIDColumns
        {
            set { ViewState["TableIDColumns"] = value; }
            get
            {
                if (ViewState["TableIDColumns"] == null)
                {
                    if ((base.Site != null) && base.Site.DesignMode)
                    {
                        return "TableIDColumns";
                    }
                    else
                    {
                        CommandClass.MsgBox("没有设置TableIDColumns属性!", true);
                        return null;

                    }
                }
                else { return ViewState["TableIDColumns"].ToString(); }
            }
        }
        #endregion

        显示的字段#region 显示的字段
        /**//// <summary>
        /// 显示的字段
        /// </summary>
        [Bindable(true)]
        [Category("SQL语句")]
        [DefaultValue("")]
        [Localizable(true)]
        public string TableShowColumns
        {
            set { ViewState["TableShowColumns"] = value; }
            get
            {
                if (ViewState["TableShowColumns"] == null) { return "*"; }
                else { return ViewState["TableShowColumns"].ToString(); }
            }
        }
        #endregion

        排序字段#region 排序字段
        /**//// <summary>
        /// 排序字段
        /// </summary>
        [Bindable(true)]
        [Category("SQL语句")]
        [DefaultValue("")]
        [Localizable(true)]
        public string TableOrderColumns
        {
            set { ViewState["TableOrderColumns"] = value; }
            get
            {
                if (ViewState["TableOrderColumns"] == null)
                {
                    if ((base.Site != null) && base.Site.DesignMode)
                    {
                        return "TableOrderColumns";
                    }
                    else
                    {
                        CommandClass.MsgBox("没有设置TableOrderColumns属性!", true);
                        return null;
                    }
                }
                else { return ViewState["TableOrderColumns"].ToString(); }
            }
        }
        
        #endregion

        查询条件#region 查询条件
        /**//// <summary>
        /// 查询条件
        /// </summary>
        [Bindable(true)]
        [Category("SQL语句")]
        [DefaultValue("")]
        [Localizable(true)]
        public string TableQuery
        {
            set { ViewState["TableQuery"] = value; }
            get
            {
                if (ViewState["TableQuery"] == null)
                    return "";
                else
                    return ViewState["TableQuery"].ToString();
            }
        }
        
        #endregion
        #endregion

        //SQL模版
        分页算法模版#region 分页算法模版
        /**//// <summary>
        /// 第一页的分页算法模版
        /// </summary>
        [Bindable(true)]
        [Category("SQL语句模版")]
        [DefaultValue("")]
        [Localizable(true)]
        public string SQLGetFirstPage
        {
            set {  ViewState["FirstPageSQL"] = value;  }
            get
            {
                return ViewState["FirstPageSQL"] == null ? null : ViewState["FirstPageSQL"].ToString();
            }
        }
        #endregion

        指定页号的分页算法模版#region 指定页号的分页算法模版
        /**//// <summary>
        /// 指定页号的分页算法模版
        /// </summary>
        [Bindable(true)]
        [Category("SQL语句模版")]
        [DefaultValue("")]
        [Localizable(true)]
        public string SQLGetNextPage
        {
            set
            {
                ViewState["NextPageSQL"] = value;
            }
            get
            {
                return ViewState["NextPageSQL"]==null?null:ViewState["NextPageSQL"].ToString();
            }
        }
        #endregion

        指定页号的分页算法模版#region 指定页号的分页算法模版
        /**//// <summary>
        /// 最后一页的分页算法模版
        /// </summary>
        [Bindable(true)]
        [Category("SQL语句模版")]
        [DefaultValue("")]
        [Localizable(true)]
        public string SQLGetLastPage
        {
            set
            {
                ViewState["LastPageSQL"] = value;
            }
            get
            {
                return ViewState["LastPageSQL"] == null ? null : ViewState["LastPageSQL"].ToString();
            }
        }
        #endregion

        #endregion

        //UI
        页面显示 上一页、下一页#region 页面显示 上一页、下一页

        上一页#region 上一页
        /**//// <summary>
        /// 上一页
        /// </summary>
        [Bindable(true)]
        [Category("页面显示")]
        [DefaultValue("")]
        [Localizable(true)]
        public string PageUIPrev
        {
            get { return pPrevText; }
            set { pPrevText = value; }
        }
        #endregion

        下一页#region 下一页
        /**//// <summary>
        /// 下一页
        /// </summary>
        [Bindable(true)]
        [Category("页面显示")]
        [DefaultValue("")]
        [Localizable(true)]
        public string PageUINext
        {
            get { return pNextText; }
            set { pNextText = value; }
        }
        #endregion

        首页#region 首页
        /**//// <summary>
        /// 首页
        /// </summary>
        [Bindable(true)]
        [Category("页面显示")]
        [DefaultValue("")]
        [Localizable(true)]
        public string PageUIFirst
        {
            get { return pFirstText; }
            set { pFirstText = value; }
        }
        #endregion

        末页#region 末页
        /**//// <summary>
        /// 末页
        /// </summary>
        [Bindable(true)]
        [Category("页面显示")]
        [DefaultValue("")]
        [Localizable(true)]
        public string PageUILast
        {
            get { return pLastText; }
            set { pLastText = value; }
        }
        #endregion

        GO#region GO
        /**//// <summary>
        /// GO
        /// </summary>
        [Bindable(true)]
        [Category("页面显示")]
        [DefaultValue("")]
        [Localizable(true)]
        public string PageUIGO
        {
            get { return pGOText; }
            set { pGOText = value; }
        }
        #endregion

        #endregion

        页面导航的数量#region 页面导航的数量
        /**//// <summary>
        /// 
        /// </summary>
        public Int32 NaviCount
        {
            set { ViewState["NaviCount"] = value;  }
            get
            {
                if (ViewState["NaviCount"] == null)
                    return 10;
                else
                    return (Int32)ViewState["NaviCount"];
            }
        }
        #endregion

        页面显示 记录数、页数#region 页面显示 记录数、页数

        共{0}条记录数#region 共{0}条记录数
        /**//// <summary>
        /// 共{0}条记录数
        /// </summary>
        [Bindable(true)]
        [Category("记录信息")]
        [DefaultValue("")]
        [Localizable(true)]
        public string PageUIAllCount
        {
            set { ViewState["PageUIAllCount"] = value; }
            get
            {
                if (ViewState["PageUIAllCount"] == null)
                    return "共<font style="color:Red;">{0}</font>条记录数";
                else
                    return ViewState["PageUIAllCount"].ToString();
            }
        }
        #endregion

        第{0}/{1}页#region 第{0}/{1}页
        /**//// <summary>
        /// 第{0}/{1}页
        /// </summary>
        [Bindable(true)]
        [Category("记录信息")]
        [DefaultValue("")]
        [Localizable(true)]
        public string PageUIAllPage
        {
            set { ViewState["PageUIAllPage"] = value; }
            get
            {
                if (ViewState["PageUIAllPage"] == null)
                    return "第<font style="color:Red;">{0}</font>/<font style="color:Red;">{1}</font>页";
                else
                    return ViewState["PageUIAllPage"].ToString();
            }
        }
        #endregion

        每页{0}条记录#region 每页{0}条记录
        /**//// <summary>
        /// 共{0}条记录数
        /// </summary>
        [Bindable(true)]
        [Category("记录信息")]
        [DefaultValue("")]
        [Localizable(true)]
        public string PageUIAllPageCount
        {
            set { ViewState["PageUIAllPageCount"] = value; }
            get
            {
                if (ViewState["PageUIAllPageCount"] == null)
                    return "每页<font style="color:Red;">{0}</font>条记录";
                else
                    return ViewState["PageUIAllPageCount"].ToString();
            }
        }
        #endregion

        #endregion

        显示数据的控件的ID#region 显示数据的控件的ID
        /**//// <summary>
        /// 共{0}条记录数
        /// </summary>
        [Bindable(true)]
        [Category("显示数据的控件ID")]
        [DefaultValue("")]
        [Localizable(true)]
        public string ControlGridID
        {
            set { ViewState["ControlGridID"] = value; }
            get
            {
                if (ViewState["ControlGridID"] == null)
                    return null;
                else
                    return ViewState["ControlGridID"].ToString();
            }
        }
        #endregion


        数据访问实例的设置#region 数据访问实例的设置
        /**//// <summary>
        /// 设置数据访问层的实例
        /// </summary>
        public DataAccessHelp DAL
        {
            set { dal = value; }
            get
            {
                if (dal == null)
                    dal = new DataAccessHelp();

                return dal;
            }
        }
        #endregion

        管理部分#region 管理部分
        /**//// <summary>
        /// 提取数据的实例
        /// </summary>
        public PageManage.PageGetData ManagerGetData
        {
            set { MgrGetData = value; }
            get
            {
                PageManage.PageGetData tmp = MgrGetData;
                if (tmp == null)
                {
                    tmp = new JYK.Controls.PageManage.PageGetData();
                    MgrGetData = tmp;
                }

                if (tmp.myPage == null)
                    tmp.myPage = this;

                return tmp;
            }
        }

        /**//// <summary>
        /// 提取数据的实例
        /// </summary>
        public PageManage.PageSQL ManagerPageSQL
        {
            set { MgrPageSQL = value; }
            get
            {
                PageManage.PageSQL tmp = MgrPageSQL;
                if (tmp == null)
                {
                    tmp = new JYK.Controls.PageManage.PageSQL();
                    MgrPageSQL = tmp;
                }

                if (tmp.myPage == null)
                    tmp.myPage = this;

                return tmp;
            }
        }

        /**//// <summary>
        /// 提取数据的实例
        /// </summary>
        public PageManage.PageUI ManagerPageUI
        {
            set { MgrPageUI = value; }
            get
            {
                PageManage.PageUI tmp = MgrPageUI;
                if (tmp == null)
                {
                    tmp = new JYK.Controls.PageManage.PageUI();
                    MgrPageUI = tmp;
                }

                if (tmp.myPage == null)
                    tmp.myPage = this;

                return tmp;
            }
        }
        #endregion

        #endregion

        函数#region 函数
        /**//// <summary>
        /// 显示第一页的数据
        /// </summary>
        public void BindFirstPage()
        {
            //生成SQL语句和获取记录总数
            this.ManagerPageSQL.CreateSQL();
            //绑定第一页的数据
            myDataBind(1);
        }
        #endregion

        绘制UI CreateChildControls()#region 绘制UI CreateChildControls()
        /**//// <summary>
        /// 绘制UI
        /// </summary>
        protected override void CreateChildControls()
        {
            base.CreateChildControls();

            LinkButton btn = new LinkButton();
            btn.ID = "Page_Button";
            btn.Text = "";//所有的回发事件
            //btn.Click += new EventHandler(btn_Click);   //添加事件
            this.Controls.Add(btn);

            ManagerPageUI.AddPageUI();  //添加页面显示

            Page_Click();   //调用分页事件
        }
        #endregion

        响应分页事件#region 响应分页事件
        /**//// <summary>
        /// 响应分页事件
        /// </summary>
        private void Page_Click()
        {
            //string a = base.Page.Request.Form["__EVENTTARGET"];
            string PageIndex = base.Page.Request.Form["__EVENTARGUMENT"];

            if (!Functions.IsInt(PageIndex))
                return;
            else
                myDataBind(Int32.Parse(PageIndex));
        }

        /**//// <summary>
        /// 绑定控件
        /// </summary>
        private void myDataBind(Int32 PageIndex)
        {
            if (ControlGrid == null)
            {
                string CID = this.ControlGridID;
                if (CID == null)
                    return;
                else
                    ControlGrid = (WebControl)base.Page.FindControl(CID);
            }

            Int32 NoCount = this.NaviCount; //一组页号的数量

            bool isNavi = false;
            Int32 tmpPageIndex = this.PageIndex;

            switch (PageIndex)
            {
                case 1:   //首页
                    isNavi = true;
                    break;

                case -3:
                    //上一页
                    PageIndex = this.PageIndex - 1;
                    break;

                case -2:
                    //下一页
                    PageIndex = this.PageIndex + 1;
                    if (PageIndex % NoCount == 1)
                        isNavi = true;

                    break;

                case -99:   //前导
                    if (tmpPageIndex % NoCount == 0)
                        PageIndex = tmpPageIndex - NoCount;
                    else
                        PageIndex = tmpPageIndex / NoCount * NoCount;

                    isNavi = true;
                    break;

                case -88:   //后导
                    if (tmpPageIndex % NoCount == 0)
                        PageIndex = tmpPageIndex + NoCount;
                    else 
                        PageIndex = (this.PageIndex / NoCount + 1) * NoCount + 1;

                    isNavi = true;
                    break;

                

                default:
                    isNavi = false ;
                    break;
            }

            if (PageIndex == this.PageCount)
                isNavi = true;  //末页
                    
            this.PageIndex = PageIndex;

            //获取记录集
            DataTable dt = this.ManagerGetData.GetDataTable(PageIndex);
            //通过(好像是反射)来设置 DataSource属性。
            Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateSet(ControlGrid, null, "datasource", new object[] { dt }, null, null);
            ControlGrid.DataBind();

            //重新显示当前页号
            this.ManagerPageUI.UpdatePageIndex();

            //重新显示页号当航
            if (isNavi)
                this.ManagerPageUI.ReloadPageNavi();
            else         
                this.ManagerPageUI.UpdatePageNavi();
            //base.Page.Response.Write(a + "+" + PageIndex);
        }
        #endregion

        /**//// <summary>
        /// 接收分页控件的回发事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void btn_Click(object sender, EventArgs e)
        {
            //throw new NotImplementedException();
            //base.Page.Response.Write("ss");

        }

        /**//// <summary>
        /// 分页的回发事件,没有成功
        /// </summary>
        /// <param name="PageIndex"></param>
        public void RaisePostBackEvent(string PageIndex)
        {
            //base.Page.Response.Write("www");
            //Page_Click();
        }


        设计时支持#region 设计时支持
        /**//// <summary>
        /// 设计时支持
        /// </summary>
        /// <param name="output"></param>
        protected override void Render(HtmlTextWriter output)
        {
            if ((base.Site != null) && base.Site.DesignMode)
            {
                output.Write("<div style='TEXT-ALIGN: center;width:100%'>第1/100页 &nbsp;&nbsp; 首页&nbsp;&nbsp;上一页&nbsp;&nbsp;[1][2][3] &nbsp;&nbsp; 下一页 &nbsp;&nbsp; 末页 &nbsp;&nbsp; 共1000条记录</div>");
            }
            else
            {
                //Page_Click();
                output.Write("<div id='" + this.ClientID + "Page' style='TEXT-ALIGN: center;width:90%'>");
                base.Render(output);
                output.Write("</div>");
            }

        }
        #endregion

    }
}