将多个数据放在一个单元格中 ASP.NET、VB.NET

Posted

技术标签:

【中文标题】将多个数据放在一个单元格中 ASP.NET、VB.NET【英文标题】:Put multiple data in one cell ASP.NET, VB.NET 【发布时间】:2011-05-03 19:59:23 【问题描述】:

如何将多个数据放在一个数据网格单元格中?例如,用户可以是不同组织的成员。

但我不希望该表为属于多个组织的同一用户创建新的数据网格行。

这就是代码现在的样子:

Dim dSourceMemberOf As New SqlDataAdapter("QUERY", dbConn)

这会填充数据网格,但对于某些用户来说,有超过 5 行。所以我想将一个特定列的所有数据放在一个单元格中。

如何做到这一点?

编辑:

这就是它现在的样子:

username    memberof 
user1       dft 
user1       kbo 
user2       test

这就是我想要的样子:

username   memberof 
user1      dft
           kbo 
user2      test

【问题讨论】:

我首先想到的是在基础查询中将它合并到一个逗号分隔的列表中 你能举个例子吗?我更新了问题。 如果只是如何显示它,则不需要更改底层查询 - 格式应该发生在表示层 是的,但如果我像现在这样做,我怎么能影响它的显示方式? 【参考方案1】:

我认为最好的解决方案是使用 Linq 查询对数据进行分组,然后将分组后的数据绑定到 gridview:

所以 GridView 看起来像这样:

    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
    <Columns>
        <asp:BoundField DataField="UserName" />
        <asp:TemplateField>
            <ItemTemplate>
                <asp:ListBox ID="lst" runat="server" DataSource="<%# Container.DataItem.MemberOfGrouped %>" DataTextField="MemberOf"></asp:ListBox>
            </ItemTemplate>

        </asp:TemplateField>
    </Columns>
</asp:GridView>

下面是一些填充它的示例代码:

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    Dim UngroupedData As List(Of YourData) = New List(Of YourData)()
    Dim item1 As YourData = New YourData()
    item1.MemberOf = "dft"
    item1.UserName = "user1"
    UngroupedData.Add(item1)

    Dim item2 As YourData = New YourData()
    item2.MemberOf = "kbo"
    item2.UserName = "user1"
    UngroupedData.Add(item2)

    Dim grouped = From u In UngroupedData Group u By Key = u.UserName Into Group _
                  Select UserName = Key, MemberOfGrouped = Group.ToList()


    GridView1.DataSource = grouped
    GridView1.DataBind()
End Sub


Public Class YourData

    Private _userName As String
    Public Property UserName() As String
        Get
            Return _userName
        End Get
        Set(ByVal value As String)
            _userName = value
        End Set
    End Property


    Private _memberOf As String
    Public Property MemberOf() As String
        Get
            Return _memberOf
        End Get
        Set(ByVal value As String)
            _memberOf = value
        End Set
    End Property
End Class

【讨论】:

【参考方案2】:

对不起,我认为绘画是错误的,但概念是正确的 - 看起来你需要在 databind event 事件中这样做...more here(前三个链接将告诉你如何做你需要的我想想) - 您可以查看您所在的行,获取上一行,然后根据上一行决定如何处理当前行中的单元格

【讨论】:

看起来你想利用某种组头功能,但不要认为你可以在普通的 .net 数据网格上做到这一点 如果您显示这样的数据,您需要确保已关闭排序。 tbh,我通常向用户展示多次,这样它更灵活,您可以轻松地从单击的内容中创建对象(因为您的所有数据都存在于该行中) @mr shoubs,数据仅供参考,看看谁是什么会员。此视图不用于任何方式的更改。【参考方案3】:

您可以使用 GridView-Cell 内的表格(或 Ross Scott 建议的列表框)。

<ItemTemplate>
    <asp:table id="TblUserGroups" runat="server" Height="100%" Width="100%" CellSpacing="0" CellPadding="0">
    </asp:table> 
</ItemTemplate>

和gridview的RowDataBound(Datagrid的ItemDataBound工作类似):

Protected Sub Gridview1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles Gridview1.RowDataBound
    Select Case e.Row.RowType
        Case DataControlRowType.DataRow
            Dim drUser As DataRowView = DirectCast(e.Row.DataItem, DataRowView)
            Dim TblUserGroups As Table = DirectCast(e.Row.FindControl("TblUserGroups"), Table)
            Dim userID as int32 = Ctype(drUser(0), Int32)
            Dim tblGroups as DataTable = getTblUserGroups(userID) 'write a function that returns the Groups of a given User f.e. as DataTable'
            If tblGroups.Rows.Count = 0 Then
                Dim tr As New TableRow
                Dim td As New TableCell
                Dim LblNoGroup As New Label
                LblNoGroup .Text = "no user-group"
                td.CssClass = "UserWithoutGroup"
                td.Controls.Add(LblNoGroup)
                tr.Cells.Add(td)
                TblUserGroups.Rows.Add(tr)
            Else
                For Each groupRow As DataRow In tblGroups.Rows
                    Dim tr As New TableRow
                    Dim td As New TableCell
                    Dim LblGroup As New Label
                    LblGroup.Text = groupRow("GroupName").ToString 'The groups name column'
                    td.Controls.Add(LblGroup)
                    tr.Cells.Add(td)
                    TblUserGroups.Rows.Add(tr)
                Next
            End If
    End Select
End Sub

我认为这是最灵活的方式。

【讨论】:

以上是关于将多个数据放在一个单元格中 ASP.NET、VB.NET的主要内容,如果未能解决你的问题,请参考以下文章

如何在一个单元格中保存多个外键

Java - 是不是可以将图像和字符串放在同一个 JTable 单元格中?

将特定值放在数据库中的特定表格单元格中。 (剃刀 - html)

如何将多个单元格中的字符串聚合到一个单元格中?

使用 VBA 将多个单元格粘贴到一个单元格中

ASP.NET 如何在不删除以前数据的情况下向数据库单元添加其他数据