Popolare una TreeView di ASP.NET 2.0 con dati prelevati da un database

di Maurizio Alberti, in UserScript, ASP.NET 2.0, Web Controls,

Un controllo molto interessante di ASP.NET 2.0 è la TreeView, che permette di creare interessanti interfacce di navigazione.
Il controllo TreeView può anche essere legato a sorgenti di dati gerarchiche e a file XML, riducendo quasi a zero la quantità di codice necessaria per mostrare i dati nelle nostre pagine web.

Questo script nasce dalla necessità di popolare in maniera semplice un TreeView usando una serie di tabelle, ognuna delle quali contiene i nodi che saranno ad un certo livello di profondità nella nostra gerarchia. Ognuna di queste tabelle conterrà un campo Id (la chiave della tabella), un campo Descrizione (il testo che verrà mostrato) e una chiave esterna che indicherà l'Id del nodo padre (contenuto nella tabella "precedente").

Per cominciare creiamo un array di stringhe che contenga le query per recuperare i dati dal Database:

private string[] ArrQry = 
{
  "SELECT * FROM Presidi WHERE 1>",
  "SELECT Id, Descrizione FROM Piani WHERE IdPresidio=",
  "SELECT Id, Descrizione FROM Stanze WHERE IdPiano=",
  "SELECT Id, Descrizione FROM Postazioni WHERE IdStanza="
};

Il caricamento dei dati nel TreeView avviene una sola volta al caricamento della pagina:

protected void Page_Load(object sender, EventArgs e)
{
  if (!IsPostBack)
  {
     TreeNode myNode = new TreeNode("ACMEInformatica", "0");
     tvRete.Nodes.Add(myNode);
     Popola(myNode, 0);
     myConnection.Close();
  }
}

Procediamo creando un nodo principale di livello 0, chiamato "ACMEInformatica", e dopo averlo aggiunto alla TreeView eseguiamo la funzione ricorsiva "Popola", che si preoccupa di recuperare i dati dal database e di aggiungere i nodi corretti ad un nodo determinato:

private void Popola(TreeNode aNode, int Livello)
{
  if (Livello < ArrQry.Length)
  {
   myAdapt = new OleDbDataAdapter(ArrQry[Livello] + aNode.Value, myConnection);
   DataSet myDS = new DataSet();
   myAdapt.Fill(myDS);

   foreach (DataRow aRow in myDS.Tables[0].Rows)
   {
    TreeNode myNode = new TreeNode(aRow["Descrizione"].ToString(), aRow["Id"].ToString());
    aNode.ChildNodes.Add(myNode);
    Popola(myNode, ++Livello);
   }
  }
}

La tabella Presidi non ha una chiave esterna, essendo la prima ad essere recuperata, e abbiamo usato un trucco molto semplice, inserendo un filtro fittizio.

La forza di questa soluzione è che permette anche di aggiungere semplicemente dei livelli all'albero agendo unicamente sull'array delle query, per esempio per poter gestire anche il materiale di ogni postazione basta inserire come ultimo elemento dell'array questa query, senza dover modificare nessuna riga di codice:

SELECT Id, Marca+' '+Modello AS Descrizione FROM Materiale WHERE IdPostazione=

E' anche possibile caricare i dati on demand, quando l'utente espande un particolare nodo, come in questo esempio:
http://www.asp.net/QuickStart/aspnet/doc/data/hierarchy.aspx#database

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi