最近在写一个关于NET的框架,写到后面果不其然的就遇到了分页,自己看了很多关于分页的并自己结合写了一个,晒出来和大家分享一下,第一次写博客望大家多多提意见啦。。。

cs文件分页代码:

 Paging p = new Paging(, sql语句);     //每页3条
ViewData["List"] = p.GetDataTable(); //查询出要显示的DataTable
ViewData["page"] = p.GetPageing(this); //分页显示html

前台调用:

 <%=ViewData["page"]%>

最近刚发现的ViewState这个函数,只要后台定义前台就可以调用很方便。(这个是不是自己out了,现在才发现)

下面是关于Paging类:

     public class Paging
{
private string pagedNum; //定义分页条,输出到前台
private int pageSize; // 定义每页有多少条数据量.
private string url; //获取当前页
private int countNum; //总条数
private string SelSql; //查询SQL语句
private DataSet ds; public Paging(int pageSize, string SelSql)
{
this.pageSize = pageSize;
this.url = HttpContext.Current.Request.Url.LocalPath;
this.SelSql = SelSql;
GetPageDate(SelSql);
}
//定义样式a标签第一个样式
private readonly string csstagA = @"<a href='{0}?page={1}' >{2}</a>"; //{0}{1}{2}代表url和参数名,参数值,页码值
//定义样式a标签第二个样式
//private readonly string csstagA1 = "<a style='font-size:13px;font-weight:bold;margin:0 4px 0 4px'>{0}</a>";
private readonly string csstagA1 = "<span class='pc'>{0}</span>"; public delegate int GetDelegate(); /// <summary>
/// 生成分页条
/// </summary>
/// <param name="pageIndex">当前页</param>
/// <param name="del">获得数据条数的方法</param>
/// <returns></returns>
public string GetPageing(Page p)
{
string index = p.Request.QueryString["page"];
int i;
if (!string.IsNullOrEmpty(index) && int.TryParse(index, out i))
{
pagedNum = GetPagegNum(i, GetPageCount(i, countNum));
}
else
{
pagedNum = GetPagegNum(, GetPageCount(, countNum));
} return pagedNum;
} private int GetPageCount(int pageIndex, int countPage) //获得总页数
{
int Count = ;
Count = countPage;
double c = Count * 1.0 / pageSize;
return (int)Math.Ceiling(c);
} private string GetPagegNum(int pageIndex, int pageCount) //类似 上一页 1 ... 7 8 9 ⑩ 11 12 13 14 下一页 ⑩是当前选中页
{
StringBuilder sb = new StringBuilder();
List<int> ns = new List<int>(); //用于接收当前页范围内的数字
string[] numList = new string[]; //12个字符串数组,存放分页条数据
numList[] = ""; //“上一页”位置
numList[] = ""; //“下一页”位置
if (pageIndex > ) //判断当前页
{
numList[] = string.Format(csstagA, url, (pageIndex - ), "<上一页");
}
if (pageIndex < pageCount)
{
numList[] = string.Format(csstagA, url, (pageIndex + ), "下一页>");
}
if (pageIndex >= ) //当前页大于10页的状态
{
//主要的
numList[] = string.Format(csstagA, url, , );
numList[] = "...";
//int index = 0;
if (pageIndex + >= pageCount) //如果当前页加4页小于总页数
{
for (int i = pageCount - ; i < pageCount + ; i++)
{
//index = i;
ns.Add(i);
}
for (int j = ; j <= ; j++) //遍历ns页码值填充到分页条
{
if (ns[j] == pageIndex) //判断是否为当前页码,来使用不同css样式
{
numList[j + ] = string.Format(csstagA1, ns[j]); //因为字符串数组前3位分别为“上一页”,“1”,“...”,所以从第四位填充7个
}
numList[j + ] = string.Format(csstagA, url, ns[j], ns[j]);
}
}
for (int i = pageIndex - ; i <= pageIndex + ; i++)
{
//index = i;
ns.Add(i);
}
for (int j = ; j <= ; j++)
{
if (ns[j] == pageIndex)
{
numList[j + ] = string.Format(csstagA1, ns[j]);
}
else
{
numList[j + ] = string.Format(csstagA, url, ns[j], ns[j]);
}
}
}
else //10页以下的状态
{
if (pageCount >= ) //页数大于等于10
{
for (int i = ; i <= ; i++)
{
if (i == pageIndex)
{
numList[i] = string.Format(csstagA1, i);
}
else
{
numList[i] = string.Format(csstagA, url, i, i);
}
}
}
else //页数小于10
{
for (int i = ; i <= pageCount; i++)
{
if (i == pageIndex)
{
numList[i] = string.Format(csstagA1, i);
}
else
{
numList[i] = string.Format(csstagA, url, i, i);
}
}
}
}
sb.Append("<div class='page'>");
for (int i = ; i < numList.Length; i++) //将字符串数组填入StringBulider中
{
sb.Append(numList[i]);
} sb.AppendFormat(" 共{0}/{1}条", pageIndex, pageCount);
sb.Append("</div>");
return sb.ToString(); //返回,并在前台 <span id="pagedspan"><%=pagedNum %></span>
} /// <summary>
/// 获取分页数据和总页数
/// </summary>
/// <param name="pageSql"></param>
public void GetPageDate(string pageSql)
{
int pageIndex = Req.QueryString("page").ToInt(); StringBuilder strSql = new StringBuilder();
strSql.Append(@"declare @startRow int
declare @endRow int
declare @pageSize int
declare @pageIndex int
set @pageSize=@pageSize2
set @pageIndex=@pageIndex2
set @startRow=(@pageIndex-1) * @pageSize+1
set @endRow=@pageSize*@pageIndex");
strSql.Append(" select * from(");
strSql.Append("select *,ROW_NUMBER() OVER (ORDER BY getdate()) pageID from(");
strSql.Append(pageSql);
strSql.Append(")tab_a");
strSql.Append(")tab_b where pageID between @startRow and @endRow"); strSql.Append(" select COUNT(*) from("); //查询总页数
strSql.Append(pageSql);
strSql.Append(")tab_count"); //pagesize 每页条数
//pageIndex 第几页
//set @startRow=(@pageIndex-1) * @pageSize+1 开始页
//set @endRow=@pageSize*@pageIndex 结束页 ds = DBHelper.GetDataSet(strSql.ToString());
countNum = int.Parse(ds.Tables[].Rows[][].ToString());
} /// <summary>
/// 分页数据列表
/// </summary>
/// <returns></returns>
public DataTable GetDataTable()
{
return this.ds.Tables[];
} }

关键的分页SQL是:

select * from(
select *,ROW_NUMBER() OVER (ORDER BY getdate()) pageID from 表名
)a
where pageID between (@pageIndex-) * @pageSize+ and @pageSize*@pageIndex

这里为了不用传SQL的时候单独传一个ID就用了 ROW_NUMBER() OVER (ORDER BY getdate()),很好用

这样SQL分页就实现了,最后还写了仿百度的样式,对应上面的csstagA、csstagA1 CSS是:

/*分页*/
.page {
padding-top:10px;
}
.page .pc{
font-size:13px;font-weight:bold;margin: 5px 5px;
}
.page a{
border:1px solid #CFCBCB; font-size:13px;padding:8px 13px;margin: 5px 5px;text-decoration:none;display:inline-block;
}
.page a:hover {
background:#f2f8ff;border:1px solid #38f;
}
/*End 分页*/

最后的显示效果如下:

OK,这以上就是我分页实现的具体步骤了。o(∩_∩)o 哈哈。。。

NET分页实现及代码的更多相关文章

