网上关于 DataGrid 自定义的分页控件很多,参照一些例子,做了一些优化,主要优点是使用方便,且控件中用ViewState保存了DataGrid需要绑定的数据,免去在绑定DataGrid时额外的处理,开发环境VS.NET2003。
在调用页面引入分页控件命名控件后,定义protected PeterSun.Control.WebControl.Ascx.GridPager GridPager1,页面中调用的主要代码如下。
GridPager1.RelatedDataGridID
=
this
.DataGrid1.ID;
//
设置关联的DataGrid的ID属性,必须
GridPager1.RelatedDataSource = dt; // 设置数据源,必须
GridPager1.IsShowSummary = true ; // 设置是否显示共有多少页,每页多少行信息
GridPager1.IsShowJumping = false ; // 设置是否显示跳转到某页
GridPager1.RelatedDataSource = dt; // 设置数据源,必须
GridPager1.IsShowSummary = true ; // 设置是否显示共有多少页,每页多少行信息
GridPager1.IsShowJumping = false ; // 设置是否显示跳转到某页
分页控件的详细代码,用ViewState保存了控件的属性信息,这里可以进一步扩展,如设置分页信息样式,显示哪些信息,等等。
public
class
GridPager : System.Web.UI.UserControl
... {
protected System.Web.UI.WebControls.LinkButton LBtnFirst;
protected System.Web.UI.WebControls.LinkButton LBtnPrev;
protected System.Web.UI.WebControls.LinkButton LBtnNext;
protected System.Web.UI.WebControls.LinkButton LBtnLast;
protected System.Web.UI.WebControls.DropDownList ddlPagerNavigate;
protected System.Web.UI.WebControls.Label lblTip;
protected System.Web.UI.WebControls.Label lblPagerInfo; //分页描述信息,默认显示
private System.Web.UI.WebControls.DataGrid relatedDataGrid; //要分页的DataGrid
private DataTable relatedDataSource; //绑定DataGrid的数据源
private string relatedDataGridID; //DataGrid控件ID
private bool isShowSummary = true; //是否显示分页描述,默认显示
private bool isShowJumping = true; //是否显示跳转,默认显示
private void Page_Load(object sender, System.EventArgs e)
...{
// Put user code to initialize the page here
if(Page.IsPostBack)
...{
this.PrepareParameters();
}
}
Web Form Designer generated code#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
...{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
/**//// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
...{
this.LBtnFirst.Click += new System.EventHandler(this.LBtnPager_Click);
this.LBtnPrev.Click += new System.EventHandler(this.LBtnPager_Click);
this.LBtnNext.Click += new System.EventHandler(this.LBtnPager_Click);
this.LBtnLast.Click += new System.EventHandler(this.LBtnPager_Click);
this.ddlPagerNavigate.SelectedIndexChanged += new System.EventHandler(this.ddlPagerNavigate_SelectedIndexChanged);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
分页控件公开属性#region 分页控件公开属性
/**//// <summary>
/// 与分页控件关联的DataGrid控件ID
/// </summary>
public string RelatedDataGridID
...{
get
...{
return relatedDataGridID;
}
set
...{
relatedDataGridID = value ;
ViewState["DataGridID"] = value;
//根据relatedDataGridID从父页面中获取需要关联的DataGrid控件
this.relatedDataGrid = (DataGrid)this.Parent.FindControl(relatedDataGridID);
}
}
/**//// <summary>
/// 与DataGrid绑定的数据源
/// </summary>
public DataTable RelatedDataSource
...{
get
...{
return relatedDataSource ;
}
set
...{
relatedDataSource = value ;
relatedDataGrid.DataSource=relatedDataSource;
ViewState["DataSource"] = relatedDataSource;
}
}
/**//// <summary>
/// 是否显示分页描述信息
/// </summary>
public bool IsShowSummary
...{
get
...{
return isShowSummary ;
}
set
...{
isShowSummary = value ;
ViewState["IsShowSummary"] = isShowSummary;
}
}
/**//// <summary>
/// 是否显示跳转页面
/// </summary>
public bool IsShowJumping
...{
get
...{
return isShowJumping ;
}
set
...{
isShowJumping = value ;
ViewState["IsShowJumping"] = isShowJumping;
}
}
#endregion
分页控件方法#region 分页控件方法
/**//// <summary>
/// 准备参数,DataGrid和DataTable
/// </summary>
private void PrepareParameters()
...{
if(ViewState["DataGridID"] != null)
...{
this.relatedDataGridID = Convert.ToString(ViewState["DataGridID"]);
this.relatedDataGrid = (DataGrid)this.Parent.FindControl(this.relatedDataGridID);
}
if(ViewState["DataSource"] != null)
...{
this.relatedDataSource = (DataTable)ViewState["DataSource"];
this.relatedDataGrid.DataSource = this.relatedDataSource;
}
if(ViewState["IsShowSummary"] != null)
...{
this.isShowSummary = (bool)ViewState["IsShowSummary"];
}
if(ViewState["IsShowJumping"] != null)
...{
this.isShowJumping = (bool)ViewState["IsShowJumping"];
}
}
/**//// <summary>
/// 生成跳转页列表
/// </summary>
private void PopulatePageNavigate()
...{
this.ddlPagerNavigate.Items.Clear() ;
for(int i = 0 ;i <relatedDataGrid.PageCount ; i ++)
...{
this.ddlPagerNavigate.Items.Add("第" + Convert.ToString(i+1) + "页");
}
this.ddlPagerNavigate.SelectedIndex =this.relatedDataGrid.CurrentPageIndex;
}
/**//// <summary>
/// 执行DataGrid绑定,并更改控件的状态信息
/// </summary>
public override void DataBind()
...{
try
...{
this.relatedDataGrid.DataBind() ;
}
catch
...{
try
...{
this.relatedDataGrid.CurrentPageIndex-= 1;
}
catch
...{
this.relatedDataGrid.CurrentPageIndex = 0;
}
this.relatedDataGrid.DataBind() ;
}
this.lblPagerInfo.Text = "第" + Convert.ToString(relatedDataGrid.CurrentPageIndex+1) + "/" + Convert.ToString(relatedDataGrid.PageCount) + "页," + relatedDataGrid.PageSize + "条/页,共" + Convert.ToString(relatedDataSource.Rows.Count ) + "条" ;
if(relatedDataGrid.CurrentPageIndex == 0)
...{
this.LBtnFirst.Enabled = false ;
this.LBtnPrev.Enabled = false ;
}
else
...{
this.LBtnFirst.Enabled = true ;
this.LBtnPrev.Enabled = true ;
}
if(relatedDataGrid.CurrentPageIndex == (relatedDataGrid.PageCount -1))
...{
this.LBtnNext.Enabled = false ;
this.LBtnLast.Enabled = false ;
}
else
...{
this.LBtnNext.Enabled = true ;
this.LBtnLast.Enabled = true ;
}
//控制是否隐藏部分控件
this.lblPagerInfo.Visible = this.isShowSummary;
this.lblTip.Visible = this.isShowJumping;
this.ddlPagerNavigate.Visible = this.isShowJumping;
//绑定页码下拉列表
this.PopulatePageNavigate();
}
/**//// <summary>
/// 单击翻页按钮控制翻页
/// </summary>
private void LBtnPager_Click(object sender, System.EventArgs e)
...{
LinkButton btn = (LinkButton)sender;
switch(btn.CommandName)
...{
case "First":
this.relatedDataGrid.CurrentPageIndex = 0;
break;
case "Prev":
if(relatedDataGrid.CurrentPageIndex > 0)
...{
relatedDataGrid.CurrentPageIndex = relatedDataGrid.CurrentPageIndex - 1 ;
}
break;
case "Next":
if(relatedDataGrid.CurrentPageIndex < relatedDataGrid.PageCount - 1)
...{
relatedDataGrid.CurrentPageIndex = relatedDataGrid.CurrentPageIndex + 1 ;
}
break;
case "Last":
relatedDataGrid.CurrentPageIndex = relatedDataGrid.PageCount -1 ;
break;
}
this.DataBind();
}
/**//// <summary>
/// 跳转页下拉列表控制分页
/// </summary>
private void ddlPagerNavigate_SelectedIndexChanged(object sender, System.EventArgs e)
...{
if(this.ddlPagerNavigate.SelectedIndex > 0)
...{
relatedDataGrid.CurrentPageIndex = this.ddlPagerNavigate.SelectedIndex;
this.DataBind();
}
}
#endregion
}
... {
protected System.Web.UI.WebControls.LinkButton LBtnFirst;
protected System.Web.UI.WebControls.LinkButton LBtnPrev;
protected System.Web.UI.WebControls.LinkButton LBtnNext;
protected System.Web.UI.WebControls.LinkButton LBtnLast;
protected System.Web.UI.WebControls.DropDownList ddlPagerNavigate;
protected System.Web.UI.WebControls.Label lblTip;
protected System.Web.UI.WebControls.Label lblPagerInfo; //分页描述信息,默认显示
private System.Web.UI.WebControls.DataGrid relatedDataGrid; //要分页的DataGrid
private DataTable relatedDataSource; //绑定DataGrid的数据源
private string relatedDataGridID; //DataGrid控件ID
private bool isShowSummary = true; //是否显示分页描述,默认显示
private bool isShowJumping = true; //是否显示跳转,默认显示
private void Page_Load(object sender, System.EventArgs e)
...{
// Put user code to initialize the page here
if(Page.IsPostBack)
...{
this.PrepareParameters();
}
}
Web Form Designer generated code#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
...{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
/**//// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
...{
this.LBtnFirst.Click += new System.EventHandler(this.LBtnPager_Click);
this.LBtnPrev.Click += new System.EventHandler(this.LBtnPager_Click);
this.LBtnNext.Click += new System.EventHandler(this.LBtnPager_Click);
this.LBtnLast.Click += new System.EventHandler(this.LBtnPager_Click);
this.ddlPagerNavigate.SelectedIndexChanged += new System.EventHandler(this.ddlPagerNavigate_SelectedIndexChanged);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
分页控件公开属性#region 分页控件公开属性
/**//// <summary>
/// 与分页控件关联的DataGrid控件ID
/// </summary>
public string RelatedDataGridID
...{
get
...{
return relatedDataGridID;
}
set
...{
relatedDataGridID = value ;
ViewState["DataGridID"] = value;
//根据relatedDataGridID从父页面中获取需要关联的DataGrid控件
this.relatedDataGrid = (DataGrid)this.Parent.FindControl(relatedDataGridID);
}
}
/**//// <summary>
/// 与DataGrid绑定的数据源
/// </summary>
public DataTable RelatedDataSource
...{
get
...{
return relatedDataSource ;
}
set
...{
relatedDataSource = value ;
relatedDataGrid.DataSource=relatedDataSource;
ViewState["DataSource"] = relatedDataSource;
}
}
/**//// <summary>
/// 是否显示分页描述信息
/// </summary>
public bool IsShowSummary
...{
get
...{
return isShowSummary ;
}
set
...{
isShowSummary = value ;
ViewState["IsShowSummary"] = isShowSummary;
}
}
/**//// <summary>
/// 是否显示跳转页面
/// </summary>
public bool IsShowJumping
...{
get
...{
return isShowJumping ;
}
set
...{
isShowJumping = value ;
ViewState["IsShowJumping"] = isShowJumping;
}
}
#endregion
分页控件方法#region 分页控件方法
/**//// <summary>
/// 准备参数,DataGrid和DataTable
/// </summary>
private void PrepareParameters()
...{
if(ViewState["DataGridID"] != null)
...{
this.relatedDataGridID = Convert.ToString(ViewState["DataGridID"]);
this.relatedDataGrid = (DataGrid)this.Parent.FindControl(this.relatedDataGridID);
}
if(ViewState["DataSource"] != null)
...{
this.relatedDataSource = (DataTable)ViewState["DataSource"];
this.relatedDataGrid.DataSource = this.relatedDataSource;
}
if(ViewState["IsShowSummary"] != null)
...{
this.isShowSummary = (bool)ViewState["IsShowSummary"];
}
if(ViewState["IsShowJumping"] != null)
...{
this.isShowJumping = (bool)ViewState["IsShowJumping"];
}
}
/**//// <summary>
/// 生成跳转页列表
/// </summary>
private void PopulatePageNavigate()
...{
this.ddlPagerNavigate.Items.Clear() ;
for(int i = 0 ;i <relatedDataGrid.PageCount ; i ++)
...{
this.ddlPagerNavigate.Items.Add("第" + Convert.ToString(i+1) + "页");
}
this.ddlPagerNavigate.SelectedIndex =this.relatedDataGrid.CurrentPageIndex;
}
/**//// <summary>
/// 执行DataGrid绑定,并更改控件的状态信息
/// </summary>
public override void DataBind()
...{
try
...{
this.relatedDataGrid.DataBind() ;
}
catch
...{
try
...{
this.relatedDataGrid.CurrentPageIndex-= 1;
}
catch
...{
this.relatedDataGrid.CurrentPageIndex = 0;
}
this.relatedDataGrid.DataBind() ;
}
this.lblPagerInfo.Text = "第" + Convert.ToString(relatedDataGrid.CurrentPageIndex+1) + "/" + Convert.ToString(relatedDataGrid.PageCount) + "页," + relatedDataGrid.PageSize + "条/页,共" + Convert.ToString(relatedDataSource.Rows.Count ) + "条" ;
if(relatedDataGrid.CurrentPageIndex == 0)
...{
this.LBtnFirst.Enabled = false ;
this.LBtnPrev.Enabled = false ;
}
else
...{
this.LBtnFirst.Enabled = true ;
this.LBtnPrev.Enabled = true ;
}
if(relatedDataGrid.CurrentPageIndex == (relatedDataGrid.PageCount -1))
...{
this.LBtnNext.Enabled = false ;
this.LBtnLast.Enabled = false ;
}
else
...{
this.LBtnNext.Enabled = true ;
this.LBtnLast.Enabled = true ;
}
//控制是否隐藏部分控件
this.lblPagerInfo.Visible = this.isShowSummary;
this.lblTip.Visible = this.isShowJumping;
this.ddlPagerNavigate.Visible = this.isShowJumping;
//绑定页码下拉列表
this.PopulatePageNavigate();
}
/**//// <summary>
/// 单击翻页按钮控制翻页
/// </summary>
private void LBtnPager_Click(object sender, System.EventArgs e)
...{
LinkButton btn = (LinkButton)sender;
switch(btn.CommandName)
...{
case "First":
this.relatedDataGrid.CurrentPageIndex = 0;
break;
case "Prev":
if(relatedDataGrid.CurrentPageIndex > 0)
...{
relatedDataGrid.CurrentPageIndex = relatedDataGrid.CurrentPageIndex - 1 ;
}
break;
case "Next":
if(relatedDataGrid.CurrentPageIndex < relatedDataGrid.PageCount - 1)
...{
relatedDataGrid.CurrentPageIndex = relatedDataGrid.CurrentPageIndex + 1 ;
}
break;
case "Last":
relatedDataGrid.CurrentPageIndex = relatedDataGrid.PageCount -1 ;
break;
}
this.DataBind();
}
/**//// <summary>
/// 跳转页下拉列表控制分页
/// </summary>
private void ddlPagerNavigate_SelectedIndexChanged(object sender, System.EventArgs e)
...{
if(this.ddlPagerNavigate.SelectedIndex > 0)
...{
relatedDataGrid.CurrentPageIndex = this.ddlPagerNavigate.SelectedIndex;
this.DataBind();
}
}
#endregion
}
附上分页效果图,下一步的目标是把用户控件改写成复合控件,那样就方便图形化设置属性了