如何将组标题行添加到数据绑定GridView

时间:2011-08-15 12:49:49

标签: asp.net webforms

我有一个带有三个数据绑定列的GridView,如下所示:

<Columns>
    <asp:BoundField HeaderText="Type" DataField="Type" />
    <asp:BoundField HeaderText="Amenity" DataField="Amenity" />
    <asp:BoundField HeaderText="Distance" DataField="Distance" DataFormatString="{0:0.00} Km" />
</Columns>

记录按类型排序,我想删除Type列,但是当下一组行的type值更改时,为每种类型插入一个标题行。我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

这不是最漂亮的,但它解决了问题,而没有超出GridView范例。感谢carlj

Adding (or Inserting) Subheader Rows into a Gridview
Dim _currentAmenityType = String.Empty
Protected Sub amenitiesGrid_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs) Handles amenitiesGrid.RowDataBound
    If (e.Row.RowType = DataControlRowType.DataRow) Then
        Dim drv = e.Row.DataItem
        If (drv("Type") <> _currentAmenityType) Then
            _currentAmenityType = drv("Type")
            Dim parentTable = TryCast(e.Row.Parent, Table)
            If Not parentTable Is Nothing Then
                Dim row = New GridViewRow(-1, -1, DataControlRowType.DataRow, DataControlRowState.Normal)
                Dim cell = New TableCell()
                cell.ColumnSpan = amenitiesGrid.Columns.Count
                cell.Width = Unit.Percentage(100)
                cell.Style.Add("font-weight", "bold")
                cell.Style.Add("background-color", "#c0c0c0")
                cell.Style.Add("color", "white")
                Dim span = New HtmlGenericControl("span")
                span.InnerHtml = _currentAmenityType
                cell.Controls.Add(span)
                row.Cells.Add(cell)
                parentTable.Rows.AddAt(parentTable.Rows.Count - 1, row)
            End If
        End If
    End If
End Sub

答案 1 :(得分:1)

使用标准的GridView控件,我相信一旦控件被数据绑定,您就无法动态添加额外的行,因此您需要在数据绑定之前更改数据源。但是,这可能不是您需要的非常好的解决方案。

我认为在这种情况下使用GridView控件可能不是最佳选择,因为呈现的HTML将是

<table>
    <thead>
    <tbody>

因此,在行之间添加额外的“标题”行实际上不是标题行。它们只是一个额外的行<tr><td>。知道这一点,我认为您可能更好地使用Repeater控件,在控件中为表格构建HTML,然后在内容模板中使用Placeholder,您可以使用它来模仿添加新行。

e.g。

<table>

<asp:Repeater ID="rpt1" runat="server">

    <HeaderTemplate>

        <thead>
            <tr>
                <th>&nbsp;</th>
                <th>Amenity</th>
                <th>Distance</th>
            </tr>
        </thead>
        <tbody>
    </HeaderTemplate>

    <ItemTemplate>

            <asp:PlaceHolder id="phRow" runat="server" />
            <tr>
                <td>&nbsp;</td>
                <td>Amenity Value</td>
                <td>Distance Value</td>
            </tr>            

    </ItemTemplate>

    <FooterTemplate>
          </tbody>
    </FooterTemplate>

</asp:Repeater>

</table>

在您的代码中,循环遍历Repeater中的每个Item。如果类型不同,则将文字添加到该行中的占位符。

Literal lt = new Literal() { Text = "<tr><td colspan='3'>Type Value</td></tr>" };