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

namespace JYK.Controls.PageManage
{
    /**//// <summary>
    /// 生成分页控件需要的SQL语句
    /// </summary>
    public class PageSQL
    {
        /**//// <summary>
        /// 分页控件的实例
        /// </summary>
        public JYKPage myPage = null;
     
        生成分页用的SQL语句的模版#region 生成分页用的SQL语句的模版
        生成首页的SQL语句#region 生成首页的SQL语句
        /**//// <summary>
        /// 生成首页的SQL语句
        /// </summary>
        public virtual void CreateFirstPageSQL()
        {
            //第一页的SQL语句,
            //select top PageSize * from table where  order by 
            System.Text.StringBuilder sql = new StringBuilder(100);
            sql.Append("set nocount on; ");
            sql.Append("select top ");
            sql.Append(myPage.PageSize );
            sql.Append(" ");
            sql.Append(myPage.TableShowColumns);
            sql.Append(" from ");
            sql.Append(myPage.TableName );
            sql.Append(" ");

            //查询条件
            if (myPage.TableQuery.Length > 0)
            {
                sql.Append(" where ");
                sql.Append(myPage.TableQuery);
            }

            sql.Append(" order by ");
            sql.Append(myPage.TableOrderColumns );
            sql.Append(" set nocount off; ");
            
            //保存
            myPage.SQLGetFirstPage = sql.ToString();
            sql.Length = 0;

        }
        #endregion

        生成任意页的SQL语句#region 生成任意页的SQL语句
        /**//// <summary>
        /// 生成任意页的SQL语句的模版
        /// </summary>
        public virtual void CreateNextPageSQL()
        {
            //指定页号的SQL语句的模版
            //SQL 2005 数据库,使用 Row_Number()分页
            //set nocount on;
            //with t_pager as (
            //   select *,rn = ROW_NUMBER() OVER (ORDER BY id desc) FROM test_indexorder
            // )
            //SELECT id,name,content,co1,co2,co3,co4,co5 from t_rn WHERE rn between 19007 and 19057;

            System.Text.StringBuilder sql = new StringBuilder(500);
            sql.Append("set nocount on; ");
            sql.Append("with t_pager as (select myIndex = ROW_NUMBER() OVER (ORDER BY ");
            sql.Append(myPage.TableOrderColumns);
            sql.Append(" ),* from ");
            sql.Append(myPage.TableName);

            //查询条件
            if (myPage.TableQuery.Length > 0)
            {
                sql.Append(" where ");
                sql.Append(myPage.TableQuery);
            }

            sql.Append(" ) select  ");
            sql.Append(myPage.TableShowColumns );
            sql.Append("  from t_pager where myIndex between {0} and {1} ");
              
            sql.Append(" set nocount off; ");
            
            //保存
            myPage.SQLGetNextPage = sql.ToString();
            sql.Length = 0;
        }
        #endregion

        生成最后一页的SQL语句#region 生成最后一页的SQL语句
        /**//// <summary>
        /// 最后一页的SQL语句。依据算法而定,不是所有的情况都需要实现
        /// </summary>
        public virtual void CreateLastPageSQL()
        {
         
        }
        #endregion

        #endregion


        生成SQL语句模版、获取总记录数,计算页数。#region 生成SQL语句模版、获取总记录数,计算页数。
        public void CreateSQL()
        {
            //重新生成SQL语句模版
            CreateFirstPageSQL();
            CreateNextPageSQL();
            CreateLastPageSQL();

            //获取总记录数,计算页数。

            System.Text.StringBuilder sql = new StringBuilder();
            sql.Append("select count(1) from ");
            sql.Append(myPage.TableName);
            if (myPage.TableQuery.Length > 0)
            {
                sql.Append(" where ");
                sql.Append(myPage.TableQuery);
            }

            //总记录数
            string tmpCount = myPage.DAL.RunSqlGetFirstColValue(sql.ToString());
            if (tmpCount != null)
            {
                //计算页数
                Int32 intCount = Int32.Parse(tmpCount);
                myPage.PageRecordCount = intCount;
                Int32 tmpPageCount = intCount / myPage.PageSize;
                tmpPageCount += intCount % myPage.PageSize == 0 ? 0 : 1;

                myPage.PageCount = tmpPageCount;
            }
        }
        #endregion

