La necessità: per ogni riga di un datagrid visualizzare una datagrid con informazioni esplose.
La soluzione: girovagando un po' in giro ho trovato diverse soluzioni sul Master and Detail Datagrid, perfino qualcuno che si è creato a proprio uso e consumo un controllo personalizzato.
Io ovviamente non ho nè il tempo nè le capacità, quindi risolvo più artigianalmente in questo modo.
Lo scenari per varie motivi che non sto ad elencare, mi trovo costretto a dover visualizzare dei blocchi di record, a 3 a 3, relazionati tra loro attraverso apposita tabellina di sql.
Partiamo quindi dal codice del pageload:
strlSQL = "SELECT ID FROM tblRelationship WHERE Divisione = @Divisione AND NOT Stato ='3'"
Dim da As New SqlDataAdapter(strSQL, conn)
dsRelationship = New DataSet
da.Fill(dsRelationship, "miaTabella")
grdTEST.DataSource = dsRelationship
grdTest.DataKeyField = ID
grdTEST.DataBind()
Ottengo così il datagrid popolato di ID.
Adesso passiamo ad implementare la funzioncina che per ogni riga mi interroga il db popolandomi un bel datagrid:
Protected
Function getOrdersDataSource(ByVal _ID As String) As DataView
Dim strSQL As String = "SELECT Fields FROM tblMiaTabella WHERE sr.ID = @ID AND sp.Divisione = @Divisione "
Dim conn As SqlConnection
conn = New SqlConnection(ConfigurationSettings.AppSettings("conn"))
Dim ds As DataSet
Dim daRel As New SqlDataAdapter(strSQL, conn)
ds = New DataSet
daRel.Fill(ds, "ds")
Return ds.Tables(0).DefaultView
End Function
A questo punto personalizziamo il codice HTML.
<asp:DataGrid id="grdTEST" AutoGenerateColumns="False" runat="server">
<Columns>
<asp:TemplateColumn HeaderText="ID">
<ItemTemplate>
<asp:Label Runat="server" Text='<%# Container.DataItem("ID") %>' ID="lblID"></asp:Label>
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn>
<ItemTemplate>
<asp:DataGrid runat="server" AutogenerateColumns="False" DataSource='<%# getOrdersDataSource(DataBinder.Eval(Container.DataItem, "ID")) %>' ID="grdRow">
<Columns>
[... template column]
</Columns>
</asp:DataGrid>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>