【接上期】
上期文章介绍了GridView的自定义分页模板,并且实现了输入页码的跳转。在实际使用中应该够用了,不过有些朋友工作认真,精益求精,这时就会发现还有些小问题,比如:我们并不知道具体有所少数据,总共分了多少页;用户根据实际情况自己确定每页行数;最后一页的数据不足一页时,Gridview的高度会变小,与页面别的内容产生了“不和谐”。
今天我们就将这些问题再优化一下。
			一、记录统计
		
			1.显示记录总数
		
			i.在代码页面中,添加一个变量,用来保存记录总数
		
public int Total = 0; //记录总记录数
		
代码解读
			ii.在Gridview控件PagerTemplate模板下添加如下控件:
		
控件编辑菜单→编辑模板→PagerTemplate→添加两个label控件
第一个的text改为:记录总数:
第二个的text改为:<%# Total %>
生成代码如下:

iii.编写代码:
		
			
			- 
				
				
					
					
						
					
				
				
					
					
						using System.Data;
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						……
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						//获取记录总数
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						private void GetRecordTotal()
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						{
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						DataTable dt = new DataTable();
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						DataView dv = (DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty);
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						if (dv != null)
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						{
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						dt = dv.ToTable();
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						Total = dt.Rows.Count; //记录总记录数
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						}
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						else
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						{
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						Total = 0; //记录总记录数
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						}
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						}
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						……
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						protected void Page_Load(object sender, EventArgs e)
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						{
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						GetRecordTotal();
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						}
					
				
			
 
		
		
		
代码解读
页面效果:

			2.自动更新记录总数
		
当我们对数据进行了“删除”、“增加”操作后,会导致记录总数发生变化,因此需要在操作完成后进行更新。
GetRecordTotal();//重新计算记录数
		
代码解读

经过测试,记录数显示正常。
			二、分页统计
		
			1.模版编辑
		
控件编辑菜单→编辑模板→PagerTemplate→添加一段文字及两个label控件

			2.数据绑定
		
给Label5、Label6的Text属性,分别绑定数据:<%# GridView1.PageIndex+1 %>;<%# GridView1.PageCount %>

运行看效果:

			 三、自定义每页行数
		
			1.模版编辑
		
再在PagerTemplate模板中添加文本框、按钮,内容如下:

文本框ID为txtPageSize,按钮ID为btnPageSize。修改样式后,代码如下:

注意:文本框Text的值绑定为<%# GridView1. PageSize %>
页面效果:

			·2.添加单击事件
		
进入PagerTemplate模板编辑状态,双击按钮进入按钮“单击”事件处理代码编写状态

具体代码如下:
		
			
			- 
				
				
					
					
						
					
				
				
					
					
						protected void btnPageSize_Click(object sender, EventArgs e)
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						{
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						// 获取触发事件的按钮
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						Button btn = sender as Button;
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						// 获取其所在的行
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						GridViewRow row = btn.NamingContainer as GridViewRow;
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						// 获取行中名为txtPageSize的控件
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						Control control = row.FindControl("txtPageSize");
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						// 转换控件并获取值(控件类型是TextBox)
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						TextBox textBox = control as TextBox;
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						// 获取其值
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						string value = textBox.Text;
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						//变量转换
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						int PageSize;
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						try
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						{
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						PageSize = int.Parse(value);
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						}
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						catch
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						{
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						PageSize = 10;
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						}
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						if (PageSize < 1)
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						{
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						PageSize = 1;
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						}
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						//设置新的PageSize
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						GridView1.PageSize = PageSize;
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						// 重新绑定数据,这将会应用新的PageSize
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						GridView1.DataBind();
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						}
					
				
			
 
		
		
		
代码解读
			四、不足一页的处理
		
