[原创] 分页

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace Utility
{
    public class PagerHelper
    {
        /// <summary>
        /// 总页数
        /// </summary>
        public static int PCount = 0;
        /// <summary>
        /// 总行数
        /// </summary>
        public static int RCount = 0;

        /// <summary>
        /// 获取分页数据
        /// </summary>
        /// <param name="Table">表</param>
        /// <param name="PrimaryKey">主键</param>
        /// <param name="Fields">字段</param>
        /// <param name="Where">Where条件</param>
        /// <param name="OrderField">排序字段</param>
        /// <param name="SortOrder">排序方式,1:正序,0:倒序</param>
        /// <param name="PageIndex">当前页码</param>
        /// <param name="PageSize">页大小</param>
        /// <returns></returns>
        public static DataTable PagerData(string Table, string PrimaryKey, string Fields, string Where, string OrderField, int SortOrder, int PageIndex, int PageSize)
        {
            DataTable dt = new DataTable();
            if (string.IsNullOrEmpty(Fields))
            {
                Fields = "*";
            }
            if (string.IsNullOrEmpty(Where))
            {
                Where = "1=1";
            }
            else
            {
                Where = "1=1" + Where;
            }
            if (Fields.Split(',').Length > 0 || Fields == "*")
            {
                List<SqlParameter> plist = new List<SqlParameter>();
                plist.Add(DBHelper.CreateSqlParameter("PCount", PCount));
                plist.Add(DBHelper.CreateSqlParameter("RCount", RCount));

                plist[0].Direction = ParameterDirection.Output;
                plist[1].Direction = ParameterDirection.Output;

                plist.Add(DBHelper.CreateSqlParameter("sys_Table", Table));
                plist.Add(DBHelper.CreateSqlParameter("sys_Key", PrimaryKey));
                plist.Add(DBHelper.CreateSqlParameter("sys_Fields", Fields));
                plist.Add(DBHelper.CreateSqlParameter("sys_Where", Where));
                plist.Add(DBHelper.CreateSqlParameter("sys_Order", SortOrder == 1 ? OrderField + " asc" : OrderField + " desc"));

                plist.Add(DBHelper.CreateSqlParameter("sys_Begin", 1));
                plist.Add(DBHelper.CreateSqlParameter("sys_PageIndex", PageIndex));
                plist.Add(DBHelper.CreateSqlParameter("sys_PageSize", PageSize));

                dt = DBHelper.GetDataTableByRunProcedure("sys_Page_v2", plist);

                PCount = Convert.ToInt32(plist[0].Value);
                RCount = Convert.ToInt32(plist[1].Value);
            }
            return dt;
        }

        /// <summary>
        /// 获取分页数据EasyUIJson
        /// </summary>
        /// <param name="dt">数据源</param>
        /// <param name="pn">当前页码</param>
        /// <returns></returns>
        public static string PagerDataToEasyUIJson(DataTable dt, int? pn)
        {
            string strjosn = "";
            if (pn == null)
            {
                pn = 1;
            }

            string pager = @"" + JsPagerFooter((int)pn, 10, "LoadDataGrid").Replace("\"", "'");

            strjosn += "{\"total\":\"" + RCount + "\",\"page\":\"" + pn + "\",\"pager\":\"" + pager + "\",\"rows\":[";
            foreach (DataRow dr in dt.Rows)
            {
                strjosn += "{";
                foreach (DataColumn dc in dr.Table.Columns)
                {
                    strjosn += "\"" + dc.ColumnName + "\":\"" + dr[dc].ToString().Replace("\"", "\\\"") + "\",";
                }
                strjosn = strjosn.Remove(strjosn.Length - 1, 1);
                strjosn += "},";
            }
            if (strjosn.Substring(strjosn.Length - 1) == ",")
            {
                strjosn = strjosn.Remove(strjosn.Length - 1, 1);
            }
            strjosn += "]}";

            return strjosn;
        }

        /// <summary>
        /// 获取数据Json
        /// </summary>
        /// <param name="dt">数据行</param>
        /// <returns></returns>
        public static string PagerDataToEasyUIJson(DataRow dr)
        {
            string strjosn = "";

            strjosn += "{\"total\":\"" + 1 + "\",\"page\":\"" + 1 + "\",\"rows\":[";
            strjosn += "{";
            foreach (DataColumn dc in dr.Table.Columns)
            {
                strjosn += "\"" + dc.ColumnName + "\":\"" + dr[dc].ToString().Replace("\"", "\\\"") + "\",";
            }
            strjosn = strjosn.Remove(strjosn.Length - 1, 1);
            strjosn += "},";
            if (strjosn.Substring(strjosn.Length - 1) == ",")
            {
                strjosn = strjosn.Remove(strjosn.Length - 1, 1);
            }
            strjosn += "]}";

            return strjosn;
        }

        /// <summary>
        /// 页脚分页代码
        /// </summary>
        /// <param name="pn">当前页码</param>
        /// <param name="size">显示页码个数</param>
        /// <param name="thisPageUrl">当前页</param>
        /// <returns></returns>
        public static string PagerFooter(int pn, int size, string thisPageUrl)
        {
            int pagetotal = PCount;
            //分页页脚部分 初始化
            string pagerlinks = "";

            //判断最大页码
            if (pagetotal > 1)
            {
                //上一页
                int prev = pn - 1;
                if (prev < 1)
                {
                    prev = 1;
                }

                //下一页
                int next = pn + 1;
                if (next > pagetotal)
                {
                    next = pagetotal;
                }

                if (pn == 1)
                {
                    pagerlinks += "<span class=\"disabled\"><<</span><span class=\"disabled\"><</span>";
                }
                else if (pn < size)
                {
                    pagerlinks += "<span class=\"disabled\"><<</span><a href=\"{0}pn={1}\" title=\"上一页\"><</a>";
                }
                else
                {
                    pagerlinks += "<a href=\"{0}pn=1\" title=\"首页\"><<</a><a href=\"{0}pn={1}\" title=\"上一页\"><</a>";
                }

                int initial = pn - pn % size + 1;
                if (initial > pn)
                {
                    initial = initial - size;
                }

                int n = initial + size;
                if (size > pagetotal)
                {
                    initial = 1;
                    n = pagetotal + 1;
                }
                if (n > pagetotal)
                {
                    n = pagetotal + 1;
                }
                for (int j = initial; j < n; j++)
                {
                    if (pn == j)
                    {
                        pagerlinks += "<span class=\"current\">" + j + "</span>";
                    }
                    else
                    {
                        pagerlinks += "<a href=\"{0}pn=" + j + "\">" + j + "</a>";
                    }
                }
                if (pn == pagetotal)
                {
                    pagerlinks += "<span class=\"disabled\">></span><span class=\"disabled\">>><span/>";
                }
                else if (pn > pagetotal - size && pn < pagetotal)
                {
                    pagerlinks += "<a href=\"{0}pn={2}\" title=\"下一页\">></a><span class=\"disabled\">>><span/>";
                }
                else
                {
                    pagerlinks += "<a href=\"{0}pn={2}\" title=\"下一页\">></a><a href=\"{0}pn={3}\" title=\"尾页\">>></a>";
                }
                if (thisPageUrl == null)
                {
                    thisPageUrl = "";
                }
                pagerlinks = string.Format(pagerlinks, thisPageUrl.IndexOf('?') < 0 ? thisPageUrl + "?" : thisPageUrl + "&", prev, next, pagetotal);
            }

            return pagerlinks;
        }

        /// <summary>
        /// 页脚分页代码
        /// </summary>
        /// <param name="pn">当前页码</param>
        /// <param name="size">显示页码个数</param>
        /// <param name="JsFuncName">js方法名 例子:LoadDataGrid,此方法第一个参数必须为页码pn</param>
        /// <returns></returns>
        public static string JsPagerFooter(int pn, int size, string JsFuncName)
        {
            JsFuncName = "javascript:" + JsFuncName;
            int pagetotal = PCount;
            //分页页脚部分 初始化
            string pagerlinks = "";

            //判断最大页码
            if (pagetotal > 1)
            {
                //上一页
                int prev = pn - 1;
                if (prev < 1)
                {
                    prev = 1;
                }

                //下一页
                int next = pn + 1;
                if (next > pagetotal)
                {
                    next = pagetotal;
                }

                if (pn == 1)
                {
                    pagerlinks += "<span class=\"disabled\"><<</span><span class=\"disabled\"><</span>";
                }
                else if (pn < size)
                {
                    pagerlinks += "<span class=\"disabled\"><<</span><a href=\"{0}({1});\" title=\"上一页\"><</a>";
                }
                else
                {
                    pagerlinks += "<a href=\"{0}(1);\" title=\"首页\"><<</a><a href=\"{0}({1});\" title=\"上一页\"><</a>";
                }

                int initial = pn - pn % size + 1;
                if (initial > pn)
                {
                    initial = initial - size;
                }

                int n = initial + size;
                if (size > pagetotal)
                {
                    initial = 1;
                    n = pagetotal + 1;
                }
                if (n > pagetotal)
                {
                    n = pagetotal + 1;
                }
                for (int j = initial; j < n; j++)
                {
                    if (pn == j)
                    {
                        pagerlinks += "<span class=\"current\">" + j + "</span>";
                    }
                    else
                    {
                        pagerlinks += "<a href=\"{0}(" + j + ");\">" + j + "</a>";
                    }
                }
                if (pn == pagetotal)
                {
                    pagerlinks += "<span class=\"disabled\">></span><span class=\"disabled\">>><span/>";
                }
                else if (pn > pagetotal - size && pn < pagetotal)
                {
                    pagerlinks += "<a href=\"{0}({2});\" title=\"下一页\">></a><span class=\"disabled\">>><span/>";
                }
                else
                {
                    pagerlinks += "<a href=\"{0}({2});\" title=\"下一页\">></a><a href=\"{0}({3});\" title=\"尾页\">>></a>";
                }

                pagerlinks = string.Format(pagerlinks, JsFuncName, prev, next, pagetotal);
            }

            return pagerlinks;
        }
    }
}

