控件代码:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.ComponentModel;
using System.Collections;
namespace SmartPager
... {
/**/
/// <summary>
///名称:SmartPager
///版本:2.0
///作者:小青青
///CopyRight:2006 请勿用作商业用途
/// </summary>
[DefaultEvent("PageIndexChanged"), ToolboxData("<{0}:SmartPager runat=server></{0}:SmartPager>")]
public class SmartPager : System.Web.UI.WebControls.WebControl, INamingContainer
...{
TextBox txtNewPageNumber;
LinkButton lnkPrev;
LinkButton lnkNext;
LinkButton lnkFirst;
LinkButton lnkLast;
LinkButton lnkGo;
Label lblCurrentPage;
public delegate void PageChangedEventHandler(Object source, PageChangedEventArgs e);
public event PageChangedEventHandler PageIndexChanged;
private int _PageSize;
private int _CurrentPageIndex;
private int _VirtualItemCount;
public SmartPager()
: base(HtmlTextWriterTag.Div)
...{ }
protected override void OnInit(EventArgs e)
...{
txtNewPageNumber = new TextBox();
lnkPrev = new LinkButton();
lnkNext = new LinkButton();
lnkFirst = new LinkButton();
lnkLast = new LinkButton();
lnkGo = new LinkButton();
lblCurrentPage = new Label();
EnsureChildControls();
}
protected override void CreateChildControls()
...{
this.Controls.Add(lnkFirst);
this.Controls.Add(lnkPrev);
this.Controls.Add(lblCurrentPage);
this.Controls.Add(txtNewPageNumber);
this.Controls.Add(lnkGo);
this.Controls.Add(lnkNext);
this.Controls.Add(lnkLast);
txtNewPageNumber.Width = 20;
lnkFirst.Attributes.Add("title", "首页");
lnkPrev.Attributes.Add("title", "上一页");
lnkNext.Attributes.Add("title", "下一页");
lnkLast.Attributes.Add("title", "末页");
lnkGo.Attributes.Add("title", "转到");
lnkFirst.Font.Name = "Webdings";
lnkPrev.Font.Name = "Webdings";
lnkNext.Font.Name = "Webdings";
lnkLast.Font.Name = "Webdings";
lnkGo.Font.Name = "Webdings";
lnkPrev.Text = "7";
lnkFirst.Text = "9";
lnkNext.Text = "8";
lnkLast.Text = ":";
lnkGo.Text = "4";
lnkGo.Click += new EventHandler(lnkGo_Click);
lnkPrev.Click += new EventHandler(lnkPrev_Click);
lnkNext.Click += new EventHandler(lnkNext_Click);
lnkFirst.Click += new EventHandler(lnkFirst_Click);
lnkLast.Click += new EventHandler(lnkLast_Click);
base.CreateChildControls();
}
[Browsable(false)]
public int PageCount
...{
get
...{
try
...{
if (VirtualItemCount % PageSize > 0)
...{
return VirtualItemCount / PageSize + 1;
}
else
...{
return VirtualItemCount / PageSize;
}
}
catch
...{
return 0;
}
}
}
public void SetPage(int pageIndex)
...{
CurrentPageIndex = pageIndex;
if (pageIndex > PageCount || pageIndex < 0)
return;
else
...{
OnPageIndexChanged(null, new PageChangedEventArgs(null, pageIndex));
}
}
public void SetPage(int pageIndex, int pageSize, int virtualItemCount)
...{
_CurrentPageIndex = pageIndex;
_PageSize = pageSize;
_VirtualItemCount = virtualItemCount;
if (pageIndex > PageCount || pageIndex < 0)
return;
else
...{
OnPageIndexChanged(null, new PageChangedEventArgs(null, pageIndex));
}
}
[Browsable(false)]
public int PageSize
...{
get
...{
return _PageSize;
}
set
...{
_PageSize = value;
ViewState.SetItemDirty("PageSize", true);
}
}
[Browsable(false)]
public int CurrentPageIndex
...{
get
...{
return _CurrentPageIndex;
}
set
...{
_CurrentPageIndex = value;
ViewState.SetItemDirty("CurrentPageIndex", true);
}
}
[Browsable(false)]
public int VirtualItemCount
...{
get
...{
return _VirtualItemCount;
}
set
...{
_VirtualItemCount = value;
ViewState.SetItemDirty("VirtualItemCount", true);
}
}
private void lnkGo_Click(object sender, EventArgs e)
...{
int newPage;
try
...{
newPage = int.Parse(txtNewPageNumber.Text.Trim()) - 1;
}
catch
...{
return;
}
if (PageCount > newPage && PageCount != 0)
OnPageIndexChanged(this, new PageChangedEventArgs(sender, newPage));
}
public virtual void OnPageIndexChanged(object source, PageChangedEventArgs e)
...{
DateTime start = DateTime.Now;
if (e.NewPageIndex > PageCount || e.NewPageIndex < 0)
return;
else
...{
CurrentPageIndex = e.NewPageIndex;
if (PageIndexChanged != null)
...{
PageIndexChanged(source, e);
}
DateTime end = DateTime.Now;
lblCurrentPage.Text = String.Format("(当前在第<B> {0} </B>页 共<B> {1} </B>页 记录数<B> {2} </B>条 [搜索用时 {3}秒])", (CurrentPageIndex + 1), PageCount, VirtualItemCount, (end - start).TotalSeconds);
txtNewPageNumber.Text = (CurrentPageIndex + 1).ToString();
}
}
private void lnkPrev_Click(object sender, EventArgs e)
...{
int newPage;
newPage = CurrentPageIndex - 1;
if (newPage >= 0 && PageCount != 0)
OnPageIndexChanged(this, new PageChangedEventArgs(sender, newPage));
}
private void lnkFirst_Click(object sender, EventArgs e)
...{
int newPage;
newPage = 0;
if (newPage >= 0 && PageCount != 0)
OnPageIndexChanged(this, new PageChangedEventArgs(sender, newPage));
}
private void lnkLast_Click(object sender, EventArgs e)
...{
int newPage;
newPage = PageCount - 1;
if (PageCount > newPage && PageCount != 0)
OnPageIndexChanged(this, new PageChangedEventArgs(sender, newPage));
}
private void lnkNext_Click(object sender, EventArgs e)
...{
int newPage;
newPage = CurrentPageIndex + 1;
if (PageCount > newPage && PageCount != 0)
OnPageIndexChanged(this, new PageChangedEventArgs(sender, newPage));
}
protected override object SaveViewState()
...{
// Check whether the PageSize property exists in
// the ViewState property, and if it does, check
// whether it has changed since the most recent
// TrackViewState method call.
if (!((IDictionary)ViewState).Contains("PageSize") || ViewState.IsItemDirty("PageSize"))
...{
ViewState.Remove("PageSize");
// Add the _PageSize property to the StateBag.
ViewState.Add("PageSize", _PageSize);
}
if (!((IDictionary)ViewState).Contains("CurrentPageIndex") || ViewState.IsItemDirty("CurrentPageIndex"))
...{
ViewState.Remove("CurrentPageIndex");
// Add the _CurrentPageIndex property to the StateBag.
ViewState.Add("CurrentPageIndex", _CurrentPageIndex);
}
if (!((IDictionary)ViewState).Contains("VirtualItemCount") || ViewState.IsItemDirty("VirtualItemCount"))
...{
ViewState.Remove("VirtualItemCount");
// Add the _VirtualItemCount property to the StateBag.
ViewState.Add("VirtualItemCount", _VirtualItemCount);
}
return ((IStateManager)ViewState).SaveViewState();
}
protected override void LoadViewState(object savedState)
...{
if (savedState != null)
((IStateManager)ViewState).LoadViewState(savedState);
if (ViewState["CurrentPageIndex"] != null)
_CurrentPageIndex = int.Parse(ViewState["CurrentPageIndex"].ToString());
if (ViewState["PageSize"] != null)
_PageSize = int.Parse(ViewState["PageSize"].ToString());
if (ViewState["VirtualItemCount"] != null)
_VirtualItemCount = int.Parse(ViewState["VirtualItemCount"].ToString());
}
public class PageChangedEventArgs : EventArgs
...{
// Fields
private object commandSource;
private int newPageIndex;
public PageChangedEventArgs(object commandSource, int newPageIndex)
...{
this.commandSource = commandSource;
this.newPageIndex = newPageIndex;
}
// Properties
public object CommandSource
...{
get
...{
return this.commandSource;
}
}
public int NewPageIndex
...{
get
...{
return this.newPageIndex;
}
}
}
}
}
///名称:SmartPager
///版本:2.0
///作者:小青青
///CopyRight:2006 请勿用作商业用途
/// </summary>
[DefaultEvent("PageIndexChanged"), ToolboxData("<{0}:SmartPager runat=server></{0}:SmartPager>")]
public class SmartPager : System.Web.UI.WebControls.WebControl, INamingContainer
...{
TextBox txtNewPageNumber;
LinkButton lnkPrev;
LinkButton lnkNext;
LinkButton lnkFirst;
LinkButton lnkLast;
LinkButton lnkGo;
Label lblCurrentPage;
public delegate void PageChangedEventHandler(Object source, PageChangedEventArgs e);
public event PageChangedEventHandler PageIndexChanged;
private int _PageSize;
private int _CurrentPageIndex;
private int _VirtualItemCount;
public SmartPager()
: base(HtmlTextWriterTag.Div)
...{ }
protected override void OnInit(EventArgs e)
...{
txtNewPageNumber = new TextBox();
lnkPrev = new LinkButton();
lnkNext = new LinkButton();
lnkFirst = new LinkButton();
lnkLast = new LinkButton();
lnkGo = new LinkButton();
lblCurrentPage = new Label();
EnsureChildControls();
}
protected override void CreateChildControls()
...{
this.Controls.Add(lnkFirst);
this.Controls.Add(lnkPrev);
this.Controls.Add(lblCurrentPage);
this.Controls.Add(txtNewPageNumber);
this.Controls.Add(lnkGo);
this.Controls.Add(lnkNext);
this.Controls.Add(lnkLast);
txtNewPageNumber.Width = 20;
lnkFirst.Attributes.Add("title", "首页");
lnkPrev.Attributes.Add("title", "上一页");
lnkNext.Attributes.Add("title", "下一页");
lnkLast.Attributes.Add("title", "末页");
lnkGo.Attributes.Add("title", "转到");
lnkFirst.Font.Name = "Webdings";
lnkPrev.Font.Name = "Webdings";
lnkNext.Font.Name = "Webdings";
lnkLast.Font.Name = "Webdings";
lnkGo.Font.Name = "Webdings";
lnkPrev.Text = "7";
lnkFirst.Text = "9";
lnkNext.Text = "8";
lnkLast.Text = ":";
lnkGo.Text = "4";
lnkGo.Click += new EventHandler(lnkGo_Click);
lnkPrev.Click += new EventHandler(lnkPrev_Click);
lnkNext.Click += new EventHandler(lnkNext_Click);
lnkFirst.Click += new EventHandler(lnkFirst_Click);
lnkLast.Click += new EventHandler(lnkLast_Click);
base.CreateChildControls();
}
[Browsable(false)]
public int PageCount
...{
get
...{
try
...{
if (VirtualItemCount % PageSize > 0)
...{
return VirtualItemCount / PageSize + 1;
}
else
...{
return VirtualItemCount / PageSize;
}
}
catch
...{
return 0;
}
}
}
public void SetPage(int pageIndex)
...{
CurrentPageIndex = pageIndex;
if (pageIndex > PageCount || pageIndex < 0)
return;
else
...{
OnPageIndexChanged(null, new PageChangedEventArgs(null, pageIndex));
}
}
public void SetPage(int pageIndex, int pageSize, int virtualItemCount)
...{
_CurrentPageIndex = pageIndex;
_PageSize = pageSize;
_VirtualItemCount = virtualItemCount;
if (pageIndex > PageCount || pageIndex < 0)
return;
else
...{
OnPageIndexChanged(null, new PageChangedEventArgs(null, pageIndex));
}
}
[Browsable(false)]
public int PageSize
...{
get
...{
return _PageSize;
}
set
...{
_PageSize = value;
ViewState.SetItemDirty("PageSize", true);
}
}
[Browsable(false)]
public int CurrentPageIndex
...{
get
...{
return _CurrentPageIndex;
}
set
...{
_CurrentPageIndex = value;
ViewState.SetItemDirty("CurrentPageIndex", true);
}
}
[Browsable(false)]
public int VirtualItemCount
...{
get
...{
return _VirtualItemCount;
}
set
...{
_VirtualItemCount = value;
ViewState.SetItemDirty("VirtualItemCount", true);
}
}
private void lnkGo_Click(object sender, EventArgs e)
...{
int newPage;
try
...{
newPage = int.Parse(txtNewPageNumber.Text.Trim()) - 1;
}
catch
...{
return;
}
if (PageCount > newPage && PageCount != 0)
OnPageIndexChanged(this, new PageChangedEventArgs(sender, newPage));
}
public virtual void OnPageIndexChanged(object source, PageChangedEventArgs e)
...{
DateTime start = DateTime.Now;
if (e.NewPageIndex > PageCount || e.NewPageIndex < 0)
return;
else
...{
CurrentPageIndex = e.NewPageIndex;
if (PageIndexChanged != null)
...{
PageIndexChanged(source, e);
}
DateTime end = DateTime.Now;
lblCurrentPage.Text = String.Format("(当前在第<B> {0} </B>页 共<B> {1} </B>页 记录数<B> {2} </B>条 [搜索用时 {3}秒])", (CurrentPageIndex + 1), PageCount, VirtualItemCount, (end - start).TotalSeconds);
txtNewPageNumber.Text = (CurrentPageIndex + 1).ToString();
}
}
private void lnkPrev_Click(object sender, EventArgs e)
...{
int newPage;
newPage = CurrentPageIndex - 1;
if (newPage >= 0 && PageCount != 0)
OnPageIndexChanged(this, new PageChangedEventArgs(sender, newPage));
}
private void lnkFirst_Click(object sender, EventArgs e)
...{
int newPage;
newPage = 0;
if (newPage >= 0 && PageCount != 0)
OnPageIndexChanged(this, new PageChangedEventArgs(sender, newPage));
}
private void lnkLast_Click(object sender, EventArgs e)
...{
int newPage;
newPage = PageCount - 1;
if (PageCount > newPage && PageCount != 0)
OnPageIndexChanged(this, new PageChangedEventArgs(sender, newPage));
}
private void lnkNext_Click(object sender, EventArgs e)
...{
int newPage;
newPage = CurrentPageIndex + 1;
if (PageCount > newPage && PageCount != 0)
OnPageIndexChanged(this, new PageChangedEventArgs(sender, newPage));
}
protected override object SaveViewState()
...{
// Check whether the PageSize property exists in
// the ViewState property, and if it does, check
// whether it has changed since the most recent
// TrackViewState method call.
if (!((IDictionary)ViewState).Contains("PageSize") || ViewState.IsItemDirty("PageSize"))
...{
ViewState.Remove("PageSize");
// Add the _PageSize property to the StateBag.
ViewState.Add("PageSize", _PageSize);
}
if (!((IDictionary)ViewState).Contains("CurrentPageIndex") || ViewState.IsItemDirty("CurrentPageIndex"))
...{
ViewState.Remove("CurrentPageIndex");
// Add the _CurrentPageIndex property to the StateBag.
ViewState.Add("CurrentPageIndex", _CurrentPageIndex);
}
if (!((IDictionary)ViewState).Contains("VirtualItemCount") || ViewState.IsItemDirty("VirtualItemCount"))
...{
ViewState.Remove("VirtualItemCount");
// Add the _VirtualItemCount property to the StateBag.
ViewState.Add("VirtualItemCount", _VirtualItemCount);
}
return ((IStateManager)ViewState).SaveViewState();
}
protected override void LoadViewState(object savedState)
...{
if (savedState != null)
((IStateManager)ViewState).LoadViewState(savedState);
if (ViewState["CurrentPageIndex"] != null)
_CurrentPageIndex = int.Parse(ViewState["CurrentPageIndex"].ToString());
if (ViewState["PageSize"] != null)
_PageSize = int.Parse(ViewState["PageSize"].ToString());
if (ViewState["VirtualItemCount"] != null)
_VirtualItemCount = int.Parse(ViewState["VirtualItemCount"].ToString());
}
public class PageChangedEventArgs : EventArgs
...{
// Fields
private object commandSource;
private int newPageIndex;
public PageChangedEventArgs(object commandSource, int newPageIndex)
...{
this.commandSource = commandSource;
this.newPageIndex = newPageIndex;
}
// Properties
public object CommandSource
...{
get
...{
return this.commandSource;
}
}
public int NewPageIndex
...{
get
...{
return this.newPageIndex;
}
}
}
}
}
- 通过后台,使用SmartPager转向页面
int
goToPageIndex
=
0
;
//
转向的页码,索引从0开始,0代表第一页
int pageSize = int .Parse(ConfigurationManager.AppSettings[ " PageSize " ]);
int virtualItemCount = GetData(); // 从数据库中得到要查询的记录总数
pager.SetPage(goToPageIndex , pageSize, virtualItemCount );
// 如果试图转向到一个超过最大页面索引的页面,它将不会抛出异常。结果为无效操作!
int pageSize = int .Parse(ConfigurationManager.AppSettings[ " PageSize " ]);
int virtualItemCount = GetData(); // 从数据库中得到要查询的记录总数
pager.SetPage(goToPageIndex , pageSize, virtualItemCount );
// 如果试图转向到一个超过最大页面索引的页面,它将不会抛出异常。结果为无效操作!
- 订阅事件PageIndexChanged
protected
void
pager_PageIndexChanged(
object
source, SmartPager.PageChangedEventArgs e)
... {
//绑定数据源,数据容器可以为GridView,DataGrid等
//为了提高数据库效率,后台应使用带有StartRecord和MaxRecords参数的方法
string searchKey=null;//查询关键字
gvItem.DataSource = GetDataList(searchKey,e.NewPageIndex * pageSize, pageSize);//根据业务需要自定义的获取数据的方法
gvItem.DataBind();
}
... {
//绑定数据源,数据容器可以为GridView,DataGrid等
//为了提高数据库效率,后台应使用带有StartRecord和MaxRecords参数的方法
string searchKey=null;//查询关键字
gvItem.DataSource = GetDataList(searchKey,e.NewPageIndex * pageSize, pageSize);//根据业务需要自定义的获取数据的方法
gvItem.DataBind();
}
http://blog.csdn.net/justinalucard/archive/2006/12/22/1453194.aspx
转载请注明本贴地址及作者!!