DataTable vers Treeview

Résolu
Red3 Messages postés 3 Date d'inscription samedi 16 juillet 2011 Statut Membre Dernière intervention 16 août 2011 - 13 août 2011 à 14:33
Red3 Messages postés 3 Date d'inscription samedi 16 juillet 2011 Statut Membre Dernière intervention 16 août 2011 - 16 août 2011 à 22:18
Bonjour à tous,

Je tente aussi ma chance ici pour exposer un problème sur lequel je bloque depuis quelques jours : il s'agit du peuplement d'un TreeView depuis une DataTable, contenant le résultat d'une requête effectuée sur une base de données SQL.

Le résultat de la requête (et donc le contenu de la DataTable) se présente ainsi :



Je voudrais afficher tout ça dans un TreeView, et donc obtenir cela :



Malheureusement, tout ce que je parviens à obtenir, c'est cela :



Je ne parviens pas à me débarrasser de la redondance des noeuds (le TreeView réplique le résultat de la requête), y aurait-il une solution pour peupler convenablement ce contrôle ?

Voici le bout de code de départ que j'ai rédigé :

private void Form1_Load(object sender, EventArgs e)
{
// Connexion à la base de données
 
SqlConnection maConnexion = new SqlConnection("Data Source=(local);Initial Catalog=maBase;Integrated Security=True");
maConnexion.Open();
SqlDataAdapter monAdapter = new SqlDataAdapter();
monAdapter.SelectCommand new SqlCommand("SELECT NOMPROJET, CONSTITUER.CYCLEVIE, NOMLOT, IDINTERV FROM PROJET JOIN CONSTITUER ON PROJET.CODEPROJET CONSTITUER.CODEPROJET AND PROJET.CODEPROJET = 3 LEFT JOIN LOT ON PROJET.CODEPROJET = LOT.CODEPROJET AND LOT.CYCLEVIE = CONSTITUER.CYCLEVIE AND PROJET.CODEPROJET = 3 LEFT JOIN INTERVENTION ON INTERVENTION.CODEPROJET = PROJET.CODEPROJET AND LOT.IDLOT = INTERVENTION.IDLOT AND PROJET.CODEPROJET = 3", maConnexion);
 
// Importation du résultat de la requête dans la DataTable
 
DataTable maTable = new DataTable();
monAdapter.Fill(maTable);
maConnexion.Close();	
 
// Début du traitement du TreeView et création du noeud racine
 
treeView.BeginUpdate();
treeView.Nodes.Clear();
        DataRow maRow = maTable.Rows[0];
TreeNode nodeProjet = new TreeNode(maRow["NOMPROJET"].ToString());
treeView.Nodes.Add(nodeProjet);
 
// Début des problèmes...
 
Int32 n = 0;
foreach (DataRow dr in maTable.Rows)
{
treeView.Nodes[0].Nodes.Add(dr[1].ToString());
if (dr[2].ToString() != "")
{
treeView.Nodes[0].Nodes[n].Nodes.Add(dr[2].ToString());
}
if (dr[3].ToString() != "")
{
treeView.Nodes[0].Nodes[n].Nodes[0].Nodes.Add(dr[3].ToString());
}
n++;
}
treeView.EndUpdate();
treeView.ExpandAll();
}


Merci par avance de votre assistance.

3 réponses

Red3 Messages postés 3 Date d'inscription samedi 16 juillet 2011 Statut Membre Dernière intervention 16 août 2011
13 août 2011 à 16:36
Ok, j'ai trouvé une solution (j'ai adapté un bout de code récupéré sur le net, prévu à l'origine pour afficher une arborescence de dossiers/fichiers dans un TreeView).

Si ça peut servir à quelqu'un :

private void Form1_Load(object sender, EventArgs e)
        {
            SqlConnection maConnexion = new SqlConnection("Data Source=(local);Initial Catalog=BASE;Integrated Security=True");
            maConnexion.Open();
            SqlDataAdapter monAdapter = new SqlDataAdapter();
            monAdapter.SelectCommand new SqlCommand("SELECT NOMPROJET AS PROJET, CONSTITUER.CYCLEVIE AS ETAPE, NOMLOT AS LOT, IDINTERV AS 'NUMERO INTERVENTION' FROM PROJET JOIN CONSTITUER ON PROJET.CODEPROJET CONSTITUER.CODEPROJET AND PROJET.CODEPROJET = @codeprojet LEFT JOIN LOT ON PROJET.CODEPROJET = LOT.CODEPROJET AND LOT.CYCLEVIE = CONSTITUER.CYCLEVIE AND PROJET.CODEPROJET = @codeprojet LEFT JOIN INTERVENTION ON INTERVENTION.CODEPROJET = PROJET.CODEPROJET AND LOT.IDLOT = INTERVENTION.IDLOT AND PROJET.CODEPROJET = @codeprojet", maConnexion);
            monAdapter.SelectCommand.Parameters.Add("@codeprojet", SqlDbType.Int).Value = 3;            
            monAdapter.Fill(maTable);
            maConnexion.Close();    
            
            treeView.BeginUpdate();
            treeView.Nodes.Clear();    
                        
            List<string> maListe = new List<string>();
            foreach (DataRow dr in maTable.Rows)
            {
                maListe.Add(dr[0].ToString() + "*" + dr[1].ToString() + "*" + dr[2].ToString() + "*" + dr[3].ToString());            
            }
            
// C'est ici que ça commence à être intéressant...

            foreach (string monString in maListe)
            {
                string[] monString2 = monString.Split('*');
                
                TreeNodeCollection LesNodesDuTreeview = treeView.Nodes;
                for (Int32 i = 0; i < monString2.Length; i++)
                {
                    Boolean dejaAjoute = false;
                    foreach (TreeNode NodeCourant in LesNodesDuTreeview)
                    {
                        if (NodeCourant.Text.Equals(monString2[i]))
                        {
                            dejaAjoute = true;
                            LesNodesDuTreeview = NodeCourant.Nodes;
                            continue;
                        }
                    }

                    if (dejaAjoute == false & monString2[i].ToString() != "")
                    {
                        TreeNode monNode = new TreeNode(monString2[i]);
                        LesNodesDuTreeview.Add(monNode);
                        LesNodesDuTreeview = monNode.Nodes;
                    }
                }                
            }
            treeView.EndUpdate();
            treeView.ExpandAll();
        }        
3
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
16 août 2011 à 10:51
Bonjour

Parfait si tu as trouvé toi-même la solution. Merci également de l'avoir mise. En revanche, n'oublie pas de mettre "Réponse acceptée" la prochaine fois, afin qu'on sache que le problème est résolu ;)

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
0
Red3 Messages postés 3 Date d'inscription samedi 16 juillet 2011 Statut Membre Dernière intervention 16 août 2011
16 août 2011 à 22:18
Oups toutes mes excuses, j'en prends bonne note...
0
Rejoignez-nous