总计 139 次浏览

接上期

上期文章介绍了GridView的自定义分页模板,并且实现了输入页码的跳转。在实际使用中应该够用了,不过有些朋友工作认真,精益求精,这时就会发现还有些小问题,比如:我们并不知道具体有所少数据,总共分了多少页;用户根据实际情况自己确定每页行数;最后一页的数据不足一页时,Gridview的高度会变小,与页面别的内容产生了“不和谐”。

今天我们就将这些问题再优化一下。

一、记录统计

1.显示记录总数

i.在代码页面中,添加一个变量,用来保存记录总数

public int Total = 0; //记录总记录数
		
代码解读

ii.在Gridview控件PagerTemplate模板下添加如下控件:

控件编辑菜单→编辑模板→PagerTemplate→添加两个label控件

第一个的text改为:记录总数:

第二个的text改为:<%# Total %>

生成代码如下:

【GridView渐进全解】第五部分GridView分页增强插图

iii.编写代码:

		
  1. using System.Data;
  2. ……
  3. //获取记录总数
  4. private void GetRecordTotal()
  5. {
  6. DataTable dt = new DataTable();
  7. DataView dv = (DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty);
  8. if (dv != null)
  9. {
  10. dt = dv.ToTable();
  11. Total = dt.Rows.Count; //记录总记录数
  12. }
  13. else
  14. {
  15. Total = 0; //记录总记录数
  16. }
  17. }
  18. ……
  19. protected void Page_Load(object sender, EventArgs e)
  20. {
  21. GetRecordTotal();
  22. }
【GridView渐进全解】第五部分GridView分页增强插图1
代码解读

页面效果:

【GridView渐进全解】第五部分GridView分页增强插图2

2.自动更新记录总数

当我们对数据进行了“删除”、“增加”操作后,会导致记录总数发生变化,因此需要在操作完成后进行更新。

GetRecordTotal();//重新计算记录数
		
代码解读

 

【GridView渐进全解】第五部分GridView分页增强插图3

经过测试,记录数显示正常。

二、分页统计

1.模版编辑

控件编辑菜单→编辑模板→PagerTemplate→添加一段文字及两个label控件

【GridView渐进全解】第五部分GridView分页增强插图4

2.数据绑定

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

【GridView渐进全解】第五部分GridView分页增强插图5

运行看效果:

【GridView渐进全解】第五部分GridView分页增强插图6

 三、自定义每页行数

1.模版编辑

再在PagerTemplate模板中添加文本框、按钮,内容如下:

 

【GridView渐进全解】第五部分GridView分页增强插图7

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

【GridView渐进全解】第五部分GridView分页增强插图8

 

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

页面效果:

【GridView渐进全解】第五部分GridView分页增强插图9

·2.添加单击事件

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

【GridView渐进全解】第五部分GridView分页增强插图10

具体代码如下:

		
  1. protected void btnPageSize_Click(object sender, EventArgs e)
  2. {
  3. // 获取触发事件的按钮
  4. Button btn = sender as Button;
  5. // 获取其所在的行
  6. GridViewRow row = btn.NamingContainer as GridViewRow;
  7. // 获取行中名为txtPageSize的控件
  8. Control control = row.FindControl("txtPageSize");
  9. // 转换控件并获取值(控件类型是TextBox)
  10. TextBox textBox = control as TextBox;
  11. // 获取其值
  12. string value = textBox.Text;
  13. //变量转换
  14. int PageSize;
  15. try
  16. {
  17. PageSize = int.Parse(value);
  18. }
  19. catch
  20. {
  21. PageSize = 10;
  22. }
  23. if (PageSize < 1)
  24. {
  25. PageSize = 1;
  26. }
  27. //设置新的PageSize
  28. GridView1.PageSize = PageSize;
  29. // 重新绑定数据,这将会应用新的PageSize
  30. GridView1.DataBind();
  31. }
【GridView渐进全解】第五部分GridView分页增强插图1
代码解读

 

四、不足一页的处理

