日期:2014-06-10 浏览次数:20605 次
最近在写一个关于NET的框架,写到后面果不其然的就遇到了分页,自己看了很多关于分页的并自己结合写了一个,晒出来和大家分享一下,第一次写博客望大家多多提意见啦。。。
cs文件分页代码:
1 Paging p = new Paging(3, sql语句); //每页3条 2 ViewState["List"] = p.GetDataTable(); //查询出要显示的DataTable 3 ViewState["page"] = p.GetPageing(this); //分页显示html
前台调用:
1 <%=ViewState["page"]%>
最近刚发现的ViewState这个函数,只要后台定义前台就可以调用很方便。(这个是不是自己out了,现在才发现)
下面是关于Paging类:
1 public class Paging 2 { 3 private string pagedNum; //定义分页条,输出到前台 4 private int pageSize; // 定义每页有多少条数据量. 5 private string url; //获取当前页 6 private int countNum; //总条数 7 private string SelSql; //查询SQL语句 8 private DataSet ds; 9 10 public Paging(int pageSize, string SelSql) 11 { 12 this.pageSize = pageSize; 13 this.url = HttpContext.Current.Request.Url.LocalPath; 14 this.SelSql = SelSql; 15 GetPageDate(SelSql); 16 } 17 //定义样式a标签第一个样式 18 private readonly string csstagA = @"<a href='{0}?page={1}' >{2}</a>"; //{0}{1}{2}代表url和参数名,参数值,页码值 19 //定义样式a标签第二个样式 20 //private readonly string csstagA1 = "<a style='font-size:13px;font-weight:bold;margin:0 4px 0 4px'>{0}</a>"; 21 private readonly string csstagA1 = "<span class='pc'>{0}</span>"; 22 23 24 public delegate int GetDelegate(); 25 26 27 /// <summary> 28 /// 生成分页条 29 /// </summary> 30 /// <param name="pageIndex">当前页</param> 31 /// <param name="del">获得数据条数的方法</param> 32 /// <returns></returns> 33 public string GetPageing(Page p) 34 { 35 string index = p.Request.QueryString["page"]; 36 int i; 37 if (!string.IsNullOrEmpty(index) && int.TryParse(index, out i)) 38 { 39 pagedNum = GetPagegNum(i, GetPageCount(i, countNum)); 40 } 41 else 42 { 43 pagedNum = GetPagegNum(1, GetPageCount(1, countNum)); 44 } 45 46 return pagedNum; 47 } 48 49 private int GetPageCount(int pageIndex, int countPage) //获得总页数 50 { 51 int Count = 0; 52 Count = countPage; 53 double c = Count * 1.0 / pageSize; 54 return (int)Math.Ceiling(c); 55 } 56 57 58 private string GetPagegNum(int pageIndex, int pageCount) //类似 上一页 1 ... 7 8 9 ⑩ 11 12 13 14 下一页 ⑩是当前选中页 59 { 60 StringBuilder sb = new StringBuilder(); 61 List<int> ns = new List<int>(); //用于接收当前页范围内的数字 62 string[] numList = new string[12]; //12个字符串数组,存放分页条数据 63 numList[0] = ""; //“上一页”位置 64 numList[11] = ""; //“下一页”位置 65 if (pageIndex > 1) //判断当前页 66 { 67 numList[0] = string.Format(csstagA, url, (pageIndex - 1), "<上一页"); 68 } 69 if (pageIndex < pageCount) 70 { 71 numList[11] = string.Format(csstagA, url, (pageIndex + 1), "下一页>"); 72 } 73 if (pageIndex >= 10) //当前页大于10页的状态 74 { 75 //主要的 76 numList[1] = string.Format(csstagA, url, 1, 1); 77 numList[2] = "..."; 78 //int index = 0; 79 if (pageIndex + 4 >= pageCount) //如果当前页加4页小于总页数 80 { 81 for (int i = pageCount - 7; i < pageCount + 1; i++) 82 { 83 //index = i; 84 ns.Add(i); 85 } 86 for (int j = 0; j <= 7; j++) //遍历ns页码值填充到分页条 87 { 88 if (ns[j] == pageIndex) //判断是否为当前页码,来使用不同css样式 89 { 90 numList[j + 3] = string.Format(csstagA1, ns[j]); //因为字符串数组前3位分别为“上一页”,“1”,“...”,所以从第四位填充7个 91 } 92 numList[j + 3] = string.Format(csstagA, url, ns[j], ns[j]); 93 } 94 } 95 for (int i = pageIndex - 3; i <= pageIndex + 4; i++) 96 { 97 //index = i; 98 ns.Add(i); 99 } 100 for (int j = 0; j <= 7; j++) 101 { 102 if (ns[j] == pageIndex) 103 { 104 numList[j + 3] = string.Format(csstagA1, ns[j]); 105 } 106 else 107 { 108 numList[j + 3] = string.Format(csstagA, url, ns[j], ns[j]); 109 } 110 } 111 } 112 else //10页以下的状态 113 { 114 if (pageCount >= 10) //页数大于等于10 115 { 116 for (int i = 1; i <= 10; i++) 117 { 118 if (i == pageIndex) 119 { 120 numList[i] = string.Format(csstagA1, i); 121 } 122 else 123 { 124 numList[i] = string.Format(csstagA, url, i, i); 125 } 126 } 127 } 128 else //页数小于10 129 { 130 for (int i = 1; i <= pageCount; i++) 131 { 132 if (i == pageIndex) 133 { 134 numList[i] = string.Format(csstagA1, i); 135 } 136 else 137 { 138 numList[i] = string.Format(csstagA, url, i, i); 139 } 140 } 141 } 142 } 143 sb.Append("<div class='page'>"); 144 for (int i = 0; i < numList.Length; i++) //将字符串数组填入StringBulider中 145 { 146 sb.Append(numList[i]); 147 } 148 149 sb.AppendFormat(" 共{0}/{1}条", pageIndex, pageCount); 150 sb.Append("</div>"); 151 return sb.ToString(); //返回,并在前台 <span id="pagedspan"><%=pagedNum %></span> 152 } 153 154 /// <summary> 155 /// 获取分页数据和总页数 156 /// </summary> 157 /// <param name="pageSql"></param> 158 public void GetPageDate(string pageSql) 159 { 160 int pageIndex = Req.QueryString("page").ToInt(1); 161 162 StringBuilder strSql = new StringBuilder(); 163 strSql.Append(@"declare @startRow int 164 declare @endRow int 165 declare @pageSize int 166 declare @pageIndex int 167 set @pageSize=@pageSize2 168 set @pageIndex=@pageIndex2 169 set @startRow=(@pageIndex-1) * @pageSize+1 170 set @endRow=@pageSize*@pageIndex"); 171 strSql.Append(" select * from("); 172 strSql.Append("select *,ROW_NUMBER() OVER (ORDER BY getdate()) pageID from("); 173 strSql.Append(pageSql); 174 strSql.Append(")tab_a"); 175 strSql.Append(")tab_b where pageID between @startRow and @endRow"); 176 177 strSql.Append(" select COUNT(*) from("); //查询总页数 178 strSql.Append(pageSql); 179 strSql.Append(")tab_count"); 180 181 //pagesize 每页条数 182 //pageIndex 第几页 183 //set @startRow=(@pageIndex-1) * @pageSize+1 开始页 184 //set @endRow=@pageSize*@pageIndex 结束页 185 186 187 ds = DBHelper.GetDataSet(strSql.ToString()); 188 countNum = int.Parse(ds.Tables[1].Rows[0][0].ToString()); 189 } 190 191 /// <summary> 192 /// 分页数据列表 193 /// </summary> 194 /// <returns></returns> 195 public DataTable GetDataTable() 196 { 197 return this.ds.Tables[0]; 198 } 199 200 }
关键的分页SQL是:
select * from( select *,ROW_NUMBER() OVER (ORDER BY getdate()) pageID from 表名 )a where pageID between (@pageIndex-1) * @pageSize+1 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:0 5px 0 5px; } .page a{ border:1px solid #CFCBCB; font-size:13px;padding:8px 13px;margin:0 5px 0 5px;text-decoration:none;display:inline-block; } .page a:hover { background:#f2f8ff;border:1px solid #38f; } /*End 分页*/
最后的显示效果如下:
OK,这以上就是我分页实现的具体步骤了。o(∩_∩)o 哈哈。。。