我有一个带有三个数据绑定列的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值更改时,为每种类型插入一个标题行。我怎么能这样做?
答案 0 :(得分:3)
这不是最漂亮的,但它解决了问题,而没有超出GridView范例。感谢carlj
的Adding (or Inserting) Subheader Rows into a GridviewDim _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> </th>
<th>Amenity</th>
<th>Distance</th>
</tr>
</thead>
<tbody>
</HeaderTemplate>
<ItemTemplate>
<asp:PlaceHolder id="phRow" runat="server" />
<tr>
<td> </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>" };