        获取分页用的SQL语句#region 获取分页用的SQL语句
        /**//// <summary>
        /// 传入页号,返回指定页号的SQL语句
        /// </summary>
        /// <param name="PageIndex">页号</param>
        public string  GetSQL(Int32 PageIndex)
        {
            
            if (PageIndex == 1)
            {
                //指定页号
                myPage.PageIndex = 1;
                return myPage.SQLGetFirstPage;
            }
            else
            {
                if (PageIndex < 1)
                    PageIndex = 1;

                if (PageIndex > myPage.PageCount)
                    PageIndex = myPage.PageCount;

                //指定页号
                myPage.PageIndex = PageIndex;

                Int32 p1 = myPage.PageSize * (PageIndex - 1) + 1;
                Int32 p2 = p1 + myPage.PageSize - 1;

                return string.Format(myPage.SQLGetNextPage, p1, p2);

            }
        }
        #endregion


    }
}
namespace JYK.Controls.PageManage
{
    /**//// <summary>
    /// 负责绘制分页控件的显示内容
    /// </summary>
    public class PageUI
    {
        /**//// <summary>
        /// 分页控件的实例
        /// </summary>
        public JYKPage myPage = null;

        /**//// <summary>
        /// 客户端ID
        /// </summary>
        public string BtnClientID = "";

        /**//// <summary>
        /// 添加UI
        /// </summary>
        public virtual void AddPageUI()
        {
            AddPageDataInfo();
            AddPageNavi();
            AddPageText();
         }

        添加记录数等的显示#region 添加记录数等的显示
        /**//// <summary>
        /// 添加记录数等的显示
        /// </summary>
        public  virtual void AddPageDataInfo()
        {
            string str = myPage.PageUIAllCount.Replace("{0}", myPage.PageRecordCount.ToString());
            LiteralControl lc1 = new LiteralControl();
            lc1.ID = "p_data1";
            lc1.Text = str;
            myPage.Controls.Add(lc1);

            str = myPage.PageUIAllPage.Replace("{0}", myPage.PageIndex.ToString()).Replace("{1}", myPage.PageCount.ToString());
            lc1 = new LiteralControl();
            lc1.ID = "p_data2";
            lc1.Text = str;
            myPage.Controls.Add(lc1);

            str = myPage.PageUIAllPageCount.Replace("{0}", myPage.PageSize.ToString());
            lc1 = new LiteralControl();
            lc1.ID = "p_data3";
            lc1.Text = str;
            myPage.Controls.Add(lc1);
 
        }
        #endregion

        修改当前页号#region 修改当前页号
        /**//// <summary>
        /// 修改当前页号
        /// </summary>
        public virtual void UpdatePageIndex()
        {
            string str = myPage.PageUIAllPage.Replace("{0}", myPage.PageIndex.ToString()).Replace("{1}", myPage.PageCount.ToString());
            LiteralControl lc1 = (LiteralControl)myPage.FindControl("p_data2");
            lc1.Text = str;

        }
        #endregion

