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

昨天写完《 自定义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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值