最近在写一个关于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. leetcode451

    public class Solution { public string FrequencySort(string s) { var dic = new Dictionary<char, in ...

  2. 变体类型 Variant VARIANT

    变体类型 Variant VARIANT class RTL_DELPHIRETURN Variant: public TVarData typedef struct    tagVARIANT  V ...

  3. 跟着太白老师学python day10 函数嵌套, global , nonlocal

    函数嵌套: 第一种嵌套方法 def func(): count = 123 def inner(): print(count) inner() func() 第二种嵌套方法 count = 123 d ...

  4. Shiro配置cookie以及共享Session和Session失效问题

    首先我们看Shiro的会话管理器的配置 <!-- shiro会话管理 --> <!-- 即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中:会话可以是普通 JavaSE ...

  5. 塔防游戏 Day2

    1. 创建炮塔选择的 UI 使用 UI -> Toggle .注意指定同一 group. 2. 创建炮台的数据类 [System.Serializable] // 序列化 public clas ...

  6. abseil的编译与使用

    项目中集成了abseil.abseil提供了cmake的编译,但是缺少make install命令. 于是有了下面的的一些命令,用于生成include和lib目录. function cmake_in ...

  7. 前端开发之JavaScript HTML DOM实战篇

    实战案例一: “灯泡发光” <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  8. 数组和集合(四)、Map集合的使用总结

    一.概述 键值对,无序 键唯一.值不唯一 只允许存在一个Key为null元素 二.实现类 1. HashMap · 无序,数组+链表+红黑树 · 非线程安全 2. LinkedHashMap · 有序 ...

  9. zoj1001-A + B Problem

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1 A + B Problem Time Limit: 2 Seconds     ...

  10. 【HDU4967】Handling the Past

    题意 模拟栈操作.有三种操作push,pop,peak分别代表从栈顶压入元素,删除栈顶元素,查询栈顶元素.但是,每个操作会给出一个时间戳,要求操作必须要按照时间戳来进行.但是对于每个peak必须马上给 ...