分享
 
 
 

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

王朝other·作者佚名  2007-01-22
窄屏简体版  字體: |||超大  

一直以来都觉得分页是麻烦的事情,.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

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有