• 自定义分页控件


    一直以来都觉得分页是麻烦的事情,.NET中虽然有DATAGRID的分页,但用其他形式的列表仍然需要使用到分页,一次一次的写不利于效率及面向对象的方法,用类或用户控件也总觉得怪怪的,用第3方的自己觉得不放心,也不利于自己进行修改,干脆就自己写了一个。
    (另外注意:在控件编译时,可以在AssemblyInfo.cs文件中设置控件的标签和名称空间,如:
    using System.Reflection;
    using System.Runtime.CompilerServices;
    using System.Web.UI;

    [assembly: TagPrefix("PublicControls","PublicControls")]  // 自定义控件前缀
    第一个参数是名称空间(必须是你的控件类的名称空间),第二个是标签名(可自定义)
    记得要加入System.Web.UI;名称空间,另外 将控件类内的
         [DefaultProperty("Text"),
         ToolboxData("<PublicControls:PageNavigation runat=server></PublicControls:PageNavigation>")]这句屏蔽掉
    )

    所有代码如下:

    using System;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.ComponentModel;
    using System.Collections;
    using System.Collections.Specialized;
     
     
     
    namespace PublicControls
    {
         ///<summary>
         /// PageNavigation 分页导航控件。
         ///</summary>
         [DefaultProperty("Text"),
         ToolboxData("<PublicControls:PageNavigation runat=server></PublicControls:PageNavigation>")]
         public class PageNavigation : Control,IPostBackDataHandler,IPostBackEventHandler
         {
             #region预定义
            
             private string _style;
             private int _count;
             private int _pagesize;
             private int _pageindex;
            private int _pages;         //页群
             private int _currentpages;
             private string _first;
             private string _pres;
             private string _pre;
             private string _next;
             private string _nexts;
             private string _last;
     
     
             ///<summary>
             ///委托页面索引事件
             ///</summary>
             public event EventHandler PageIndexChange;
     
             #endregion
     
             #region属性
            
             ///<summary>
             ///相关属性样式字符串属性
             ///</summary>
             [Bindable(false),
             Category("StyleString"),
             DefaultValue("Align=left")]
             public string StyleString
             {
                  get
                  {
                       _style = (string)ViewState["StyleString"];
                       return _style;
                  }
     
                  set
                  {
                       _style= value;
                       ViewState["StyleString"] = _style;
                  }
             }
     
             ///<summary>
             ///记录总数
             ///</summary>
             [Bindable(false),
             Category("Count"),
             DefaultValue(0)]
             public int Count
             {
                  get
                  {
                       if (this.IsNumeric(ViewState["Count"]))
                       {
                           _count = (int)ViewState["Count"];
                       }
                       return _count;
                  }
     
                  set
                  {
                       _count = value;
                       ViewState["Count"] = _count;
                      
                  }
             }
     
             ///<summary>
             ///页面大小
             ///</summary>
             [Bindable(false),
             Category("Pagesize"),
             DefaultValue(10)]
             public int Pagesize
             {
                  get
                  {
                      
                       if (this.IsNumeric(ViewState["Pagesize"]))
                       {
                           _pagesize = (int)ViewState["Pagesize"];
                       }
                       return _pagesize;
                  }
     
                  set
                  {
                       _pagesize = value;
                       ViewState["Pagesize"] = _pagesize;
                      
                  }
             }
     
             ///<summary>
             ///当前页索引
             ///</summary>
             [Bindable(false),
             Category("Pageindex"),
             DefaultValue(0)]
             public int Pageindex
             {
                  get
                  {
                       if (this.IsNumeric(ViewState["Pageindex"]))
                       {
                           _pageindex = (int)ViewState["Pageindex"];
                       }
                       return _pageindex;
                  }
     
                  set
                  {
                       _pageindex = value;
                       ViewState["Pageindex"] = _pageindex;
                  }
             }
     
             ///<summary>
             ///页群属性
             ///</summary>
             public int Pages
             {
                  get
                  {
                       if (this.IsNumeric(ViewState["Pages"]))
                       {
                           _pages = (int)ViewState["Pages"];
                       }
                       return _pages;
                  }
                  set
                  {
                       _pages = value;
                       ViewState["Pages"] = _pages;
                  }
             }
     
             ///<summary>
             ///当前页群索引
             ///</summary>
             public int CurrentPages
             {
                  get
                  {
                       if (this.IsNumeric(ViewState["CurrentPages"]))
                       {
                           _currentpages = (int)ViewState["CurrentPages"];
                       }
                       return _currentpages;
                  }
                  set
                  {
                       _currentpages = value;
                       ViewState["CurrentPages"] = _currentpages;
                  }
             }
     
             ///<summary>
             ///标记样式
             ///</summary>
             [Bindable(false),
             Category("first"),
             DefaultValue("第一页")]
             public string First
             {
                  get
                  {
                       _first = (string)ViewState["First"];
                       return _first;
                  }
     
                  set
                  {
                       _first = value;
                       ViewState["First"] = _first;
                  }
             }
     
             ///<summary>
             ///标记样式
             ///</summary>
             [Bindable(false),
             Category("pres"),
             DefaultValue("前N页")]
             public string Pres
             {
                  get
                  {
                       _pres = (string)ViewState["Pres"];
                       return _pres;
                  }
     
                  set
                  {
                       _pres = value;
                       ViewState["Pres"] = _pres;
                  }
             }
     
             ///<summary>
             ///标记样式
             ///</summary>
             [Bindable(false),
             Category("pre"),
             DefaultValue("前一页")]
             public string Pre
             {
                  get
                  {
                       _pre = (string)ViewState["Pre"];
                       return _pre;
                  }
     
                  set
                  {
                       _pre = value;
                       ViewState["Pre"] = _pre;
                  }
             }
     
             ///<summary>
             ///标记样式
             ///</summary>
             [Bindable(false),
             Category("next"),
             DefaultValue("后一页")]
             public string Next
             {
                  get
                  {
                       _next = (string)ViewState["Next"];
                       return _next;
                  }
     
                  set
                  {
                       _next = value;
                       ViewState["Next"] = _next;
                  }
             }
     
             ///<summary>
             ///标记样式
             ///</summary>
             [Bindable(false),
             Category("nexts"),
             DefaultValue("后N页")]
             public string Nexts
             {
                  get
                  {
                       _nexts = (string)ViewState["Nexts"];
                       return _nexts;
                  }
     
                  set
                  {
                       _nexts = value;
                       ViewState["Nexts"] = _nexts;
                  }
             }
     
             ///<summary>
             ///标记样式
             ///</summary>
             [Bindable(false),
             Category("last"),
             DefaultValue("最后一页")]
             public string Last
             {
                  get
                  {
                       _last = (string)ViewState["Last"];
                       return _last;
                  }
                  set
                  {
                       _last = value;
                       ViewState["Last"] = _last;
                  }
             }
     
     
             #endregion
     
             #region事件
             ///<summary>
             ///当由类实现时,使服务器控件能够处理将窗体发送到服务器时引发的事件。
             ///</summary>
             ///<param name="e">所传递的参数</param>
             public void RaisePostBackEvent(string e)
             {
                  //当发生回送的时候改变控件当前索引
                  if(e=="top")
                  {
                       Pageindex = 0;
                       CurrentPages = 0 ;
                  }
                  else if(e=="last")
                  {
                       Pageindex = (Count+Pagesize-1)/Pagesize -1;
                      
                       CurrentPages = ((Count+Pagesize-1)/Pagesize+Pages-1)/ Pages -1;
     
                       if(Pageindex<0)
                       {
                           Pageindex=0;
                       }
                       if(CurrentPages<0)
                       {
                           CurrentPages=0;
                       }
                      
                  }
                  else if(e=="pre")
                  {
                       if(Pageindex>0)
                       {
                           Pageindex--;
                           if(Pageindex<CurrentPages*Pages && Pageindex>0)
                           {
                                CurrentPages--;
                           }
                       }
                  }
                  else if(e=="next")
                  {
                       if(Pageindex<(Count+Pagesize-1)/Pagesize -1)
                       {
                           Pageindex++;
                           if(Pageindex>(CurrentPages+1)*Pages-1 && Pageindex<Count-1)
                           {
                                CurrentPages++;
                           }
                       }
                  }
                  else if(e=="pres")
                  {
                       Pageindex -= Pages;
                       if(Pageindex<0)
                       {
                           Pageindex = 0;
                       }
                       if(Pageindex<CurrentPages*Pages && Pageindex>0)
                       {
                           CurrentPages--;
                       }
                  }
                  else if(e=="nexts")
                  {
                       Pageindex += Pages;
                       if(Pageindex>(Count+Pagesize-1)/Pagesize -1)
                       {
                           Pageindex = (Count+Pagesize-1)/Pagesize -1;
                       }
                       if(Pageindex>(CurrentPages+1)*Pages-1 && Pageindex<Count-1)
                       {
                           CurrentPages++;
                       }
                  }
                  else
                  {
                       Pageindex = int.Parse(e.ToString());
                  }
            
                  //发生回送事件时引发OnPageIndexChange事件
                  OnPageIndexChange(System.EventArgs.Empty);
             }
     
             ///<summary>
             ///当由类实现时,为 ASP.NET 服务器控件处理回发数据。
             ///</summary>
             ///<param name="postDataKey">数据集合元素索引</param>
             ///<param name="values">string 的排序集合</param>
             ///<returns></returns>
             public bool LoadPostData(string postDataKey, NameValueCollection values)
             {
                  //Pageindex = Int32.Parse(values[this.UniqueID].Split('|')[0]);
                  //CurrentPages = Int32.Parse(values[this.UniqueID].Split('|')[1]);
                  return false;
             }
     
             ///<summary>
             ///当由类实现时,用信号要求服务器控件对象通知 ASP.NET 应用程序该控件的状态已更改。
             ///</summary>
             public void RaisePostDataChangedEvent()
             {
             }
     
             ///<summary>
             ///当页面索引改变,触发委托
             ///</summary>
             ///<param name="e"></param>
             protected void OnPageIndexChange(System.EventArgs e)
             {   
                  //委托给加载控件页的PageIndexChange事件
                  if (PageIndexChange!=null)
                  {
                       PageIndexChange(this,e);
                  }
             }
     
             ///<summary>
             ///预呈现
             ///</summary>
             ///<param name="e"></param>
             protected override void OnPreRender(EventArgs e)
             {
             }
     
             #endregion
     
             #region输出
             ///<summary>
             ///将此控件呈现给指定的输出参数。
             ///</summary>
             ///<param name="output">要写出到的 HTML 编写器 </param>
             protected override void Render(HtmlTextWriter output)
             {
     
                  string Pagestring = "";  //定义页码呈现字符串
                  string Text = null;          //输出主结构字符串变量定义
                  int NO;
     
                  //输出主结构
                  Text = "<div $style$>";
                 
                  Text +="<a href =\"javascript:"+ Page.GetPostBackEventReference(this,"top")+ "\">"+First+"</a>&nbsp;";
     
                  Text +="<a href =\"javascript:"+ Page.GetPostBackEventReference(this,"pres")+ "\">"+Pres+"</a>&nbsp;";
     
                  Text +="<a href =\"javascript:"+ Page.GetPostBackEventReference(this,"pre")+ "\">"+Pre+"</a>&nbsp;";
     
                  Text +="$Pagestring$";
     
                  Text +="<a href =\"javascript:"+ Page.GetPostBackEventReference(this,"next")+ "\">"+Next+"</a>&nbsp;";
     
                  Text +="<a href =\"javascript:"+ Page.GetPostBackEventReference(this,"nexts")+ "\">"+Nexts+"</a>&nbsp;";
                 
                  Text +="<a href =\"javascript:"+ Page.GetPostBackEventReference(this,"last")+ "\">"+Last+"</a>&nbsp;";
     
                  Text +="</div>";//<input type = hidden name ="+this.UniqueID+" value = "+this.Pageindex+"|"+this.CurrentPages+">";    
     
                  //当页大小小于0时,还原为1,防止预算出现除0错误
                  if (!(Pagesize>0))
                  {
                       Pagesize = 1;
                  }
                 
                 
     
                  //计算出总页数,并循环输出页码
                  for (int i = 0;i< Pages ;i++ )
                  {
                       //获得页群内页码
                       NO = Pages * CurrentPages + i;
     
                       if(NO<(Count+Pagesize-1)/Pagesize)
                       {
                           //判断页码是否为当前页
                           if (Pageindex != NO)
                           {
                                Pagestring += "<a href = \"javascript:"+ Page.GetPostBackEventReference(this,NO.ToString())+ "\">"+(NO+1).ToString()+"</a>&nbsp;";
                           }
                                //如果不是,页面部分无连接
                           else
                           {
                                Pagestring += (NO+1).ToString()+"&nbsp;";
                           }
                       }
                  }
     
                  if (!(Pagestring.Trim().Length>0))
                  {
                       Pagestring = "1";
                  }
                 
                  //替换对齐属性
                  Text = Text.Replace("$style$",StyleString);
               
                  //替换页码部分
                  Text = Text.Replace("$Pagestring$",Pagestring);
                 
     
                  output.Write(Text);
                 
             }
             #endregion
     
             #region其他函数
             ///<summary>
             ///判断是否为数字字符串
             ///</summary>
             ///<param name="str">需验证的字符串</param>
             ///<returns>判断结果,符合条件为True,不符合条件为False</returns>
             public bool IsNumeric(string str)
             {
                  //判断是否为空
                  if (str == null || str.Length==0)
                  {
                       return false;
                  }
                  //循环检查每个字符
                  foreach(char c in str)
                  {
                       if (!Char.IsNumber(c))
                       {
                           return false;
                       }
                  }
                  return true;
             }
     
             ///<summary>
             ///判断是否为数字字符串
             ///</summary>
             ///<param name="obj">需验证的字符串</param>
             ///<returns>判断结果,符合条件为True,不符合条件为False</returns>
             public bool IsNumeric(object obj)
             {
     
                  obj += "";
                  string str = obj.ToString();
                 
                  //判断是否为空
                  if (str == null || str.Length==0)
                  {
                       return false;
                  }
                  //循环检查每个字符
                  foreach(char c in str)
                  {
                       if (!Char.IsNumber(c))
                       {
                           return false;
                       }
                  }
                  return true;
             }
     
             #endregion
         }
    }
  • 相关阅读:
    30.3 Collections 集合体系的工具类
    30.2 案例:ArrayList本身数据可以重复,写出去重的方法
    30 HashSet
    29.3 ArrayList、List、LinkedList(链表)优缺点
    foreach-- for循环的增强型:for(类型 变量 : 数组对象) { 使用变量 }
    <E> 泛型
    29.2 Iterator 迭代器ConcurrentModificationException:并发修改异常处理
    29.2 Iterator 迭代器
    29.1 collection层次结构 中的根接口
    29 collection 集合体系结构
  • 原文地址:https://www.cnblogs.com/scgw/p/851861.html
Copyright © 2020-2023  润新知