ASP.NET GridView第二个标题行跨越主标题行。

9 浏览
0 Comments

ASP.NET GridView第二个标题行跨越主标题行。

我有一个ASP.NET GridView,它的列看起来像这样:

| Foo | Bar | Total1 | Total2 | Total3 |

是否可以创建一个两行的标题,看起来像这样?

| | Totals |

| Foo | Bar | 1 | 2 | 3 |

每行中的数据将保持不变,这只是为了美化标题并减少网格所占用的水平空间。

整个GridView是可排序的,如果有关系的话。我不打算为添加的"Totals"跨列功能添加任何排序功能。

编辑:

根据下面给出的一篇文章,我创建了一个继承自GridView并添加了第二个标题行的类。

namespace CustomControls
{
    public class TwoHeadedGridView : GridView
    {
        protected Table InnerTable
        {
            get
            {
                if (this.HasControls())
                {
                    return (Table)this.Controls[0];
                }
                return null;
            }
        }
        protected override void OnDataBound(EventArgs e)
        {
            base.OnDataBound(e);
            this.CreateSecondHeader();
        }
        private void CreateSecondHeader()
        {
            GridViewRow row = new GridViewRow(0, -1, DataControlRowType.Header, DataControlRowState.Normal);
            TableCell left = new TableHeaderCell();
            left.ColumnSpan = 3;
            row.Cells.Add(left);
            TableCell totals = new TableHeaderCell();
            totals.ColumnSpan = this.Columns.Count - 3;
            totals.Text = "Totals";
            row.Cells.Add(totals);
            this.InnerTable.Rows.AddAt(0, row);
        }
    }
}

如果您和我一样是ASP.NET的新手,我还应该指出您需要做以下更改:

1)通过在Web表单中添加类似于以下行的代码来注册您的类:

<%@ Register TagPrefix="foo" NameSpace="CustomControls" Assembly="__code"%>

2)在您之前的标记中将asp:GridView更改为foo:TwoHeadedGridView。不要忘记关闭标签。

另一个编辑:

您也可以不创建自定义类来完成这个操作。

只需为网格的DataBound事件添加一个事件处理程序,如下所示:

protected void gvOrganisms_DataBound(object sender, EventArgs e)
{
    GridView grid = sender as GridView;
    if (grid != null)
    {
        GridViewRow row = new GridViewRow(0, -1,
            DataControlRowType.Header, DataControlRowState.Normal);
        TableCell left = new TableHeaderCell();
        left.ColumnSpan = 3;
        row.Cells.Add(left);
        TableCell totals = new TableHeaderCell();
        totals.ColumnSpan = grid.Columns.Count - 3;
        totals.Text = "Totals";
        row.Cells.Add(totals);
        Table t = grid.Controls[0] as Table;
        if (t != null)
        {
            t.Rows.AddAt(0, row);
        }
    }
}

自定义控件的优点是您可以在Web表单的设计视图中看到额外的标题行。事件处理程序方法更简单一些。

0