页面容量(每页行数)可以调整了,我们会发现,如果页面容量与总记录数不能恰好整除,就会出现末尾也不足一页的情况,视觉上感到最后一页突然变小(高度改变)。这会导致与页面中其它内容的布局发生改变,影响用户体验度,因此需要再编写如下代码。

1.补足最后一页的代码

		
  1. //尾页填充空行
  2. private static void AddEmptyToFullPage(object sender)
  3. {
  4. GridView GridView = sender as GridView;
  5. //如果没数据就返回
  6. if (GridView.Rows.Count == 0)
  7. {
  8. return;
  9. }
  10. // 显示分页控件
  11. GridView.BottomPagerRow.Visible = true;
  12. //如果不足一页
  13. if (GridView.Rows.Count < GridView.PageSize)
  14. {
  15. Control table = GridView.Controls[0];
  16. if (table != null)
  17. {
  18. for (int i = 0; i < GridView.PageSize - GridView.Rows.Count; i++)
  19. {
  20. int rowIndex = GridView.Rows.Count + i + 1;
  21. GridViewRow row = new GridViewRow(rowIndex, -1, DataControlRowType.Separator, DataControlRowState.Normal);
  22. row.CssClass = (rowIndex % 2 == 0) ? "alternate" : "item";
  23. for (int j = 0; j < GridView.Columns.Count; j++)
  24. {
  25. TableCell cell = new TableCell();
  26. cell.Text = " ";
  27. row.Controls.Add(cell);
  28. }
  29. table.Controls.AddAt(rowIndex, row);
  30. }
  31. }
  32. }
  33. }
【GridView渐进全解】第五部分GridView分页增强插图1
代码解读

2.调用位置

通常Gridview完成渲染会触发DataBound事件,这里使我们填充空行的好时机

选中控件→属性→事件→双击

【GridView渐进全解】第五部分GridView分页增强插图11

编写代码:

		
  1. protected void GridView1_DataBound(object sender, EventArgs e)
  2. {
  3. AddEmptyToFullPage(this.GridView1);
  4. }
代码解读

 页面效果:

【GridView渐进全解】第五部分GridView分页增强插图12

五、首页不足一页的处理

Gridview展示的数据行数较少,小于页面容量时,理应就不能再出现分页控件了,因此需要再“细化”一下:

1.根据记录数启用/禁用分页

		
  1. //如果只有一页
  2. if (this.GridView1.PageCount > 1)
  3. {
  4. //启用分页控件
  5. this.GridView1.AllowPaging = true;
  6. }
  7. else
  8. {
  9. //禁用分页控件
  10. this.GridView1.AllowPaging = false;
  11. }
代码解读

2.给表格顶部添加一个“信息栏”

修改页面源码,在GridView控件之前,添加如下代码:

		
  1. <table class="table table-bordered" width="100%" style="margin-bottom:0px">
  2. <tbody>
  3. <tr>
  4. <td>记录总数:<asp:Label ID="labTotal" runat="server" Text="<%# Total %>"></asp:Label></td>
  5. </tr>
  6. </tbody>
  7. </table>
代码解读

【GridView渐进全解】第五部分GridView分页增强插图13

3.注释以前的代码

 

【GridView渐进全解】第五部分GridView分页增强插图14

此外,由于分页控件是否显示的处理已经改变,因此AddEmptyToFullPage过程中的代码

		
  1. // 显示分页控件
  2. //GridView.BottomPagerRow.Visible = true;
代码解读

 

也需要注释掉,否则因为 Gridview已经禁止分页(his.GridView1.AllowPaging = false;)这里的BottomPagerRow(页脚行)自然就不存在了,运行时会报错的。

4.添加记录数刷新代码

在GridView1的DataBound事件处理中,添加如下代码:

this.labTotal.Text = this.Total.ToString();
		
代码解读

【GridView渐进全解】第五部分GridView分页增强插图15

最终效果:

【GridView渐进全解】第五部分GridView分页增强插图16

 分页问题说得挺多的了,到这期就告一段落了,下期咱们说说别的要完善的地方。


文章结束。创作图文不易,感谢点赞支持,欢迎收藏、关注我后期文章。

By 站长

发表回复

普人特福的博客cnzz&51la for wordpress,cnzz for wordpress,51la for wordpress