【接上期】
上期文章介绍了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();
代码解读

最终效果:

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