        添加上一页等#region 添加上一页等
        /**//// <summary>
        /// 添加上一页等
        /// </summary>
        public virtual void AddPageText()
        {
            BtnClientID = myPage.ClientID + "_dh";

            System.Text.StringBuilder str = new StringBuilder();

            首页#region 首页
            str.Append("<a id=\"P_First\" href=\"");
            str.Append(GetAHref(1));
            str.Append("\" class=\"");
            str.Append(myPage.CssClass);
            str.Append("\" >");
            str.Append(myPage.PageUIFirst);
            str.Append("</a>&nbsp;&nbsp;");

            LiteralControl lc1 = new LiteralControl();
            lc1.ID = "p_First";
            lc1.Text = str.ToString();
            myPage.Controls.Add(lc1);
            str.Length = 0;
            #endregion

            上一页#region 上一页
            str.Append("<a id=\"P_Prev\" href=\"");
            str.Append(GetAHref(-3));
            str.Append("\" class=\"");
            str.Append(myPage.CssClass);
            str.Append("\" >");
            str.Append(myPage.PageUIPrev);
            str.Append("</a>&nbsp;&nbsp;");

            lc1 = new LiteralControl();
            lc1.ID = "P_Prev";
            lc1.Text = str.ToString();
            myPage.Controls.Add(lc1);
            str.Length = 0;
            #endregion

            下一页#region 下一页
            str.Append("<a id=\"P_Next\" href=\"");
            str.Append(GetAHref(-2));
            str.Append("\" class=\"");
            str.Append(myPage.CssClass);
            str.Append("\" >");
            str.Append(myPage.PageUINext);
            str.Append("</a>&nbsp;&nbsp;");

            lc1 = new LiteralControl();
            lc1.ID = "P_Next";
            lc1.Text = str.ToString();
            myPage.Controls.Add(lc1);
            str.Length = 0;
            #endregion

            末页#region 末页
            str.Append("<a id=\"P_Last\" href=\"");
            str.Append(GetAHref(myPage.PageCount));
            str.Append("\" class=\"");
            str.Append(myPage.CssClass);
            str.Append("\" >");
            str.Append(myPage.PageUILast);
            str.Append("</a>&nbsp;&nbsp;");

            lc1 = new LiteralControl();
            lc1.ID = "P_Last";
            lc1.Text = str.ToString();
            myPage.Controls.Add(lc1);
            str.Length = 0;
            #endregion

            GO#region GO
            str.Append("&nbsp;&nbsp;<a id=\"P_GO\" href=\"javascript:_GO()\" class=\"");
            str.Append(myPage.CssClass);
            str.Append("\" >");
            str.Append(myPage.PageUIGO);
            str.Append("</a>&nbsp;&nbsp;");

            JYKTextBox txt = new JYKTextBox();
            txt.ID = "Txt_GO";
            txt.MaxLength = 3;
            txt.Columns = 1;
            myPage.Controls.Add(txt);

            lc1 = new LiteralControl();
            lc1.ID = "P_Go";
            lc1.Text = str.ToString();
            myPage.Controls.Add(lc1);
            str.Length = 0;
            #endregion
        }
        #endregion

        //导航
        页面导航#region 页面导航
        /**//// <summary>
        /// navigation
        /// </summary>
        public virtual void AddPageNavi()
        {
            string str = GetNavi();

            LiteralControl lc1 = new LiteralControl();
            lc1.ID = "p_no";
            lc1.Text = str;
            myPage.Controls.Add(lc1);
           

        }
        #endregion

        修改#region 修改
        /**//// <summary>
        /// 修改
        /// </summary>
        public virtual void UpdatePageNavi()
        {
            Int32  pIndex = myPage.PageIndex;

            LiteralControl lc1 = (LiteralControl)myPage.FindControl("p_no");

            Int32 NoCount = myPage.NaviCount; //一组页号的数量
            //Int32 cp = myPage.PageIndex / NoCount * NoCount;

            if (pIndex % NoCount == 0 || pIndex % NoCount == NoCount - 1)
            {
                lc1.Text = GetNavi();
            }
            else
            {
                string str = lc1.Text.Replace(">-", ";>[");
                str = str.Replace("-<", "]<");
                str = str.Replace("[" + pIndex + "]", "-" + pIndex + "-");
                lc1.Text = str;
            }
        }
        #endregion

        重新计算导航页号#region 重新计算导航页号
        /**//// <summary>
        /// 重新计算导航页号
        /// </summary>
        public virtual void ReloadPageNavi()
        {
            string pIndex = myPage.PageIndex.ToString();
            LiteralControl lc1 = (LiteralControl)myPage.FindControl("p_no");
            lc1.Text = GetNavi();
        }
        #endregion

