对《自定义GridView分页模板中页码Button的实现》中程序的改进,追加显示空行功能

昨天写完《 自定义GridView分页模板中页码Button的实现》后发现一个问题,因为分页后的数据行数不是正好为满页的,所以最后一页就会变成下面第二幅图的样子:

对《自定义GridView分页模板中页码Button的实现》中程序的改进,追加显示空行功能_第1张图片 

  到网上一查,呵呵查到了两篇文章。然后,还是对文章的代码修改了一下,把程序改进了一下。

    GridView 绑定数据不满一页时填充空行的方法

    GridView 始终显示 Pager 分页行的一种方法

  第一篇文章所说的就是我们主要想改进的问题,而第二篇文章所说的问题是在数据行的总数小于一页的时候,也就是只有一页或不到一页的数据,分页行的按钮就不显示了,我们这里也让它始终显示。最后的程序效果如下图:

  

  首先,我们要追加几个样式,"altrowstyle" , "rowstyle",用来对新添加的行设置样式,不然出来的行是白色的。当然,如果没有边框或边框是白色的,也可以实现另外的一种效果,并且代码要简单。在文章的最后我会给出代码。下面是样式。

style

 

  代码在原来的基础上追加了DataBound的事件:

Code
 protected void grvPage_DataBound(object sender, EventArgs e) { fillGridViewRow(grvPage); } private void fillGridViewRow(GridView gvr) { if (gvr.Rows.Count != 0) { if (gvr.Rows.Count != gvr.PageSize) { Control table = gvr.Controls[0]; if (table != null) { GridViewRow SRow = gvr.Rows[0]; for (int i = 0; i < gvr.PageSize - gvr.Rows.Count; i++) { int rowIndex = gvr.Rows.Count + i + 1; GridViewRow row = new GridViewRow(rowIndex, -1, DataControlRowType.Separator, DataControlRowState.Normal); row.CssClass = (rowIndex % 2 == 0) ? "altrowstyle" : "rowstyle"; //设置行的样式   try { for (int j = 0; j < gvr.HeaderRow.Cells.Count; j++) { TableCell cell = new TableCell(); cell.Text = "&nbsp;"; cell.Height = gvr.RowStyle.Height; //这里是行的高度,要和RowStyle中对应  cell.Visible = SRow.Cells[j].Visible;  //对隐藏的单元格的设定  row.Controls.Add(cell); } table.Controls.AddAt(rowIndex, row); } catch (Exception) { continue; } } } } // 设置分页行永远显示  gvr.BottomPagerRow.Visible = true; } }

 

  在这里我也对隐藏单元格的属性进行了设置,但是程序中因为是自动建立列,没有设置隐藏的列,所有没有进行测试,看不到结果。

 

  原文章中的代码在判断有几列的时候用的是gridView.Columns.Count,但是在自动建立列的时候这个值是0,所以改成了gridView.HeaderRow.Cells.Count。然后对新加行的高度进行设置cell.Height = gvr.RowStyle.Height,不然出来的高度可能是不一样的。

  设置永远显示分页功能行时,原文章用的是 table.Controls[table.Controls.Count].Visible = true,gridView本身就有分页行的对象,所以直接调用就行,代码改成gvr.BottomPagerRow.Visible = true。

  

  原代码:pageNO_2.rar

   

  除此以外,上面我们提到了,如果没有边框或边框是白色的时候的另外一种效果,在代码中我们就可以不用循环添加单元格的方法,而是直接合并单元格就可以了,同时也不用写CSS样式了。代码如下:

 

Code
 try { TableCell cell = new TableCell(); cell.ColumnSpan = gvr.HeaderRow.Cells.Count; //这里将一行的所有单元格合并,可以不考虑隐藏的单元格  cell.Height = gvr.RowStyle.Height; //这里是行的高度,要和RowStyle中对应  cell.Text = "&nbsp;"; row.Controls.Add(cell); table.Controls.AddAt(rowIndex, row); } catch (Exception) { continue; }

 

   原代码中的GridViewRow SRow = gvr.Rows[0];cell.Visible = SRow.Cells[j].Visible;,也就是设置隐藏属性,row.CssClass = (rowIndex % 2 == 0) ? "altrowstyle" : "rowstyle"; 设置行的样式,还有循环都去掉了,追加了一行cell.ColumnSpan = gvr.HeaderRow.Cells.Count;直接合并单元格。

  效果如图:可以保持表格的高度,但是要注意,在RowStyle中一定要给Height设置值,而不是在CSS中不然高度可能会不一样。

  

  这个代码就不附了,修改一个就可以了。

 -------------------------------------------

     上午才刚修改了文章,又发现还可以改进一下,我们可以把行的那个循环也去掉,直接把单元格的高度设置为“一行的高度*行数”就可以了。代码如下:

Code
 private void fillGridViewRow(GridView gvr) { if (gvr.Rows.Count > 0 && gvr.Rows.Count < gvr.PageSize) { Control table = gvr.Controls[0]; if (table != null) { GridViewRow row = new GridViewRow(gvr.Rows.Count + 1, -1, DataControlRowType.Separator, DataControlRowState.Normal); try { TableCell cell = new TableCell(); cell.ColumnSpan = gvr.HeaderRow.Cells.Count; //这里将一行的所有单元格合并,可以不考虑隐藏的单元格    Unit rowheight = (Unit)(gvr.RowStyle.Height.Value * (gvr.PageSize - gvr.Rows.Count)); cell.Height = rowheight;  //这里是行的高度,要和RowStyle中对应  cell.Text = "&nbsp;"; row.Controls.Add(cell); table.Controls.AddAt(gvr.Rows.Count + 1, row); } catch (Exception) {} } } // 设置分页行永远显示  gvr.BottomPagerRow.Visible = true; }

     当然,如果是有边框的那就不行了,边框的宽度没有计算在内的。

     这次还是附一下原代码吧:pageNO_3.rar


你可能感兴趣的:(exception,object,css,table,null,button)