Home Page Home Page Articoli Visualizzare gerarchicamente i dati con una speciale DataGrid

Visualizzare gerarchicamente i dati con una speciale DataGrid

La rappresentazione grafica di dati gerarchicamente connessi tra loro può essere realizzata anche con l'ausilio di un free control, creato da Denis Bauer, ottenendo un risultato veramente ottimo sia dal punto di vista grafico sia da quello funzionale.
Autore: Andrea Bersi Livello:
Il controllo datagrid è certamente uno dei più utilizzati, ma, senza opportune tecniche, risulta difficile usarlo per visualizzare dati provenienti da tabelle distinte. In un altro articolo, è stata presa in esame la possibilità di creare una vista doppia su più tabelle usando le proprietà intrinseche dell?oggetto dataset. In questa sede, si descrive un?altra tecnica che sfrutta un controllo freeware, creato da Denis Bauer, uno sviluppatore tedesco che ringrazio per la disponibilità dimostrata, e disponibile (con documentazione in lingua inglese) all'url:
http://www.denisbauer.com/ASPNETControls.aspx ">Denis Bauer.

Il controllo, che eredita la maggior parte delle sue proprietà e dei suoi metodi dal datagrid del .NET Framework, utilizza un Dataset in cui siano state, ovviamente, create più tabelle con relative relazioni: durante la fase di caricamento dei dati della tabella principale, il controllo cerca nelle tabelle relazionate eventuali righe "figlie" e, se ne trova, le carica dinamicamente in un modello; questo non viene però direttamente visualizzato, ma nascosto all?interno di una colonna nascosta che visualizza soltanto, tramite immagini, la presenza di dati. Ciccando su tale colonna, viene attivata, attraverso JavaScript, la copia dei dati nascosti in una nuova riga del grid.



Nell'esempio allegato, il controllo verrà usato per visualizzare dati di tre distinte tabelle, come nella figura sopra, ma, com?è ovvio non c'è limite al grado di gerarchizzazione.

Prima di usare il controllo per visualizzare i dati, è necessario creare la base dati e riversarla all'interno del DataSet: nell'esempio, viene usata una base dati Access, ma con un procedimento analogo è facile usare XML o base dati SQL. Il database, assolutamente semplice, consta di tre tabelle tra loro collegate da relazioni uno a molti.
Il database di esempio è costituito da tre semplici tabelle, messe logicamente in realazione uno a molti tra di loro come dalla figura:



Il primo passo da compiere è quello di ricreare un oggetto DataSet con analoghe caratteristiche.
All'interno del primo codebehind, index.vb, si trova la routine binda() che provvede a creare un ogetto OleDbConnection


Dim conn as OleDbConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& server.mappath("miodb.mdb"))


e, successivamente, tre OleDbDataAdapter, uno per ogni tabella:


Dim Adapter As New OledbDataAdapter("Select * from Categoria",conn)
Dim Adapter2 as new OledbDataAdapter("Select * from Autori",conn)
Dim Adapter3 as new OledbDataAdapter("Select * from Opere",conn)


Viene quindi creato il dataset:


Dim MioDataSet As New DataSet()


e al suo interno vengono riversati i dati dei tre DataAdapter creati in precedenza: si usa il metodo Fill per creare le generare tabelle nel DataSet, tabelle che vengono chiamate table1, table2 table3


Adapter.Fill(ds,"table1")
Adapter2.Fill(ds,"table2")
Adapter3.fill(ds,"table3")


Adesso è necessario impostare la relazione anche tra le tabelle del dataset: le istruzioni sono semplici e richiedono la definizione degli oggetti datacolumn a carico dei quali creare le relazioni, e la successiva dichiarazione delle stesse:


Dim Parent As DataColumn
Dim Child As DataColumn
parent = ds.Tables("table1").Columns("idcategoria ")
child=ds.Tables("table2").Columns("idcategoria ")


La relazione viene quindi agganciata, in termini figurati, alle due tabelle del DataSet:


Dim dr As DataRelation = New DataRelation("newrelation", Parent, Child, False)
ds.Relations.Add(dr)


e quindi, in maniera analoga, per la seconda relazione:


Parent= ds.Tables("table2").Columns("idautore ")
Child = ds.Tables("table3").Columns("idautore")
dr = New DataRelation("newrelation2", Parent, Child, False)
ds.Relations.Add(dr)