#region 分页存储过程
/******************************************以下为分页存储过程******************************************/
/*
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sys_Page_v2]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[sys_Page_v2]
GO
CREATE PROCEDURE [dbo].[sys_Page_v2]
@PCount int output,    --总页数输出
@RCount int output,    --总记录数输出
@sys_Table nvarchar(100),    --查询表名
@sys_Key varchar(50),        --主键
@sys_Fields nvarchar(500),    --查询字段
@sys_Where nvarchar(3000),    --查询条件
@sys_Order nvarchar(100),    --排序字段
@sys_Begin int,        --开始位置
@sys_PageIndex int,        --当前页数
@sys_PageSize int        --页大小
AS
SET NOCOUNT ON
SET ANSI_WARNINGS ON
IF @sys_PageSize < 0 OR @sys_PageIndex < 0
BEGIN        
RETURN
END
DECLARE @new_where1 NVARCHAR(3000)
DECLARE @new_order1 NVARCHAR(100)
DECLARE @new_order2 NVARCHAR(100)
DECLARE @Sql NVARCHAR(4000)
DECLARE @SqlCount NVARCHAR(4000)
DECLARE @Top int
if(@sys_Begin <=0)
    set @sys_Begin=0
else
    set @sys_Begin=@sys_Begin-1
IF ISNULL(@sys_Where,'') = ''
    SET @new_where1 = ' '
ELSE
    SET @new_where1 = ' WHERE ' + @sys_Where
IF ISNULL(@sys_Order,'') <> '' 
BEGIN
    SET @new_order1 = ' ORDER BY ' + Replace(@sys_Order,'desc','')
    SET @new_order1 = Replace(@new_order1,'asc','desc')
    SET @new_order2 = ' ORDER BY ' + @sys_Order
END
ELSE
BEGIN
    SET @new_order1 = ' ORDER BY ID DESC'
    SET @new_order2 = ' ORDER BY ID ASC'
END
SET @SqlCount = 'SELECT @RCount=COUNT(1),@PCount=CEILING((COUNT(1)+0.0)/'
            + CAST(@sys_PageSize AS NVARCHAR)+') FROM ' + @sys_Table + @new_where1
EXEC SP_EXECUTESQL @SqlCount,N'@RCount INT OUTPUT,@PCount INT OUTPUT',
               @RCount OUTPUT,@PCount OUTPUT
IF @sys_PageIndex > CEILING((@RCount+0.0)/@sys_PageSize)    --如果输入的当前页数大于实际总页数,则把实际总页数赋值给当前页数
BEGIN
    SET @sys_PageIndex =  CEILING((@RCount+0.0)/@sys_PageSize)
END
set @sql = 'select '+ @sys_fields +' from ' + @sys_Table + ' w1 '
    + ' where '+ @sys_Key +' in ('
        +'select top '+ ltrim(str(@sys_PageSize)) +' ' + @sys_Key + ' from '
        +'('
            +'select top ' + ltrim(STR(@sys_PageSize * @sys_PageIndex + @sys_Begin)) + ' '+@sys_Fields+' FROM ' 
        + @sys_Table + @new_where1 + @new_order2 
        +') w ' + @new_order1
    +') ' + @new_order2
--print(@sql)
Exec(@sql)
GO
*/
#endregion

  使用期间如有报错,欢迎大家指正或改良。

posted @ 2015-03-07 17:29  代码啦  阅读(171)  评论(0)    收藏  举报