  1. Mvc分页组件MvcSimplePager代码重构

    1 Mvc分页组件MvcSimplePager代码重构 1.1 Intro 1.2 MvcSimplePager 代码优化 1.3 MvcSimplePager 使用 1.4 End Mvc分页组件M ...

  2. Mvc分页组件MvcSimplePager代码重构及使用

    1 Mvc分页组件MvcSimplePager代码重构 1.1 Intro 1.2 MvcSimplePager 代码优化 1.3 MvcSimplePager 使用 1.4 End Mvc分页组件M ...

  3. 实现 iPhone 电子书的分页显示功能的代码

     本文转载至 http://blog.csdn.net/zaitianaoxiang/article/details/6650497 原文地址:实现 iPhone 电子书的分页显示功能的代码作者:醉吻 ...

  4. 分页查询关键代码 多条件查询关键代码 删除选中商品关键代码 修改要先回显再修改 修改要先回显再修改 同一业务集中使用同一servlet的方法

    分页查询关键代码: 通过servlet转发回来的各种信息进行分页的设计(转发回的信息有 分页查询的List集合 查询的页码 查询的条数 查询的数据库总条数 查询的总页码) 从开始时循环10次出现十个数 ...

  5. django之分页,纯python代码

    Django中分页 py文件代码 """ 自定义分页组件 可以返回分页的数据和分页的HTML代码 """ from django.http ...