        生成导航的html#region 生成导航的html
        /**//// <summary>
        /// 生成导航的html
        /// </summary>
        /// <returns></returns>
        private string GetNavi()
        {
            System.Text.StringBuilder str = new StringBuilder();

            Int32 pIndex = myPage.PageIndex;
            
            Int32 NoCount = myPage.NaviCount ; //一组页号的数量
            Int32 cp = pIndex / NoCount;  // *NoCount;

            if (pIndex != NoCount && cp != 0)
            {
                //前导页
                str.Append("&nbsp;<a id=\"P_aa\" href=\"");
                str.Append(GetAHref(-99));
                str.Append("\" class=\"");
                str.Append(myPage.CssClass);
                str.Append("\" >");
                str.Append("");
                str.Append("</a>&nbsp;");
                
                str.Append("&nbsp;");
            }

            Int32 i = 0;
            Int32 pCount = myPage.PageCount;

            cp *= NoCount;

            //没有想到更好的解决办法
            if (pIndex % NoCount == 0)
                cp -= NoCount;

            for (i = 1; i <= NoCount; i++)
            {
                if (pIndex == cp + i)
                {
                    str.Append("&nbsp;<a id=\"P_b" + i.ToString() + "\" href=\"");
                    str.Append(GetAHref(cp + i));
                    str.Append("\" class=\"");
                    str.Append(myPage.CssClass);
                    str.Append("\" >-");
                    str.Append(cp + i);
                    str.Append("-</a>&nbsp;");
                }
                else
                {
                    str.Append("&nbsp;<a id=\"P_b"+ i.ToString() +"\" href=\"");
                    str.Append(GetAHref(cp + i));
                    str.Append("\" class=\"");
                    str.Append(myPage.CssClass);
                    str.Append("\" >[");
                    str.Append(cp + i);
                    str.Append("]</a>&nbsp;");
                }

                if (cp + i >= pCount)
                {
                    i = 9999;
                }
            }

            if (cp + i < pCount)
            {
                //后导页
                str.Append("&nbsp;<a id=\"P_zz\" href=\"");
                str.Append(GetAHref(-88));
                str.Append("\" class=\"");
                str.Append(myPage.CssClass);
                str.Append("\" >");
                str.Append("");
                str.Append("</a>&nbsp;");
                
                str.Append("&nbsp;");
            }
            return str.ToString();
        }

         
        #endregion



    }
}
namespace JYK.Controls.PageManage
{
    /**//// <summary>
    /// 依据PageSQL提供的SQL语句,通过数据访问函数库到数据库里提取数据
    /// </summary>
    public class PageGetData
    {
        /**//// <summary>
        /// 分页控件的实例
        /// </summary>
        public JYKPage myPage = null;
        
        /**//// <summary>
        /// 返回DataTable记录集
        /// </summary>
        /// <param name="PageIndex">页号。从1开始计数</param>
        /// <returns></returns>
        public DataTable GetDataTable(Int32 PageIndex)
        {
            string sql = myPage.ManagerPageSQL.GetSQL(PageIndex);
            return myPage.DAL.RunSqlDataTable(sql);
        }

        //public T GetDataList<T>(Int32 PageIndex)
        //{
        //    string sql = myPage.ManagerPageSQL.GetSQL(PageIndex);
        //    return myPage.DAL.RunSqlDataTable(sql);
        //}

    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏菩提树下的杨过

[基础]datagridview绑定数据源的几种常见方式

private void button1_Click(object sender, EventArgs e)         {             /...

26750
来自专栏跟着阿笨一起玩NET

linq to sql 扩展方法

9500
来自专栏跟着阿笨一起玩NET

Winform TreeView 查找下一个节点

var tn = _Tv.NextNodes().FirstOrDefault(x => Regex.IsMatch(x.Text, "(?i)" + txtK...

16920
来自专栏菩提树下的杨过

C#:DataTable映射成Model

这是数据库开发中经常遇到的问题,当然,这可以用现成的ORM框架来解决,但有些时候,如果DataSet/DataTable是第三方接口返回的,ORM就不方便了,还...

245100
来自专栏C#

将DataTable转换成CSV文件

    DataTable用于在.net项目中,用于缓存数据,DataTable表示内存中数据的一个表。CSV文件最早用在简单的数据库里,由于其格式简单,...

22960
来自专栏程序员与猫

代码小目

标签: 代码片段 日常记录 日常记录的代码片段 1.使用Paralle进行并行计算累加求和的不同形式 public static int ParallelSum...

22570
来自专栏葡萄城控件技术团队

Table-values parameter(TVP)系列之二: 利用DataTable将其作为参数传给SP

一,回顾         上一部分讲述了“在T-SQL中创建和使用TVP”,通过T-SQL建立如下的对象:         1)Tables ...

24090
来自专栏草根专栏

.NET Core 网络数据采集 -- 使用AngleSharp做html解析

53500
来自专栏c#开发者

asp.net回调javascript

using System; using System.Collections; using System.IO; using System.Text; ...

33750
来自专栏互联网开发者交流社区

ASP.NET部分代码示例

13320

扫码关注云+社区

领取腾讯云代金券