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

 

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

    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

posted on 2008-12-04 19:31  寒炫_水煮江湖  阅读(3100)  评论(1编辑  收藏  举报