【问题标题】:Header column with a column span in a GridViewGridView 中具有列跨度的标题列
【发布时间】:2016-05-10 14:41:21
【问题描述】:

例如,我希望我的标题如下:

|       Header Column           |      Header Column2      |
|apple|Microsoft|Android|Dell|HP|Targus|Stack Overflow|Acer|

我添加一列的VB代码如下:

Dim dt As New DataTable
dt.Clear()
    dt.Columns.Add("apple")
    dt.Columns.Add("Microsoft")
Dim mr As DataRow
    mr = dt.NewRow
    mr("apple") = "Macbook"
    mr("Microsoft") = "Surface Pro"
dt.Rows.Add(mr)
GridView1.DataSource = dt
GridView1.DataBind()

【问题讨论】:

  • 你可以试试可以自定义设计的Repeater
  • 在这种情况下我将如何使用中继器?
  • 您可以在 Gridview 中添加额外的 HeaderRowstackoverflow.com/questions/36716084/…
  • 如何在我的代码中使用标题行。我应该只添加一个标题列,然后将其添加到我的 dt.rows 吗?还是我想多了?
  • 你不要修改数据表。您在 gridview PreRender 事件期间向 gridview 内表添加一个额外的标题行。我在上面的 SO 链接中的回答中有一个例子

标签: asp.net vb.net gridview


【解决方案1】:

这可以在 GridView 的 RowDataBound 事件中完成。只需检查当前行是否为标题,如果是,则设置应跨越的单元格。

首先确保 GridView 处理行数据绑定事件。

<asp:GridView ID="GridView1" runat="server" OnRowDataBound="gridView1_RowDataBound">
    ...
</asp:GridView>

然后,决定应该跨越哪个单元格。之后,隐藏跨越单元格将跨越的单元格。

Protected Sub gridView1_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
    If e.Row.RowType = DataControlRowType.Header Then
        e.Row.Cells(0).ColumnSpan = 3
        e.Row.Cells(1).Visible = False
        e.Row.Cells(2).Visible = False
    End If
End Sub

请记住,如果添加或删除任何列,这种硬编码可能会导致将来出现问题。

【讨论】:

  • 这需要在 PreRender 中完成,因为如果数据源被缓存,数据绑定并不总是发生。
  • @fnostro - 有趣。虽然我不知道我是否完全遵循。你指的是caching data using data source controls吗?如果是这样,我只是自己做了一个测试,看看它是如何工作的。我注意到它每次都会调用 RowDataBound ,无论它是否使用缓存数据。你是说有时可能不是这样吗?
  • 这取决于您的设计。但通常应始终缓存数据源,无论是通过使用SqlDataSource 或类似的缓存控制,还是在应用程序缓存中以编程方式。但不管是否缓存,如果您总是调用DataBind(),那么将它留在RowDataBound 中就可以了。如果您切换到缓存数据源(并停止手动调用DataBind()),标题将消失
  • 知道了,请给这个问题点赞,我将其标记为答案。它有帮助。所以为了将来的客人标记为upvote谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 2015-05-18
  • 2020-01-06
  • 1970-01-01
  • 2015-02-07
相关资源
最近更新 更多