首页 > Asp.net开发 > .net分页控件简单实现

.net分页控件简单实现

好久好久没写博客了。。。。。最近写了一个.net的分页控件,放到园子里。。。你觉得好,就点个赞,不好呢,就告诉我为啥吧。。。。

是使用Request.QueryString的。。。。

参数:

复制代码
        public int currentPageIndex = 0;//当前页数
        public int pagesize = 16;//每页显示的条数

        public int pagecount = 0;//页数
        public int rowscount = 0;//总条数
        public string prevtext = "前一页";
        public string nexttext = "后一页";
        public string ellipsetext = "...";//分隔符
        public int edgeentries = 2;//页边
        public bool prevshowalways = true;//前一页按钮是否显示
        public bool nextshowalways = true;//后一页按钮是否显示
        public int displayentries = 5;//显示几个按钮
        public string url;
        public string pagestr = "";
复制代码

用到的类

计算最大页数这里没啥好说的,从数据库读出条数之后赋给rowscount即可。

//计算最大的页数
        public int NumPages()
        {
            return Convert.ToInt32(Math.Ceiling((decimal)rowscount / pagesize));
        }

主要问题就在于计算开始和结束按钮这里,这里整好了,就相当于一半都没问题了

一开始我是使用的如下的代码,但是有问题。。。。如果displayentries为2n-1时,最后出来的是2n。

复制代码
//根据当前页数和显示数目计算开始和结束的分页按钮
        public int[] GetInterval()
        {
            int nehalf = Convert.ToInt32(Math.Ceiling((decimal)displayentries / 2));
            pagecount = NumPages();
            int upperlimit = pagecount - displayentries;//最大就是upperlimit,再大的话按钮的个数就不能保证了。
            int start = currentpageindex > nehalf ? Math.Max(Math.Min(currentpageindex - nehalf, upperlimit), 1) : 1;
            int end = currentpageindex > nehalf ? Math.Min(currentpageindex + nehalf - 1, pagecount) : Math.Min(displayentries, pagecount);
            return new int[] { start, end };
        }
复制代码

主要的原因就在于Math.Ceiling返回的是整数,而2n-1和2n返回的是同样一个数,所以就会造成按钮个数上出现问题。

所以呢,我就区别了一下奇数和偶数

复制代码
//根据当前页数和显示数目计算开始和结束的分页按钮
        public int[] GetInterval()
        {
            int nehalf = Convert.ToInt32(Math.Ceiling((decimal)displayentries / 2));
            pagecount = NumPages();
            int upperlimit = pagecount - displayentries;
            int start,end;
            if (displayentries % 2 == 0)
            {
               start = currentpageindex > nehalf ? Math.Max(Math.Min(currentpageindex - nehalf, upperlimit), 1) : 1;
            }
            else 
            {
                start = currentpageindex > nehalf ? Math.Max(Math.Min(currentpageindex - nehalf+1, upperlimit), 1) : 1;
            }
            end = currentpageindex > nehalf ? Math.Min(currentpageindex + nehalf - 1, pagecount) : Math.Min(displayentries, pagecount);
            return new int[] { start, end };
        }
复制代码

添加按钮类

复制代码
 public string AppendItem(int pageid, string text)
        {
            string lnk;
            int id = pageid < 1 ? 1 : (pageid < pagecount ? pageid : pagecount);
            if (id == currentpageindex)
            {
                lnk = "<span class='current'>" + text + "</span>";
            }
            else
            {
                lnk = "<a href=?" + url + "&pageid=" + id + ">" + text + "</a>";
            }
            return lnk;
        }
复制代码

 

生成分页控件类

复制代码
public string DrawLink()
        {
            //首先得到开始和结束的数组
            int[] interval = GetInterval();

            //生成前一页链接
            if (prevtext != "" && currentpageindex > 1 && prevshowalways)
            {
                pagestr = AppendItem(currentpageindex - 1, prevtext);
            }
            //看是否有边界页,是否需要分界符
            if (interval[0] > 1 && edgeentries > 0)
            {
                //检查边界和开始谁小,画按钮
                int end = Math.Min(edgeentries, interval[0]);
                //生成边界页
                if (edgeentries == interval[0]) //注意interval[0]和edgeentries相等的时候,会出现重复
                {
                    for (int i = 1; i < end; i++)
                    {
                        pagestr = pagestr + AppendItem(i, i.ToString());
                    }
                }
                else
                {
                    for (int i = 1; i <= end; i++)//从1开始,因此i要小于等于end,这样才会把end这个按钮画上
                    {
                        pagestr = pagestr + AppendItem(i, i.ToString());
                    }
                }
                //生成分界符
                if (edgeentries + 1 < interval[0] && ellipsetext != "")
                {
                    pagestr = pagestr + "<span>" + ellipsetext + "</span>";
                }
            }

            for (int i = interval[0]; i <= interval[1]; i++)
            {
                pagestr = pagestr + AppendItem(i, i.ToString());
            }

            if (interval[1] < pagecount && edgeentries > 0)//结尾
            {
                if (pagecount - edgeentries > interval[1] && ellipsetext != "")
                {
                    pagestr = pagestr + "<span>" + ellipsetext + "</span>";
                }
                int begin = Math.Max(pagecount - edgeentries + 1, interval[1]);
                if (pagecount - edgeentries + 1 == interval[1])
                {
                    for (int i = begin+1; i <= pagecount; i++)
                    {
                        pagestr = pagestr + AppendItem(i, i.ToString());
                    }
                }
                else 
                {
                    for (int i = begin; i <= pagecount; i++)
                    {
                        pagestr = pagestr + AppendItem(i, i.ToString());
                    }
                }

            }
            //生成后一页链接
            if (nexttext != "" && currentpageindex < pagecount && nextshowalways)
            {
                pagestr = pagestr + AppendItem(currentpageindex + 1, nexttext);
            }
            return pagestr;
        }
复制代码

这样,这个简单的.net分页控件就实现了。如果你有更好的方法,欢迎和我交流。。hiahia。。。。

文件

Paginate.zip

 

MSP(Microsoft Student Partners)是微软公司针对高校

大学生在全球范围内所设立的项目。旨在鼓励那些在校园里积极倡导、推动创新实践,

乐于积极帮助他人的优秀学生,给他们提供微软最前沿的技术资源,以及更广泛的交流、展示自我的平台。

MSP项目面向所有热爱技术、勇于创新、积极推动创新实践、愿意和他人分享自己所学的在校大学生,并不仅仅局限于技术类背景的学生。

如果你喜欢的话,欢迎加入。地址

http://msdn.microsoft.com/zh-cn/jj889435.aspx


本文固定链接: http://www.devba.com/index.php/archives/1614.html | 开发吧

报歉!评论已关闭.