DataTable vers Treeview [Résolu]

Signaler
Messages postés
3
Date d'inscription
samedi 16 juillet 2011
Statut
Membre
Dernière intervention
16 août 2011
-
Messages postés
3
Date d'inscription
samedi 16 juillet 2011
Statut
Membre
Dernière intervention
16 août 2011
-
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

Messages postés
3
Date d'inscription
samedi 16 juillet 2011
Statut
Membre
Dernière intervention
16 août 2011

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();
        }        
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
39
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é. -
Messages postés
3
Date d'inscription
samedi 16 juillet 2011
Statut
Membre
Dernière intervention
16 août 2011

Oups toutes mes excuses, j'en prends bonne note...