2010-11-02 86 views
2

如何將多個數據放在一個數據網格單元格中?例如,用戶可以是不同組織的成員。將多個數據放在一個單元格中ASP.NET,VB.NET

但我不希望表爲同一個用戶創建一個新的DataGrid行,這是多個組織的成員。

這是怎樣的代碼看起來像現在:

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

這充滿DataGrid中,但對於一些用戶有更多然後5行。所以我想把一個特定的列放在一個單元格中的所有數據。

這怎麼辦?

編輯:

這是怎麼woud看起來像現在:

username memberof 
user1  dft 
user1  kbo 
user2  test 

而且這是我希望它looke像:

username memberof 
user1  dft 
      kbo 
user2  test 
+0

把它合併成一個逗號分隔的列表中的底層查詢將是我第一次想到 – BenW 2010-11-02 08:56:33

+0

你能舉個例子嗎?我更新了這個問題。 – Yustme 2010-11-02 10:20:05

+0

如果只是顯示它,你不需要更改底層查詢 - 格式化應該發生在表示層 – 2010-11-02 10:27:09

回答

2

我認爲最好的解決方案是使用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 
1

對不起,我覺得油漆錯了,概念是正確的 - 看起來你需要在databind event活動上做... more here(前三個鏈接會告訴你如何做你所需要的,我認爲) - you co你看上一行,得到上一行,然後根據上一行決定如何處理當前行中的單元格

+0

看起來像你想利用某種組頭功能,不要以爲你可以在普通的.net數據網格上做到這一點,儘管 – 2010-11-02 10:23:37

+0

如果你顯示的數據是這樣的,你想確保排序關閉。 tbh,我通常多次向用戶顯示,這樣它就更加靈活,並且您可以輕鬆地創建對象(屁股上存在的所有數據) – 2010-11-02 10:25:32

+0

@mr shoubs,數據僅用於參考,看看誰是什麼成員。此視圖不以任何方式用於更改。 – Yustme 2010-11-02 10:33:32

1

你可以在使用能夠在GridView-Cell(或Ross Scott建議的列表框)中使用。

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

和GridView控件中的RowDataBound(數據網格的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 

我覺得這是最靈活的方式。

相關問題