2010-11-02 4 views
2

Comment puis-je mettre plusieurs données dans une cellule DataGrid? Par exemple, un utilisateur peut être membre de différentes organisations.Mettre plusieurs données dans une cellule ASP.NET, VB.NET

Mais je ne veux pas que la table crée une nouvelle ligne DataGrid pour le même utilisateur qui est membre de plusieurs organisations.

Voici comment le code ressemble en ce moment:

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

Remplit DataGrid, mais pour certains utilisateurs, il y a plus de 5 lignes. Donc, je voudrais mettre pour une colonne particulière toutes les données dans une cellule.

Comment cela peut-il être fait?

Edit:

Voici comment il woud ressembler à ce moment:

username memberof 
user1  dft 
user1  kbo 
user2  test 

Et voilà comment je veux qu'il looke comme:

username memberof 
user1  dft 
      kbo 
user2  test 
+0

Fusionner en une liste séparée par des virgules dans la requête sous-jacente serait ma première pensée – BenW

+0

pouvez-vous me donner un exemple? J'ai mis à jour la question. – Yustme

+0

vous ne devriez pas avoir besoin de changer la requête sous-jacente si c'est seulement comment vous l'affichez - le formatage devrait se produire à la couche de présentation –

Répondre

2

Je pense que la meilleure solution est de regrouper les données en utilisant une requête Linq, puis lier les données groupées à un gridview:

Ainsi, le GridView ressemblerait à ceci:

<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> 

et quelques exemples de code ici pour le remplir:

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 
1

Désolé, je pense que sur la peinture était fausse, le concept était bon - on dirait que vous devez le faire sur l'événement databind event ... more here (les trois premiers liens vous montreront comment faire ce que vous avez besoin je pense) - vous co Regardez la rangée où vous vous trouvez, obtenez la ligne précédente, puis décidez quoi faire avec une cellule dans votre rangée actuelle basée sur la ligne précédente

+0

semble que vous voulez utiliser une sorte de fonction d'en-tête de groupe, ne pensez pas que vous pouvez le faire sur une base de données .net bien que –

+0

vous voulez vous assurer que le tri est désactivé si vous affichez des données comme ça. tbh, je montre généralement l'utilisateur plusieurs fois, de cette façon, il est plus flexible et vous pouvez créer des objets à partir de ce qui est cliqué facilement (ass toutes vos données existent sur cette ligne) –

+0

@mr shoubs, les données sont utilisées uniquement pour référence, voir qui est membre de quoi. cette vue n'est pas utilisée pour les changements de quelque façon que ce soit. – Yustme

1

Vous pouvez utiliser à à l'intérieur de la GridView-Cell (ou une Listbox comme Ross Scott suggéré).

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

et RowDataBound de gridview (ItemDataBound de Datagrid fonctionne similaire):

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 

Je pense que cela est la façon la plus flexible.

Questions connexes