NET分页实现及代码

最近在写一个关于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 分页*/

最后的显示效果如下:

NET分页实现及代码

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

上一篇:Razor 中的@helper 与 @function 用法


下一篇:php新浪云链接mysql与storage