照着百度的分页写了一个分页条

来源:互联网 发布:龙泉驾校网络预约考试 编辑:程序博客网 时间:2024/05/08 12:33
[csharp] view plaincopy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5. using System.Text;  
  6. using System.Configuration;  
  7. using System.Web.UI;  
  8.   
  9.   
  10. namespace MyPager  
  11. {  
  12.     public class Pager  
  13.     {  
  14.         private string pagedNum;            //定义分页条,输出到前台    
  15.         private int pageSize; // 定义每页有多少条数据量.    
  16.         private string url;  
  17.         public Pager(int pageSize, string url)  
  18.         {  
  19.             this.pageSize = pageSize;  
  20.             this.url = url;  
  21.         }  
  22.   
  23.   
  24.         //定义样式a标签第一个样式    
  25.         private readonly string csstagA = @"<a class='ho' style='border:1px solid #999999; font-size:13px;padding:4px 6px 4px 6px;margin:0 4px 0 4px;text-decoration:none' href='{0}?page={1}' >{2}</a>";            //{0}{1}{2}代表url和参数名,参数值,页码值    
  26.         //定义样式a标签第二个样式    
  27.         private readonly string csstagA1 = "<a style='font-size:13px;font-weight:bold;margin:0 4px 0 4px'>{0}</a>";  
  28.   
  29.   
  30.         public delegate int GetDelegate();  
  31.   
  32.   
  33.         /// <summary>    
  34.         /// 生成分页条    
  35.         /// </summary>    
  36.         /// <param name="pageIndex">当前页</param>    
  37.         /// <param name="del">获得数据条数的方法</param>    
  38.         /// <returns></returns>    
  39.         public string GetpagedNum(Page p, GetDelegate del)  
  40.         {  
  41.             string index = p.Request.QueryString["page"];  
  42.             int i;  
  43.             if (!string.IsNullOrEmpty(index) && int.TryParse(index, out i))  
  44.             {  
  45.                 pagedNum = GetpagegNum(i, GetpageCount(i, del));  
  46.             }  
  47.             else  
  48.             {  
  49.                 pagedNum = GetpagegNum(1, GetpageCount(1, del));  
  50.             }  
  51.             //注册a标签hover状态  
  52.             p.ClientScript.RegisterStartupScript(this.GetType(), "hover", @"<script type='text/javascript'>  
  53.                 window.onload = function () {  
  54.                     var classElements = document.getElementsByTagName('a');  
  55.                     for (var i = 0; i < classElements.length; i++) {  
  56.                     classElements[i].onmouseover = function () {  
  57.                         if (this.className == 'ho') {  
  58.                             this.style.backgroundColor = '#EFEBE6';  
  59.                         }  
  60.                     }  
  61.                     classElements[i].onmouseout = function () {  
  62.                         if (this.className == 'ho') {  
  63.                             this.style.backgroundColor = 'white';  
  64.                         }  
  65.                     }  
  66.                 }  
  67.             }  
  68.             </script>");             
  69.             return pagedNum;  
  70.         }  
  71.                
  72.         private int GetpageCount(int pageIndex, GetDelegate del)     //获得总页数    
  73.         {             
  74.             int Count = 0;  
  75.             Count = del();  
  76.             double c = Count * 1.0 / pageSize;  
  77.             return (int)Math.Ceiling(c);  
  78.         }  
  79.   
  80.   
  81.         private string GetpagegNum(int pageIndex, int pageCount)           //类似   上一页 1 ... 7 8 9 ⑩ 11 12 13 14 下一页   ⑩是当前选中页    
  82.         {  
  83.             StringBuilder sb = new StringBuilder();  
  84.             List<int> ns = new List<int>();              //用于接收当前页范围内的数字    
  85.             string[] numList = new string[12];           //12个字符串数组,存放分页条数据    
  86.             numList[0] = "";       //“上一页”位置    
  87.             numList[11] = "";      //“下一页”位置        
  88.             if (pageIndex > 1)                                         //判断当前页    
  89.             {  
  90.                 numList[0] = string.Format(csstagA, url, (pageIndex - 1), "<上一页");  
  91.             }  
  92.             if (pageIndex < pageCount)  
  93.             {  
  94.                 numList[11] = string.Format(csstagA, url, (pageIndex + 1), "下一页>");  
  95.             }  
  96.             if (pageIndex >= 10)    //当前页大于10页的状态    
  97.             {  
  98.                 //主要的    
  99.                 numList[1] = string.Format(csstagA, url, 1, 1);  
  100.                 numList[2] = "...";  
  101.                 //int index = 0;    
  102.                 if (pageIndex + 4 >= pageCount)    //如果当前页加4页小于总页数    
  103.                 {  
  104.                     for (int i = pageCount - 7; i < pageCount + 1; i++)  
  105.                     {  
  106.                         //index = i;    
  107.                         ns.Add(i);  
  108.                     }  
  109.                     for (int j = 0; j <= 7; j++)    //遍历ns页码值填充到分页条    
  110.                     {  
  111.                         if (ns[j] == pageIndex)     //判断是否为当前页码,来使用不同css样式    
  112.                         {  
  113.                             numList[j + 3] = string.Format(csstagA1, ns[j]);  //因为字符串数组前3位分别为“上一页”,“1”,“...”,所以从第四位填充7个    
  114.                         }  
  115.                         numList[j + 3] = string.Format(csstagA, url, ns[j], ns[j]);  
  116.                     }  
  117.                 }  
  118.                 for (int i = pageIndex - 3; i <= pageIndex + 4; i++)  
  119.                 {  
  120.                     //index = i;    
  121.                     ns.Add(i);  
  122.                 }  
  123.                 for (int j = 0; j <= 7; j++)  
  124.                 {  
  125.                     if (ns[j] == pageIndex)  
  126.                     {  
  127.                         numList[j + 3] = string.Format(csstagA1, ns[j]);  
  128.                     }  
  129.                     else  
  130.                     {  
  131.                         numList[j + 3] = string.Format(csstagA, url, ns[j], ns[j]);  
  132.                     }  
  133.                 }  
  134.             }  
  135.             else   //10页以下的状态    
  136.             {  
  137.                 if (pageCount >= 10)               //页数大于等于10    
  138.                 {  
  139.                     for (int i = 1; i <= 10; i++)  
  140.                     {  
  141.                         if (i == pageIndex)  
  142.                         {  
  143.                             numList[i] = string.Format(csstagA1, i);  
  144.                         }  
  145.                         else  
  146.                         {  
  147.                             numList[i] = string.Format(csstagA, url, i, i);  
  148.                         }  
  149.                     }  
  150.                 }  
  151.                 else            //页数小于10    
  152.                 {  
  153.                     for (int i = 1; i <= pageCount; i++)  
  154.                     {  
  155.                         if (i == pageIndex)  
  156.                         {  
  157.                             numList[i] = string.Format(csstagA1, i);  
  158.                         }  
  159.                         else  
  160.                         {  
  161.                             numList[i] = string.Format(csstagA, url, i, i);  
  162.                         }  
  163.                     }  
  164.                 }  
  165.             }  
  166.             for (int i = 0; i < numList.Length; i++)   //将字符串数组填入StringBulider中    
  167.             {  
  168.                 sb.Append(numList[i]);  
  169.             }  
  170.             return sb.ToString();   //返回,并在前台 <span id="pagedspan"><%=pagedNum %></span>    
  171.         }  
  172.     }  
  173. }  

下面是一个页面后台调用:

[csharp] view plaincopy
  1. public partial class WebForm3 : System.Web.UI.Page  
  2.     {  
  3.         protected string Pagers;     //要输出到前台的分页条字符串  
  4.         protected void Page_Load(object sender, EventArgs e)  
  5.         {  
  6.                 Pager p = new Pager(10, Request.Url.LocalPath);  
  7.                 Pagers = p.GetpagedNum(this, ()=>123);             
  8.         }  
  9.     }  
前台:

[html] view plaincopy
  1. <body>  
  2.     <form id="form1" runat="server">  
  3.     <div>   
  4.     <%=Pagers %>     
  5.     </div>  
  6.     </form>  
  7. </body>  

下面这个样子:

百度的样子:

人生第一次写博客啊,修改了下。
样式还有一些小小差别,还是有点像百度的分页样子,就是css方面了。
我这只是照葫芦画瓢,肯定这样那样问题,就当练练手