e, infine, il DataSet, con la sua tabella principale, denominata table1, viene usata quale fonte di dati per il nostro controllo chiamato HG1.

Per iniziare ad usare il controllo, è ovviamente necessario creare una directory bin dove inserire la dll; creata quindi la nuova pagina aspx, si andrà a referenziare il controllo con la direttiva

<%@ Register TagPrefix="DBWC" Namespace="DBauer.Web.UI.WebControls" Assembly="DBauer.Web.UI.WebControls.HierarGrid" %>

A questo punto, si tratta di inserire il controllo nella pagina, così come si farebbe con un normale DataGrid:

<asp:DataGrid id="DG1" runat="server"> cambiato in <dbwc:HierarGrid id="HG1" runat="server">

Unica accortezza da usare è quella di dichiarare il controllo nel codebehind:

Protected WithEvents HG1 As DBauer.Web.UI.WebControls.HierarGrid

A questo punto, nel file aspx, si tratterà di impostare il grid come si desidera: nel caso in esame, esso viene programmato per visualizzare una sola colonna; essenziale è impostare ora i valori delle proprietà che consentono al controllo di funzionare, e cioè il LoadControlMode ed il TemplateDataMode. Il primo, LoadControlMode, viene impostato come

LoadControlMode="UserControl"

Mentre il secondo parametro, TemplateDataMode, può essere impostato o su SingleRow o su Table: nel primo caso, ad ogni riga sarà associato il caricamento di un user control, mentre nel secondo caso lo stesso tipo di controllo verrà usato per l?intera griglia. Lo svantaggio, nel nostro caso di usare TemplateDataMode="SingleRow" sarebbe che ogni riga figlia del grid verrebbe visualizzata grazie ad un file ascx suo proprio, impedendo invece di riunire tutte le righe figlie nello stesso controllo, uguale, nell?esempio, ad un datagrid. Nel caso di esempio, perciò, si imposta:

TemplateDataMode="Table"

Infine, per velocizzare quanto più possibile il rendering del controllo, si può utilizzare la proprietà :

TemplateCachingBase="Tablename"

A questo punto, la griglia è pronta per essere programmata a visualizzare i dati: questo viene fatto grazie all'evento TemplateSelection(...), dichiarato come:


Private Sub HG1_TemplateSelection(ByVal sender As Object, ByVal e As DBauer.Web.UI.WebControls.HierarGridTemplateSelectionEventArgs) Handles HG1.TemplateSelection


In questo evento si deve semplicemente indicare il file ascx a usare come visualizzatore dei dati figli, in questo modo:


e.TemplateFilename = e.Row.Table.TableName + ".ascx"


che, nell'esempio, è ridotto più semplicemente, ad un


Private Sub HG1_TemplateSelection(ByVal sender As Object, ByVal e As DBauer.Web.UI.WebControls.HierarGridTemplateSelectionEventArgs) Handles HG1.TemplateSelection
Select Case (e.Row.Table.TableName)
Case "table2"
e.TemplateFilename = "file2.ascx"
End Select
End Sub


Dove cioè si indica che, se la tabella dipendente ? nel dataset ? è table2, il controllo deve agganciare il file (controllo utente) file2.ascx.
I controlli utenti che vengono usati sono dei file che vengono salvati come ascx, all?interno dei quali si inseriscono tutti i controlli che servono per visualizzare i dati che servono, con l?accortezza di usare una particolare espressione di databinding che è:

DataBinder.Eval(CType(Container, DataGridItem).DataItem, "nome_campo_da_visualizzare")

e che diventa, nel caso ? come quello di esempio ? di uso di un controllo valido per l?intera tabella:


