DataSet, CreateChildView, e DataRelation: usare DataGrid per visualizzare dati da 2 tabelle
Un semplice e chiaro esempio per sfruttare al meglio il controllo DataGrid, per la visualizzazione di dati provenienti da 2 tabelle diverse, ma collegate fra loro. Viene spiegato come utilizzare il DataSet per creare delle relazioni tra le tabelle in esso contenute.
Per visualizzare contemporaneamente in un datagrid i dati di due diverse tabelle collegate tra di loro da una relazione uno a molti esistono vari sistemi: oltre all?uso di custom control, c?è la possibilità di usufruire delle potenzialità del dataset e della possibilità di creare al suo interno delle tabelle collegate da ben specifiche relazioni. Una volta fatto questo, con il metodo CreateChildView sarà possibile creare dei DataView che contengono, per una data riga della tabella principale, tutte le righe della tabella figlia.
Esaminiamo perciò il codice principale, che inizia con la connessione al db chiamato miodb.mdb
dim OrdersConnection as OleDbConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;_
Data Source="& server.mappath("miodb.mdb"))
Vengono quindi dichiarati due oggetti OledbDataAdapter che puntano rispettivamente alla tabella genitore, che nell?esempio è la tabella 1, e alla seconda tabella, quella cioè figlia chiamata tabella2: si noti come quest?ultima istruzione SQL comprenda i campi che formano la relazione uno a molti tra le due tabelle.
Dim Adapter As New OledbDataAdapter("Select * from tabella1",ordersconnection)
dim Adapter2 as new OledbDataAdapter("Select tabella1.id, tabella2.campofiglio from tabella1,tabella2 where tabella1.Id=tabella2.rif", OrdersConnection)
Viene quindi creato il dataset
Dim MioDataSet As New DataSet()
e al suo interno vengono riversati i dati delle due query fatte in precedenza: si usa il metodo fill per creare le due tabelle nel dataset
Adapter.Fill(MioDataSet,"tabella1")
Adapter2.Fill(MioDataSet,"tabella2")
Adesso è necessario impostare la relazione anche tra le due tabelle del dataset: le istruzioni sono semplici e richiedono la definizione dei due oggetti datacolumn a carico dei quali creare la relazione, e la successiva dichiarazione della stessa
Dim Parent As DataColumn = MioDataSet.Tables("tabella1").Columns("ID")
Dim Child As DataColumn = MioDataSet.Tables("tabella2").Columns("ID ")
Dim CustomerRelation As DataRelation = New DataRelation("CustomerRelation", Parent, Child, False)
La relazione viene quindi agganciata, in termini figurati, alle due tabelle del dataset
MioDataSet.Relations.Add(CustomerRelation)
e, infine, il dataset, con la sua tabella principale, denominata tabella1, viene usata quale fonte di dati per il nostro datagrid principale chiamato DataGrid1.
DataGrid1.DataSource = MioDataSet.Tables("tabella1").DefaultView
DataBind()
All?interno del Datagrid1, per il quale nell?esempio è stato abilitato il paging, si crea un secondo datagrid, DataGrid2, il cui codice HTML è:
<asp:DataGrid id="DataGrid2" width="80%" runat="server" BorderColor="Black" AutoGenerateColumns="False" DataSource='<%# CType(Container.DataItem,DataRowView).CreateChildView("CustomerRelation") %>' backcolor="yellow">
<HeaderStyle font-bold="True" forecolor="White" backcolor="#CCCC99"></HeaderStyle>
<Columns>
<asp:BoundColumn DataField="campofiglio" HeaderText="Campi collegati"/>
Questo secondo datagrid ha come datasource il seguente codice:
<%# CType(Container.DataItem,DataRowView).CreateChildView("CustomerRelation") %>
riga che sfrutta il metodo CreateChildView dell?oggetto Dataset per creare, sulla base della relazione prima definita nel dataset, un dataview che contiene i dati della tabella figlia per ogni riga della tabella genitore.
Con un opportuno adattamento del codice e della grafica è possibile visualizzare i campi desiderati delle due tabelle.
Voto medio articolo: 3.3 Numero Voti: 8