页面容量(每页行数)可以调整了,我们会发现,如果页面容量与总记录数不能恰好整除,就会出现末尾也不足一页的情况,视觉上感到最后一页突然变小(高度改变)。这会导致与页面中其它内容的布局发生改变,影响用户体验度,因此需要再编写如下代码。
			1.补足最后一页的代码
		
		
			
			- 
				
				
					
					
						
					
				
				
					
					
						//尾页填充空行
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						private static void AddEmptyToFullPage(object sender)
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						{
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						GridView GridView = sender as GridView;
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						//如果没数据就返回
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						if (GridView.Rows.Count == 0)
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						{
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						return;
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						}
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						// 显示分页控件
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						GridView.BottomPagerRow.Visible = true;
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						//如果不足一页
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						if (GridView.Rows.Count < GridView.PageSize)
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						{
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						Control table = GridView.Controls[0];
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						if (table != null)
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						{
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						for (int i = 0; i < GridView.PageSize - GridView.Rows.Count; i++)
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						{
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						int rowIndex = GridView.Rows.Count + i + 1;
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						GridViewRow row = new GridViewRow(rowIndex, -1, DataControlRowType.Separator, DataControlRowState.Normal);
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						row.CssClass = (rowIndex % 2 == 0) ? "alternate" : "item";
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						for (int j = 0; j < GridView.Columns.Count; j++)
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						{
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						TableCell cell = new TableCell();
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						cell.Text = " ";
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						row.Controls.Add(cell);
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						}
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						table.Controls.AddAt(rowIndex, row);
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						}
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						}
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						}
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						}
					
				
			
 
		
		
		
代码解读
			2.调用位置
		
通常Gridview完成渲染会触发DataBound事件,这里使我们填充空行的好时机
选中控件→属性→事件→双击

编写代码:
		
			
			- 
				
				
					
					
						
					
				
				
					
					
						protected void GridView1_DataBound(object sender, EventArgs e)
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						{
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						AddEmptyToFullPage(this.GridView1);
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						}
					
				
			
 
		
		
代码解读
页面效果:

			五、首页不足一页的处理
		
Gridview展示的数据行数较少,小于页面容量时,理应就不能再出现分页控件了,因此需要再“细化”一下:
			1.根据记录数启用/禁用分页
		
		
			
			- 
				
				
					
					
						
					
				
				
					
					
						//如果只有一页
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						if (this.GridView1.PageCount > 1)
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						{
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						//启用分页控件
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						this.GridView1.AllowPaging = true;
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						}
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						else
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						{
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						//禁用分页控件 
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						this.GridView1.AllowPaging = false;
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						}
					
				
			
 
		
		
代码解读
			2.给表格顶部添加一个“信息栏”
		
修改页面源码,在GridView控件之前,添加如下代码:
		
			
			- 
				
				
					
					
						
					
				
				
					
					
						<table class="table table-bordered" width="100%" style="margin-bottom:0px">
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						<tbody>
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						<tr>
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						<td>记录总数:<asp:Label ID="labTotal" runat="server" Text="<%# Total %>"></asp:Label></td>
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						</tr>
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						</tbody>
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						</table>
					
				
			
 
		
		
代码解读

			3.注释以前的代码
		

此外,由于分页控件是否显示的处理已经改变,因此AddEmptyToFullPage过程中的代码
		
			
			- 
				
				
					
					
						
					
				
				
					
					
						// 显示分页控件
					
				
			
 
			- 
				
				
					
					
						
					
				
				
					
					
						//GridView.BottomPagerRow.Visible = true;
					
				
			
 
		
		
代码解读
也需要注释掉,否则因为 Gridview已经禁止分页(his.GridView1.AllowPaging = false;)这里的BottomPagerRow(页脚行)自然就不存在了,运行时会报错的。
			4.添加记录数刷新代码
		
在GridView1的DataBound事件处理中,添加如下代码:
this.labTotal.Text = this.Total.ToString();
		
代码解读

最终效果:

分页问题说得挺多的了,到这期就告一段落了,下期咱们说说别的要完善的地方。
文章结束。创作图文不易,感谢点赞支持,欢迎收藏、关注我后期文章。