Private Sub prova_DataBind(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.DataBinding
Dim dgi As DataGridItem = CType(Me.BindingContainer, DataGridItem)
Dim ds As DataSet = CType(dgi.DataItem, DataSet)
DG1.DataSource = ds
DG1.DataMember = "table3"
DG1.DataBind()
End Sub


che crea un DataSet sulla base della proprietà BindingContainer del controllo principale, datast che viene usato per alimentare il controllo che rappresenta i dati gerarchici.

Nell?esempio, cui si rimanda per chiarezza, vengono quindi creati due controlli utente (denominati file2.ascx e file3.ascx) in cui lo stessa routine del listato 9 viene riferita alle due tabelle dipendenti.
Voto medio articolo: 3.4 Numero Voti: 5

File allegati


107_dgridchildren.zip (117 Kbyte)
Andrea Bersi

Andrea Bersi

Profilo completo

Articoli collegati

Utilizzare controlli lato server in un Datagrid
Il DataGrid è un controllo molto avanzato spesso usato in ASP.NET. La maggior parte degli sviluppatori utilizza le funzioni basilari. E' possibile però estenderlo utilizzando controlli server aggiuntivi all'interno delle celle. Vediamo un esempio con una Combo Box.
Autore: Luca Graziani | Difficoltà: | Commenti: 6 | Voto:
Utilizzare il Tracing in ASP.NET
Scopriamo in questo articolo il servizio di analisi di ASP.NET che permette di controllare e analizzare le richieste web, consentendo di scrivere nel log del servizio di analisi in modo da effettuare a runtime una sorta di debug dell'applicazione Web.
Autore: Marco Caruso | Difficoltà: | Commenti: 1 | Voto:
Spedire messaggi SMS con .NET
Spiegheremo in questo articolo alcune tecniche per inviare messaggi SMS tramite .NET: invio tramite Web Service, invio diretto tramite cellulare oppure invio tramite un SMS Gateway. Presente anche un esempio pratico di invio con ASP.NET e Web Service.
Autore: David De Giacomi | Difficoltà: | Commenti: 9
Utilizzare il Web Service dei SQL Reporting Services da una pagina ASP.NET
Vedremo in questo articolo un altro modo di utilizzo dei Reporting Services. Mostreremo infatti come consumare il Web Service offerto dai RS per esportare i Reports in vari formati (XML, Excel, PDF, HTML, CSV) e visualizzarli in una pagina ASP.NET.
Autore: Marco Caruso | Difficoltà: | Commenti: 1 | Voto:
Mobile Web Forms e compatibilità tra Device
Ecco un articolo che illustra la creazione di una pagina mobile, tenendo conto delle compatibilità tra vari Device mobili.
Autore: Giovanni Ferron | Difficoltà:
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.
Autore: Andrea Bersi | Difficoltà: | Commenti: 1 | Voto:
Caching di pagine ASP.NET
Quando si ha a che fare con l'ingegnerizzazione di un programma la gestione del cache è una cosa importante. La "cache" e' un'area molto veloce (di solito la RAM) dove vengono copiati i dati che necessitano di essere disponibili nel piu breve tempo possibile. Vediamo com'è possibile gestire la Cache in ASP.NET
Autore: Matteo Raumer | Difficoltà:
Paginare un Datalist utilizzando il metodo ReadXml della classe Dataset
Il controllo DataGrid è uno strumento molto completo, ma che a volte può risultare troppo complesso in base alle esigenze della nostra applicazione. In questo articolo verrà spiegato come utilizzare al massimo il controllo DataList, anch'esso ottimo visualizzatore di dati, utilizzando però un'origine dati in formato XML, implementandone la paginazione.
Autore: Matteo Raumer | Difficoltà:
Come paginare un DataList
In questo articolo viene spiegato come paginare un DataList, grazie all'aiuto di stored procedure e al supporto per il paging offerto dal controllo stesso. Per ottenere una paginazione veloce, leggera, e personalizzabile al massimo.
Autore: Loris Badii | Difficoltà: | Commenti: 2 | Voto:
Ridimensionare al volo le immagini uploadate sul server, per creare le ThumbnailImages.
Molto spesso ci capita di voler visualizzare un'anteprima di un'immagine che magari ha grosse dimensioni. In questo articolo verrà spiegato come creare le immagini ridimensionate senza perdita di qualità.
Autore: Valerio Fornito | Difficoltà: | Commenti: 6
Renderizzare automaticamente gli URL come links in formato HTML
Molto spesso ci capita di dover visualizzare nelle pagina web degli URL, letti magari dal DB, ma che non ci vengono visualizzati subito come link cliccabili dall'utente. In questo articolo verrà spiegato come automatizzare questo processo.
Autore: Valerio Fornito | Difficoltà: | Voto:
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5