自定义GridView分页模板
GridView较之DataGrid提供了更加强大、更加完善的功能,而且具备了丰富的可扩展功能,可以使用GridView提供的pagertemplate自定义分页模板:
事实上,GridView默认的几中分页样式,都是将相关按钮的CommandName设为Page,而CommandArgument设为相关参数,可接受的参数包括,first,last,prev,next,<PageIndex>(具体数字),然后按事件回溯,触发顶层的RowCommand,因此我们页可以使用这些默认的可识别的参数自定义自己的分页模板,asp.net会自动设置当前的NewPageIndex,而不需要任何的冗余代码。
.aspx页面:
autogeneratecolumns ="False" datasourceid ="SqlDataSource1"
onpageindexchanging ="GridView1_PageIndexChanging" >
< columns >
< asp:boundfield datafield ="CompanyName" headertext ="CompanyName" sortexpression ="CompanyName" />
< asp:boundfield datafield ="ContactTitle" headertext ="ContactTitle" sortexpression ="ContactTitle" />
< asp:boundfield datafield ="Phone" headertext ="Phone" sortexpression ="Phone" />
< asp:boundfield datafield ="Fax" headertext ="Fax" sortexpression ="Fax" />
< asp:boundfield datafield ="ContactName" headertext ="ContactName" sortexpression ="ContactName" />
</ columns >
< pagertemplate >
< table width ="100%" >
< tr >
< td style ="text-align:right" >
第 < asp:Label id ="lblPageIndex" runat ="server" text ='<%# ((GridView)Container.Parent.Parent).PageIndex + 1 % > ' />页
共/ < asp:Label id ="lblPageCount" runat ="server" text ='<%# ((GridView)Container.Parent.Parent).PageCount % > ' />页
< asp:linkbutton id ="btnFirst" runat ="server" causesvalidation ="False" commandargument ="First" commandname ="Page" text ="首页" />
< asp:linkbutton id ="btnPrev" runat ="server" causesvalidation ="False" commandargument ="Prev" commandname ="Page" text ="上一页" />
< asp:linkbutton id ="btnNext" runat ="server" causesvalidation ="False" commandargument ="Next" commandname ="Page" text ="下一页" />
< asp:linkbutton id ="btnLast" runat ="server" causesvalidation ="False" commandargument ="Last" commandname ="Page" text ="尾页" />
< asp:textbox id ="txtNewPageIndex" runat ="server" width ="20px" text ='<%# ((GridView)Container.Parent.Parent).PageIndex + 1 % > ' />
< asp:linkbutton id ="btnGo" runat ="server" causesvalidation ="False" commandargument ="-1" commandname ="Page" text ="GO" OnClick="btnGo_Click" /> <!-- here set the CommandArgument of the Go Button to '-1' as the flag -->
</ td >
</ tr >
</ table >
</ pagertemplate >
</ asp:gridview >
< asp:sqldatasource id ="SqlDataSource1" runat ="server" connectionstring ="Data Source=.;Initial Catalog=Northwind;Integrated Security=True"
providername ="System.Data.SqlClient" selectcommand ="SELECT [CompanyName], [ContactTitle], [Phone], [Fax], [ContactName] FROM [Customers]" >
</ asp:sqldatasource >
PageIndexChanging处理程序:
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridView theGrid = sender as GridView; // refer to the GridView
int newPageIndex = 0;
if (-2 == e.NewPageIndex) { // when click the "GO" Button
TextBox txtNewPageIndex = null;
//GridViewRow pagerRow = theGrid.Controls[0].Controls[theGrid.Controls[0].Controls.Count - 1] as GridViewRow; // refer to PagerTemplate
GridViewRow pagerRow = theGrid.BottomPagerRow; //GridView较DataGrid提供了更多的API,获取分页块可以使用BottomPagerRow 或者TopPagerRow,当然还增加了HeaderRow和FooterRow
//updated at 2006年6月21日3:15:33
if (null != pagerRow) {
txtNewPageIndex = pagerRow.FindControl("txtNewPageIndex") as TextBox; // refer to the TextBox with the NewPageIndex value
}
if (null != txtNewPageIndex) {
newPageIndex = int.Parse(txtNewPageIndex.Text) - 1; // get the NewPageIndex
}
}
else { // when click the first, last, previous and next Button
newPageIndex = e.NewPageIndex;
}
// check to prevent form the NewPageIndex out of the range
newPageIndex = newPageIndex < 0 ? 0 : newPageIndex;
newPageIndex = newPageIndex >= theGrid.PageCount ? theGrid.PageCount - 1 : newPageIndex;
// specify the NewPageIndex
theGrid.PageIndex = newPageIndex;
// rebind the control
// in this case of retrieving the data using the xxxDataSoucr control,
// just do nothing, because the asp.net engine binds the data automatically
}
protected void btnGo_Click(object sender, EventArgs e)
{
GridViewRow grdRow = this.gvlist.BottomPagerRow;
try
{
TextBox txt_NewPageIndex = grdRow.FindControl("txt_NewPageIndex") as TextBox;
if (txt_NewPageIndex.Text.Trim().Length > 0)
{
this.gvlist.PageIndex = Convert.ToInt32(txt_NewPageIndex.Text.Trim())-1;
BindData(StrProCode);
}
}
catch
{
//Response.Write("<script>alert('页数请填写数字!')</script>");
}
}
注意到,上面的示例中,由于增加了一个跳转按钮GO,但是asp。net不支持相关的CommandArgument值,虽然可以将Go Button的Commandname设为Page,还需要手动的在PageIndexChanging增加部分处理逻辑。
当只有一页时分页不显示问题解决:
GridView 的 Controls 集合中包括了 Header、DataRow、Footer、Pager等等所有可以显示的行,而且不管有没有显示,这些行都包含在 Controls 集合中,只不过仅有一页数据时,Pager 行的 Visible 属性被设置为了 false。既然如此,只要在数据绑定结束后把 Pager 行的 Visible 重新设置为 true 不就解决问题了吗?下面是解决方法:
public static void gridView_DataBound(object sender, EventArgs e)
{
if (gridView.Rows.Count != 0)
{
Control table = gridView.Controls[0];
int count = table.Controls.Count;
table.Controls[count - 1].Visible = true;
}
}