当前位置: 首页 > news >正文

页码生成算法

逛网页时,看到很多网页中的分页都是下图这样的:

于是就想把公司现在用的分页控件样式也改成这样,但是网上找了一下发现基本都是JQuery插件实现的,而且页码点击到后面的时候,基本上中间显示页码数的格子一会多一会少,算法明显不对。

而且对于现在使用的用户自定义控件来说,改动就比较大了,所以就按照这种样式,自己写了一个生成页码的算法。

注意,我提供的只是算法,不包括样式。

废话不多说,下面上代码:

 

        #region 页码生成
        /// <summary>
        /// 页码生成
        /// </summary>
        /// <param name="PageIndex">当前页码</param>
        /// <param name="PageCount">总页数</param>
        /// <param name="ContinNO">连续的页码个数(要求奇数)</param>
        /// <returns></returns>
        public static List<string> GetPagerList(int PageIndex, int PageCount, int ContinNO)
        {
            List<string> pagelist = new List<string>();
            //确定连续的页码个数为奇数
            if (ContinNO % 2 == 0)
                ContinNO = ContinNO + 1;
            int half = ContinNO / 2;

            #region 页码格子的个数
            //页码格子的个数
            int lattice = 0;
            if (PageCount <= ContinNO)
            {
                lattice = PageCount;
            }
            else
            {
                lattice = ContinNO + 2;
                //索引到达连续个数末尾时
                if (PageIndex >= ContinNO && PageIndex + half < PageCount)
                    lattice = ContinNO + 4;
            }
            #endregion

            #region 定义中间连续的页码集合
            List<string> middlelist = new List<string>();
            int middlemin = PageIndex - half > 0 ? PageIndex - half : 1;
            int middlemax = PageIndex + half >= PageCount ? PageCount : PageIndex + half;

            //当前索引和最大页差值小于应显示个数的一半时,最小值向前移
            int diff = PageCount - PageIndex;
            if (diff < half)
            {
                middlemin = middlemin - half + diff;
                middlemin = middlemin <= 0 ? 1 : middlemin;
            }

            //最大值小于格子数应显示的最大值
            int showmax = middlemin + ContinNO - 1;
            if (middlemax < showmax)
            {
                middlemax = showmax > PageCount ? PageCount : showmax;
            }
            //索引页小于连续页码个数时,最大值应是连续页码个数
            middlemax = PageIndex < ContinNO ? ContinNO : middlemax;

            //添加连续页码
            for (int i = middlemin; i <= middlemax; i++)
            {
                middlelist.Add(i.ToString());
            }
            #endregion

            #region 添加页码集合
            //添加页码集合
            if (middlelist.Count < lattice)
            {
                //连续页码最小值不是第一页
                if (middlemin != 1)
                    pagelist.Add("1");
                //页数少,但索引大
                if ((lattice == ContinNO + 2 || lattice == ContinNO + 4) && PageIndex >= ContinNO)
                    pagelist.Add("···");
                //插入连续页码
                pagelist.AddRange(middlelist);
                //页数少,索引小
                if ((lattice == ContinNO + 2 || lattice == ContinNO + 4) && PageIndex + half < PageCount)
                    pagelist.Add("···");
                //页码格子没有全部插入
                if (pagelist.Count < lattice)
                    pagelist.Add(PageCount.ToString());
            }
            else if (middlelist.Count > lattice)
            {
                pagelist.AddRange(middlelist.Skip(0).Take(lattice));
            }
            else
            {
                pagelist.AddRange(middlelist);
            }
            #endregion

            return pagelist;
        }
        #endregion

 

该方法会返回一个存储页码的List<string>集合,运行后下过如下:

其中“ContinNO”参数是用来控制页面格子数量的,而且我只有“首页页码”和“末页页码”,需要上一页,下一页等其他功能的,就自己改改吧!

转载于:https://www.cnblogs.com/lxc89/p/7048841.html

相关文章:

  • C++内联函数
  • 收缩数据文件
  • Flask 扩展 表单
  • openfalcon-0.2 配置
  • elasticsearch从入门到出门-08-Elasticsearch容错机制:master选举,replica容错,数据恢复...
  • [Reprinted] 使用Spring Data Redis操作Redis(一) 很全面
  • border:none;和border:0;的区别
  • win server2012 r2 服务器共享文件夹设置
  • 页头开发
  • mysql主从同步(5.1版本)
  • 51nod 1421 最大MOD值
  • R语言-排序
  • idea 15安装步骤2017.6.25
  • 机器学习:绪论
  • JS(一)
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • Angular 响应式表单 基础例子
  • CAP理论的例子讲解
  • exif信息对照
  • HTML中设置input等文本框为不可操作
  • JavaScript实现分页效果
  • js正则,这点儿就够用了
  • Linux快速复制或删除大量小文件
  • node-glob通配符
  • python学习笔记 - ThreadLocal
  • Python学习之路13-记分
  • 马上搞懂 GeoJSON
  • 山寨一个 Promise
  • 提醒我喝水chrome插件开发指南
  • 再谈express与koa的对比
  • MyCAT水平分库
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • # 数论-逆元
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (04)odoo视图操作
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (70min)字节暑假实习二面(已挂)
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (生成器)yield与(迭代器)generator
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)视频码率,帧率和分辨率的联系与区别
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET Core跨平台微服务学习资源
  • .NET NPOI导出Excel详解
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .net下简单快捷的数值高低位切换
  • ;号自动换行
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题