到网上一查,呵呵查到了两篇文章。然后,还是对文章的代码修改了一下,把程序改进了一下。
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 = " "; 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 = " "; 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 = " "; row.Controls.Add(cell); table.Controls.AddAt(gvr.Rows.Count + 1, row); } catch (Exception) {} } } // 设置分页行永远显示 gvr.BottomPagerRow.Visible = true; }
当然,如果是有边框的那就不行了,边框的宽度没有计算在内的。
这次还是附一下原代码吧:pageNO_3.rar