一个简单的分页控件,用来自定义分页用的
一个简单的分页控件,用来自定义分页用的 在做项目的过程中,最初采用Datagrid的默任的分页方式分页,后来发现对于大的数据量速度很慢,NET进程占用系统资源也很大,后来写了个分页的存储过程,每次取数据都只取当前页的,分页是分好了,但是发现翻页就没那么方便了,于是自己写了个简单的分页控件,代码如下(编译以后直接形成dll就可以用)。
程序代码:
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
namespace PageInfoControl
{
/// <summary>
/// WebCustomControl1 的摘要说明。
/// </summary>
[DefaultProperty('TotalRecord'),
ToolboxData('<{0}:PageInfo runat=server></{0}:PageInfo>')]
public class PageInfo : System.Web.UI.WebControls.WebControl,IPostBackEventHandler
{
#region Construct method
/// <summary>
/// 构造函数
/// </summary>
public PageInfo():base(HtmlTextWriterTag.Div)
{
}
#endregion
#region Variables and Constants
public event EventHandler ChangePageClick;
private string _BarBackGroundColor = '#F1F1F1';
private string _BarLinkColor = 'Navy';
private string _BarCurrentColor = '#EEEEEE';
private int _TotalRecord = 0;
private int _TotalPage = 0;
private int _PageSize = 0;
private int _CurrentPageIndex = 1;
private int _ItemSize = 10;
#endregion
#region Properties
[
Description('分页条背景色'),
Bindable(true),
Category('Appearance'),
DefaultValue('#F1F1F1')
]
public string BarBackGroundColor
{
get{return _BarBackGroundColor;}
set{_BarBackGroundColor = value;}
}
[
Description('分页条带链接数字颜色'),
Bindable(true),
Category('Appearance'),
DefaultValue('Navy')
]
public string BarLinkColor
{
get{return _BarLinkColor;}
set{_BarLinkColor = value;}
}
[
Description('分页条当前页数字颜色'),
Bindable(true),
Category('Appearance'),
DefaultValue('#EEEEEE')
]
public string BarCurrentColor
{
get{return _BarCurrentColor;}
set{_BarCurrentColor = value;}
}
[
Description('总记录数'),
Bindable(false),
Category('Behavior'),
DefaultValue(0)
]
public int TotalRecord
{
get{return _TotalRecord;}
set
{
foreach(char c in System.Convert.ToString(value))
{
if (!Char.IsNumber(c))
{
_TotalRecord = 0;
break;
}
}
_TotalRecord = value;
}
}
[
Description('每页显示记录数'),
Bindable(true),
Category('Behavior'),
DefaultValue(0)
]
public int PageSize
{
get{return _PageSize;}
set
{
foreach(char c in System.Convert.ToString(value))
{
if (!Char.IsNumber(c))
{
_PageSize = 0;
break;
}
}
_PageSize = value;
}
}
[
Description('总页数'),
Bindable(true),
Category('Behavior'),
DefaultValue(0)
]
public int TotalPage
{
get{return _TotalPage;}
}
[
Description('数字规格'),
Bindable(true),
Category('Behavior'),
DefaultValue(10)
]
public int ItemSize
{
get{return _ItemSize;}
set
{
foreach(char c in System.Convert.ToString(value))
{
if (!Char.IsNumber(c))
{
_ItemSize = 10;
break;
}
}
_ItemSize = value;
}
}
[
Description('当前页值'),
Bindable(true),
Category('Behavior'),
DefaultValue(1)
]
public int CurrentPageIndex
{
get{return _CurrentPageIndex;}
set{_CurrentPageIndex = value;}
}
#endregion
//定义Div的样式
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
writer.AddStyleAttribute('White-space','nowrap');
writer.AddStyleAttribute('Padding-Top','2px');
writer.AddStyleAttribute('Padding-Bottom','2px');
writer.AddStyleAttribute('Width',Width.ToString());
writer.AddStyleAttribute('Height',Height.ToString());
base.AddAttributesToRender (writer);
}
protected virtual void OnPageChangeClick(EventArgs e)
{
if (ChangePageClick != null)
{
ChangePageClick(this, e);
}
}
public void RaisePostBackEvent(string eventArgument)
{
int PageIndex = int.Parse(eventArgument);
this._CurrentPageIndex = PageIndex;
OnPageChangeClick(new EventArgs());
}
/// <summary>
/// 将此控件呈现给指定的输出参数。
/// </summary>
/// <param name='output'> 要写出到的 HTML 编写器 </param>
protected override void RenderContents(HtmlTextWriter output)
{
this._TotalPage = ((this.TotalRecord / PageSize) * this.PageSize == this.TotalRecord)?(this.TotalRecord / this.PageSize):((this.TotalRecord / this.PageSize) + 1);
int BeginRecord = (this.CurrentPageIndex - 1) * this.PageSize + 1;
int EndRecord = this.CurrentPageIndex * this.PageSize;
EndRecord = (EndRecord>this.TotalRecord)?this.TotalRecord:EndRecord;
string PageInfo = '[共<font color=#CC0000>'+this.TotalPage.ToString()+'</font>页/当前第<font color=#CC0000>'+this.CurrentPageIndex.ToString()+'</font>页 共<font color=#CC0000>'+TotalRecord.ToString()+'</font>条记录,当前记录数<font color=#CC0000>'+BeginRecord.ToString()+'</font>到<font color=#CC0000>'+EndRecord.ToString()+'</font>]';
string PageListStr = '';
string PageIndexColor = '#0000C0';
int SingleNumber = this.TotalPage - (TotalPage/ItemSize) * ItemSize; //得到分页后的尾数(比如:总共58页,按10页规格显示,则尾数为8)
int IntPageForMax = (this.CurrentPageIndex - 1) / ItemSize;
int MinInt = (1 + ItemSize * IntPageForMax);
int MaxInt = ((IntPageForMax + 1) * ItemSize)>TotalPage?TotalPage:((IntPageForMax + 1) * ItemSize);
if(this.TotalRecord == 0 || this.TotalPage == 0)
{
PageListStr = '<font color='+PageIndexColor+'>0</font>';
PageListStr = PageListStr + ' [共<font color=#CC0000>0</font>页/当前第<font color=#CC0000>0</font>页 共<font color=#CC0000>0</font>条记录,当前记录数<font color=#CC0000>0</font>到<font color=#CC0000>0</font>]';
output.Write(PageListStr);
}
else
{
if(this.TotalPage <= this.ItemSize)
{
for(int i = 1;i <= TotalPage;i++)
{
PageIndexColor = CurrentPageIndex==i?'#CC0000':'#0000C0';
if(CurrentPageIndex == i)
PageListStr = PageListStr + ' <a title='当前为第『'+i+'』页' href='#' id=\'' + this.UniqueID + '\'><font color='+PageIndexColor+'>'+i.ToString()+'</font></a>';
else
PageListStr = PageListStr + ' <a title='点击转到第『'+i+'』页' id=\'' + this.UniqueID + '\' href=\'javascript:' + Page.GetPostBackEventReference(this,i.ToString()) +'\'><font color='+PageIndexColor+'>'+i.ToString()+'</font></a>';
}
PageListStr = PageListStr ==''?'<font color='+PageIndexColor+'>0</font>':PageListStr;
PageListStr = PageListStr + ' '+PageInfo;
output.Write(PageListStr);
}
else
{
for(int i = MinInt;i <= MaxInt;i++)
{
PageIndexColor = CurrentPageIndex==i?'#CC0000':'#0000C0';
if(CurrentPageIndex == i)
PageListStr = PageListStr + ' <a title='当前为第『'+i+'』页' href='#' id=\'' + this.UniqueID + '\'><font color='+PageIndexColor+'>'+i.ToString()+'</font></a>';
else
PageListStr = PageListStr + ' <a title='点击转到第『'+i+'』页' id=\'' + this.UniqueID + '\' href=\'javascript:' + Page.GetPostBackEventReference(this,i.ToString()) +'\'><font color='+PageIndexColor+'>'+i.ToString()+'</font></a>';
}
//当当前页数小于ItemSize且总的页数大于ItemSize时
if(CurrentPageIndex <= ItemSize && TotalPage > ItemSize)
{
PageListStr = PageListStr + ' <a id=\'' + this.UniqueID + '\' title='点击转到第『'+System.Convert.ToString(ItemSize + 1)+'』页' href=\'javascript:' + Page.GetPostBackEventReference(this,System.Convert.ToString(ItemSize + 1)) +'\'>>></a>';
}
//当当前页数大于ItemSize,且总的页数减去当前页数大于等于尾数值页数时
if(this.CurrentPageIndex > ItemSize && (TotalPage - this.CurrentPageIndex) >= SingleNumber)
{
int MultiMinPageIndex = (IntPageForMax * ItemSize);
int MultiMaxPageIndex = ((IntPageForMax+1) * ItemSize) + 1;
PageListStr = '<a id=\'' + this.UniqueID + '\' title='点击转到第『'+MultiMinPageIndex+'』页' href=\'javascript:' + Page.GetPostBackEventReference(this,MultiMinPageIndex.ToString()) +'\'><<</a>' + PageListStr.Trim() + '<a id=\'' + this.UniqueID + '\' title='点击转到第『'+MultiMaxPageIndex+'』页' href=\'javascript:' + Page.GetPostBackEventReference(this,MultiMaxPageIndex.ToString()) +'\'>>></a>';
}
//当当前页数大于ItemSize,且总的页数减去当前页数大于等于尾数值页数时
if(CurrentPageIndex > 10 && (TotalPage - CurrentPageIndex) < SingleNumber)
{
int MultiMinPageIndex = (IntPageForMax * ItemSize);
PageListStr = '<a id=\'' + this.UniqueID + '\' title='点击转到第『'+MultiMinPageIndex+'』页' href=\'javascript:' + Page.GetPostBackEventReference(this,MultiMinPageIndex.ToString()) +'\'><<</a>' + PageListStr.Trim();
}
PageListStr = PageListStr ==''?'<font color='+PageIndexColor+'>0</font>':PageListStr;
PageListStr = PageListStr + ' '+PageInfo;
output.Write(PageListStr);
}
}
base.RenderContents(output);
}
}
}
控件中有几个相关的属性,在使用的时候,只需要指定:TotalRecord(总记录数)、PageSize(每页的数据记录数)、CurrentPageIndex(当前页面值)、ItemSize(分页条显示页面值的规格)
控件中有个ChangePageClick事件,可以利用“控件ID.CurrentPageIndex”属性来获取当前页面值。