NET分頁實現及代碼


最近在寫一個關於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     }
View Code

關鍵的分頁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 哈哈。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM