自己开发的自定义分页控件

时间:2021-05-02

  一直以来都觉得分页是麻烦的事情,.NET中虽然有DATAGRID的分页,但用其他形式的列表仍然需要使用到分页,一次一次的写不利于效率及面向对象的方法,用类或用户控件也总觉得怪怪的,用第3方的自己觉得不放心,也不利于自己进行修改,干脆就自己写了一个。

  (另外注意:在控件编译时,可以在AssemblyInfo.cs文件中设置控件的标签和名称空间,如: usingSystem.Reflection; usingSystem.Runtime.CompilerServices; usingSystem.Web.UI; [assembly:TagPrefix("PublicControls","PublicControls")]//自定义控件前缀  第一个参数是名称空间(必须是你的控件类的名称空间),第二个是标签名(可自定义)

  记得要加入System.Web.UI;名称空间,另外 将控件类内的[DefaultProperty("Text"), ToolboxData("<PublicControls:PageNavigationrunat=server></PublicControls:PageNavigation>")]这句屏蔽掉

所有代码如下:

usingSystem; usingSystem.Web.UI; usingSystem.Web.UI.WebControls; usingSystem.ComponentModel; usingSystem.Collections; usingSystem.Collections.Specialized; namespacePublicControls { ///<summary> ///PageNavigation分页导航控件。 ///</summary> [DefaultProperty("Text"), ToolboxData("<PublicControls:PageNavigationrunat=server></PublicControls:PageNavigation>")] publicclassPageNavigation:Control,IPostBackDataHandler,IPostBackEventHandler { #region预定义 privatestring_style; privateint_count; privateint_pagesize; privateint_pageindex; privateint_pages;//页群 privateint_currentpages; privatestring_first; privatestring_pres; privatestring_pre; privatestring_next; privatestring_nexts; privatestring_last; ///<summary> ///委托页面索引事件 ///</summary> publiceventEventHandlerPageIndexChange; #endregion #region属性 ///<summary> ///相关属性样式字符串属性 ///</summary> [Bindable(false), Category("StyleString"), DefaultValue("Align=left")] publicstringStyleString { get { _style=(string)ViewState["StyleString"]; return_style; } set { _style=value; ViewState["StyleString"]=_style; } } ///<summary> ///记录总数 ///</summary> [Bindable(false), Category("Count"), DefaultValue(0)] publicintCount { 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)] publicintPagesize { 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)] publicintPageindex { get { if(this.IsNumeric(ViewState["Pageindex"])) { _pageindex=(int)ViewState["Pageindex"]; } return_pageindex; } set { _pageindex=value; ViewState["Pageindex"]=_pageindex; } } ///<summary> ///页群属性 ///</summary> publicintPages { get { if(this.IsNumeric(ViewState["Pages"])) { _pages=(int)ViewState["Pages"]; } return_pages; } set { _pages=value; ViewState["Pages"]=_pages; } } ///<summary> ///当前页群索引 ///</summary> publicintCurrentPages { 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("第一页")] publicstringFirst { get { _first=(string)ViewState["First"]; return_first; } set { _first=value; ViewState["First"]=_first; } } ///<summary> ///标记样式 ///</summary> [Bindable(false), Category("pres"), DefaultValue("前N页")] publicstringPres { get { _pres=(string)ViewState["Pres"]; return_pres; } set { _pres=value; ViewState["Pres"]=_pres; } } ///<summary> ///标记样式 ///</summary> [Bindable(false), Category("pre"), DefaultValue("前一页")] publicstringPre { get { _pre=(string)ViewState["Pre"]; return_pre; } set { _pre=value; ViewState["Pre"]=_pre; } } ///<summary> ///标记样式 ///</summary> [Bindable(false), Category("next"), DefaultValue("后一页")] publicstringNext { get { _next=(string)ViewState["Next"]; return_next; } set { _next=value; ViewState["Next"]=_next; } } ///<summary> ///标记样式 ///</summary> [Bindable(false), Category("nexts"), DefaultValue("后N页")] publicstringNexts { get { _nexts=(string)ViewState["Nexts"]; return_nexts; } set { _nexts=value; ViewState["Nexts"]=_nexts; } } ///<summary> ///标记样式 ///</summary> [Bindable(false), Category("last"), DefaultValue("最后一页")] publicstringLast { get { _last=(string)ViewState["Last"]; return_last; } set { _last=value; ViewState["Last"]=_last; } } #endregion #region事件 ///<summary> ///当由类实现时,使服务器控件能够处理将窗体发送到服务器时引发的事件。 ///</summary> ///<paramname="e">所传递的参数</param> publicvoidRaisePostBackEvent(stringe) { //当发生回送的时候改变控件当前索引 if(e=="top") { Pageindex=0; CurrentPages=0; } elseif(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; } } elseif(e=="pre") { if(Pageindex>0) { Pageindex--; if(Pageindex<CurrentPages*Pages&&Pageindex>0) { CurrentPages--; } } } elseif(e=="next") { if(Pageindex<(Count+Pagesize-1)/Pagesize-1) { Pageindex++; if(Pageindex>(CurrentPages+1)*Pages-1&&Pageindex<Count-1) { CurrentPages++; } } } elseif(e=="pres") { Pageindex-=Pages; if(Pageindex<0) { Pageindex=0; } if(Pageindex<CurrentPages*Pages&&Pageindex>0) { CurrentPages--; } } elseif(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> ///<paramname="postDataKey">数据集合元素索引</param> ///<paramname="values">string的排序集合</param> ///<returns></returns> publicboolLoadPostData(stringpostDataKey,NameValueCollectionvalues) { //Pageindex=Int32.Parse(values[this.UniqueID].Split('|')[0]); //CurrentPages=Int32.Parse(values[this.UniqueID].Split('|')[1]); returnfalse; } ///<summary> ///当由类实现时,用信号要求服务器控件对象通知ASP.NET应用程序该控件的状态已更改。 ///</summary> publicvoidRaisePostDataChangedEvent() { } ///<summary> ///当页面索引改变,触发委托 ///</summary> ///<paramname="e"></param> protectedvoidOnPageIndexChange(System.EventArgse) { //委托给加载控件页的PageIndexChange事件 if(PageIndexChange!=null) { PageIndexChange(this,e); } } ///<summary> ///预呈现 ///</summary> ///<paramname="e"></param> protectedoverridevoidOnPreRender(EventArgse) { } #endregion #region输出 ///<summary> ///将此控件呈现给指定的输出参数。 ///</summary> ///<paramname="output">要写出到的HTML编写器</param> protectedoverridevoidRender(HtmlTextWriteroutput) { stringPagestring="";//定义页码呈现字符串 stringText=null;//输出主结构字符串变量定义 intNO; //输出主结构 Text="<div$style$>"; Text+="<ahref=\"javascript:"+Page.GetPostBackEventReference(this,"top")+"\">"+First+"</a>"; Text+="<ahref=\"javascript:"+Page.GetPostBackEventReference(this,"pres")+"\">"+Pres+"</a>"; Text+="<ahref=\"javascript:"+Page.GetPostBackEventReference(this,"pre")+"\">"+Pre+"</a>"; Text+="$Pagestring$"; Text+="<ahref=\"javascript:"+Page.GetPostBackEventReference(this,"next")+"\">"+Next+"</a>"; Text+="<ahref=\"javascript:"+Page.GetPostBackEventReference(this,"nexts")+"\">"+Nexts+"</a>"; Text+="<ahref=\"javascript:"+Page.GetPostBackEventReference(this,"last")+"\">"+Last+"</a>"; Text+="</div>";//<inputtype=hiddenname="+this.UniqueID+"value="+this.Pageindex+"|"+this.CurrentPages+">"; //当页大小小于0时,还原为1,防止预算出现除0错误 if(!(Pagesize>0)) { Pagesize=1; } //计算出总页数,并循环输出页码 for(inti=0;i<Pages;i++) { //获得页群内页码 NO=Pages*CurrentPages+i; if(NO<(Count+Pagesize-1)/Pagesize) { //判断页码是否为当前页 if(Pageindex!=NO) { Pagestring+="<ahref=\"javascript:"+Page.GetPostBackEventReference(this,NO.ToString())+"\">"+(NO+1).ToString()+"</a>"; } //如果不是,页面部分无连接 else { Pagestring+=(NO+1).ToString()+""; } } } if(!(Pagestring.Trim().Length>0)) { Pagestring="1"; } //替换对齐属性 Text=Text.Replace("$style$",StyleString); //替换页码部分 Text=Text.Replace("$Pagestring$",Pagestring); output.Write(Text); } #endregion #region其他函数 ///<summary> ///判断是否为数字字符串 ///</summary> ///<paramname="str">需验证的字符串</param> ///<returns>判断结果,符合条件为True,不符合条件为False</returns> publicboolIsNumeric(stringstr) { //判断是否为空 if(str==null||str.Length==0) { returnfalse; } //循环检查每个字符 foreach(charcinstr) { if(!Char.IsNumber(c)) { returnfalse; } } returntrue; } ///<summary> ///判断是否为数字字符串 ///</summary> ///<paramname="obj">需验证的字符串</param> ///<returns>判断结果,符合条件为True,不符合条件为False</returns> publicboolIsNumeric(objectobj) { obj+=""; stringstr=obj.ToString(); //判断是否为空 if(str==null||str.Length==0) { returnfalse; } //循环检查每个字符 foreach(charcinstr) { if(!Char.IsNumber(c)) { returnfalse; } } returntrue; } #endregion } }

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章