zoukankan      html  css  js  c++  java
  • 分页方法,始终只生成指定数量的页码

    之前发的那版有错误,固定死了是5条每页,新的应该没什么问题,经过了测试
    /// <summary>
        /// 页面相关帮助类
        /// </summary>
        public static class PageHelper
        {
            /// <summary>
            /// 计算按当前页码及最大生成页条数在总页数时生成的两个下标值,
            /// 例如pageIndex=4,当前数据一共有7页(pageLength),
            /// 而需要生成5页(pageCount),那么最终会生成两个值2和6,
            /// 前端在使用时只用以2开始以6结尾生成对应的页码标签即可
            /// </summary>
            /// <param name="pageIndex">当前页码</param>
            /// <param name="pageSum">所有页码数量</param>
            /// <param name="pageCount">要生成的页码数量</param>
            /// <returns>第一页的页码,最后一页的页码</returns>
            public static Tuple<int, int> GetPages(int pageIndex, int pageSum, int pageCount = 5)
            {
                int left = 1, right = 1;
    
                //针对要显示的页码数量比总页码数量还要大的情况
                if (pageSum < pageCount)
                {
                    pageCount = pageSum;
                }
    
    
                //如果当前页码为1
                if (pageIndex <= 1)
                {
                    left = 1;
                    right = pageCount;//最终页码则为当前的页码数
                    return new Tuple<int, int>(left, right);
                }
    
                //如果当前页码为最大页码数量
                if (pageIndex == pageSum)
                {
                    left = pageSum - pageCount + 1;
                    if (left < 1)
                    {
                        left = 1;
                    }
                    right = pageSum;
                    return new Tuple<int, int>(left, right);
                }
    
                if (pageSum == pageCount)
                {
                    //如果当前要显示的页码数量与最大页码数量一致
                    right = pageSum;
                    left = 1;
                    return new Tuple<int, int>(left, right);
                }
    
    
    
                //余下为不一定充足的量
                int leftSub, rightSub;
                //计算充足量
                if (pageCount % 2 == 0)
                {
                    //当前要显示的最大页码量为偶数,则左边会多一点,右边少一位
                    leftSub = pageCount / 2;
                    rightSub = leftSub - 1;
                }
                else
                {
                    //为奇数,则为一致
                    leftSub = rightSub = pageCount / 2;
                }
    
                //计算左边是否充足
                if (pageIndex - leftSub >= 1)
                {
                    //左边是充足的
                    left = pageIndex - leftSub;
    
                }
                else
                {
                    //左边不充足
                    left = 1;
    
                }
    
                //查看右边是否充足
                if (pageIndex + rightSub <= pageSum)
                {
                    //右边也充足
                    right = pageIndex + rightSub;
                    //查看最终页码数量是否达到预期数量
                    if (right - left + 1 < pageCount)
                    {
                        //没有达到,查看缺少多少
                        var sum = pageCount - (right + left - 1);
                        right = right + sum;
                    }
                }
                else
                {
                    //右边不充足
                    right = pageSum;
                    //查看最终页码数量是否达到预期数量
                    var sum = right - left + 1;//当前总条数
                    if (sum < pageCount)
                    {
                        //没有达到,查看缺少多少
                        var tmpLeft = pageCount - sum;
                        if (left - tmpLeft > 0)
                        {
                            left = left - tmpLeft;
                        }
                        else
                        {
                            left = 1;
                        }
    
                    }
                }
    
                return new Tuple<int, int>(left, right);
            }
    
    
            /// <summary>
            /// 以数据量和每页数量计算页码数量
            /// </summary>
            /// <param name="dataCount">数据量</param>
            /// <param name="pageSize">页码数量</param>
            /// <returns></returns>
            public static int GetPageLength(int dataCount, int pageSize) => (int)Math.Ceiling(dataCount / pageSize * 1.0);
    
            /// <summary>
            /// 计算按当前页码及最大生成页条数在总页数时生成的两个下标值,
            /// 例如pageIndex=4,当前数据一共有7页(pageLength),
            /// 而需要生成5页(pageCount),那么最终会生成两个值2和6,
            /// 前端在使用时只用以2开始以6结尾生成对应的页码标签即可
            /// </summary>
            /// <param name="pageIndex">当前页码</param>
            /// <param name="dataCount">当前数据总条数</param>
            /// <param name="pageSize">每页数量条数</param>
            /// <param name="pageCount">要生成的页码数量</param>
            /// <returns>第一页的页码,最后一页的页码</returns>
            public static Tuple<int, int> GetPages(int pageIndex, int dataCount, int pageSize, int pageCount = 5) => GetPages(pageIndex, GetPageLength(dataCount, pageSize), pageCount);
    
            /// <summary>
            /// 根据每页条数及当前页码计算偏移起始值,
            /// 在Mysql或Pgsql中使用例:SELECT * FROM TEST LIMIT {pageSize} OFFSET PageOffset(pageSize,1)
            /// </summary>
            /// <param name="pageSize">每页条数</param>
            /// <param name="pageIndex">当前页码</param>
            /// <returns></returns>
            public static int PageOffset(int pageSize, int pageIndex) => pageSize * (pageIndex - 1);
    
        }
    
    
    
    

    每页2条数量,最多显示5个页码

    当总页码数量不足以分5页时

    效果图:

  • 相关阅读:
    【Java基础】多态
    inner join / left join / right join
    Java并发之AQS详解
    AQS实现公平锁和非公平锁
    进程与线程区别是什么
    【java设计模式】代理模式
    Spring中用到的设计模式
    【Java设计模式】工厂模式
    前端开发 —— 本地化
    前端开发 —— Blade 模板引擎
  • 原文地址:https://www.cnblogs.com/rbzz/p/14334415.html
Copyright © 2011-2022 走看看