最近在寫一個關於NET的框架,寫到后面果不其然的就遇到了分頁,自己看了很多關於分頁的並自己結合寫了一個,曬出來和大家分享一下,第一次寫博客望大家多多提意見啦。。。
cs文件分頁代碼:
1 Paging p = new Paging(3, sql語句); //每頁3條 2 ViewData["List"] = p.GetDataTable(); //查詢出要顯示的DataTable 3 ViewData["page"] = p.GetPageing(this); //分頁顯示html
前台調用:
1 <%=ViewData["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 哈哈。。。
