.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

 
 
分类: .net
标签: C#分页控件.net

.net分页控件简单实现的更多相关文章

  1. 自己写的简单的jQuery分页控件

    因为是内部项目,需要分页控件,网上找了一大堆,给领导一看,都说不行,原因很简单,太复杂,领导就想要个简单点的,类似百度的分页,可是自己也没写过Jquery控件,硬着头皮找了些资料,写了这个分页控件,目 ...

  2. asp.net mvc简单实现基于Razor的分页控件

    最近在写一些web应用了解了一下asp.net mvc发现的确好用,所以直接就干上了.不过在使用asp.net mvc的Razor模板的情况并不向传统webform那样可以使用控件.但从Razor的功 ...

  3. WPF自定义分页控件,样式自定义,简单易用

    WPF自定义分页控件 做了许久伸手党,终于有机会贡献一波,搜索一下WPF分页控件,还是多,但是不太通用,主要就是样式问题,这个WPF很好解决,还有一个就是分页控件嘛,只关心几个数字的变动就行了,把页码 ...

  4. 仿淘宝分页按钮效果简单美观易使用的JS分页控件

    分页按钮思想:  1.少于9页,全部显示  2.大于9页,1.2页显示,中间页码当前页为中心,前后各留两个页码  附件中有完整例子的压缩包下载.已更新到最新版本  先看效果图:  01输入框焦点效果  ...

  5. WPF简单的分页控件实现

    XAML代码(使用ItemsControl控件实现): <UserControl x:Class="SunCreate.Vipf.Client.UI.CityDoor.PageCont ...

  6. 在DevExpress程序中使用Winform分页控件直接录入数据并保存

    一般情况下,我们都倾向于使用一个组织比较好的独立界面来录入或者展示相关的数据,这样处理比较规范,也方便显示比较复杂的数据.不过在一些情况下,我们也可能需要直接在GridView表格上直接录入或者修改数 ...

  7. 自定义angularjs分页控件

    继昨天写了knockoutjs+ jquery pagination+asp.net web Api 实现无刷新列表页 ,正好最近刚学习angularjs ,故琢磨着写一个angularjs版本的分页 ...

  8. 基于Bootstrap仿淘宝分页控件实现

    .header { cursor: pointer } p { margin: 3px 6px } th { background: lightblue; width: 20% } table { t ...

  9. WPF 实现 DataGrid/ListView 分页控件

    在WPF中,通常会选用DataGrid/ListView进行数据展示,如果数据量不多,可以直接一个页面显示出来.如果数据量很大,2000条数据,一次性显示在一个页面中,不仅消耗资源,而且用户体验也很糟 ...

随机推荐

  1. 【ThinkingInC++】66、pointer Stash的使用

    头文件PStash.h /** * 书本:[ThinkingInC++] * 功能:pointer Stash的头文件 * 时间:2014年10月5日14:33:15 * 作者:cutter_poin ...

  2. 【软测试】(两)计算机组成原理-cpu

    cpu,中文名称中央处理单元,central processing unit.系统的核心,用于数据的处理,算术以及逻辑运算和控制程序的运行. 组成 运算器 从字面上就能够理解到.运算器主要用来对于逻辑 ...

  3. Web API-属性路由

    路由(Routing)就是Web API如何将一个URI匹配到一个action的过程.Web API 2 支持一个新的路由方式-属性路由(attribute routing).顾名思义,属性路由使用标 ...

  4. 在C#编程中玩转枚举,分享我的EnumHelper。

    在C#编程中玩转枚举,分享我的EnumHelper. 在软件开发过程中,我们经常会为特定的场景下的特定数据定义逻辑意义.比如在用户表中,我们可能会有一个用户状态字段,该字段为整形.如果该字段的值为1则 ...

  5. 玩转Web之servlet(四)---B/S是怎样使用http协议完毕通信过程的

    在上一篇文章中,我简单的说了一下B/S架构的流程图,关于浏览器和server之间的通信过程知识含糊的说了一下,在这篇文章中我再总结一下B/S架构里是怎样利用http协议去完毕通信的. (一)通讯过程 ...

  6. javascript 验证 yyyy-MM-dd HH:mm:ss 的正则表达式

    原文:javascript 验证 yyyy-MM-dd HH:mm:ss 的正则表达式 ^((\d{2}(([02468][048])|([13579][26]))[\-\/\s]?((((0?[13 ...

  7. java设计模式之六适配器模式(Adapter)

    适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题.主要分为三类:类的适配器模式.对象的适配器模式.接口的适配器模式.首先,我们来看看类的适配器模 ...

  8. [Elasticsearch] 邻近匹配 (一) - 短语匹配以及slop參数

    本文翻译自Elasticsearch官方指南的Proximity Matching一章. 邻近匹配(Proximity Matching) 使用了TF/IDF的标准全文搜索将文档,或者至少文档中的每一 ...

  9. location将地址栏参数拆分成键值对的对象

    window.location可获取地址栏的一系列信息,并且每个浏览器都支持该属性,非常方便.而获取到的问号后面的参数可以进行加工转变成我们所想要的键值对. location的属性: 属性名 例子 说 ...

  10. SQL点滴30—SQL中常用的函数

    原文:SQL点滴30-SQL中常用的函数 该文章转载自http://www.cnblogs.com/jiajiayuan/archive/2011/06/16/2082488.html 别人的总结,很 ...