  6. 静态页分页功能js代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. 转:PHP分页技术的代码和示例

    本文来自:10 Helpful PHP Pagination Scripts For Web Developers 分页是目前在显示大量结果时所采用的最好的方式.有了下面这些代码的帮助,开发人员可以在 ...

  8. php分页实例附代码

    一个典型的PHP分页实例代码分享,学习php的朋友肯定用得到,主要是了解思路: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transit ...

  9. Extjs的GridPanel分页前后台完整代码实例

    第一次写文章啊,有些冲动.最近在公司学习Extjs,做了一个分页的小实例和大家分享. 1.首先编写paging-grid.js文件,这是我在网上参考的例子改写的,大同小异. Ext.onReady(f ...

  10. WPF DataGrid分页功能实现代码

    在Silverlight中DataGrid分页可以结合DataPager控件很容易实现,但是在WPF中没有类似的,需要手动实现这样一个控件: 1.创建一个UserControl,DP.xaml,代码如 ...

随机推荐

  1. GeoServer之图层的新建与发布

    GeoServer之图层的新建与发布 GeoServer的图层发布并不复杂,在经过: 1.创建工作区 2.添加新的数据存储 3.编写styles 后:我们就可以很简单的创建图层了. 1.在新建图层中选 ...

  2. [转] c# 操作Word

    来自 风过四季天 的原文 c# 操作Word总结 在医疗管理系统中为保存患者的体检和治疗记录,方便以后的医生或其他人查看.当把数据保存到数据库中,需要新建很多的字段,而且操作很繁琐,于是想 到网页的信 ...

  3. ffmpeg问题汇总及解决方案 <设置avformat_open_input 超时><转>

    1:如果数据是rtp/rtsp传输的话,ffmpeg会每隔30s(哪里设置该值?)发送一个keepalive包,如果ipc支持GET_PARAMETER命令,就发该命令等ipc回复以确认ipc还活着. ...

  4. DataTable相关

    设置主键列:  this.tableTestData.PrimaryKey = new DataColumn[] { this.tableTestData.Columns[0] };

  5. aop中的顾问

    通知只能指定织入的时间点,目标方法之前,之后,环绕,还是异常时. 要想指定切入点就要使用顾问

  6. Renderer.materials 和sharedMaterials一些用法上的区别

    Not allowed to access Renderer.materials on prefab object. Use Renderer.sharedMaterials insteadUnity ...

  7. 如何安装Zend Studio 以及汉化和基本准备工作

    昨天从早上一直弄到晚上10点,可累死我了,网上的资料都是掺次不齐,所以我写一篇系统点的文章来告诉大家怎么做. 1.如果你想进行一套PHP系统的开发,肯定是要有“尚方宝剑”的,这个尚方宝剑就是PHP工具 ...

  8. word 标题序号

    设置标题的序号. 1>设置二级标题的序号  步骤一: 步骤二: 步骤三: 步骤四: 2>设置三级标题的序号 程序员的基础教程:菜鸟程序员

  9. vs2017编译并配置libcurl入门教程

    libcurl可以用来发送http请求,是c/c++发送http请求常用的库 下载libcurl源码包: libcurl下载地址:https://curl.haxx.se/download.html ...

  10. code2800 送外卖

    首先,对图进行一次Floyd(g[][]是图) 1.dfs:(u是当前在的节点,d是已经走的路程) void dfs(int u,int d){ if(d>=ans)return; bool f ...