Intégration données dans TreeView

Signaler
Messages postés
18
Date d'inscription
mercredi 25 mai 2005
Statut
Membre
Dernière intervention
20 janvier 2010
-
Messages postés
18
Date d'inscription
mercredi 25 mai 2005
Statut
Membre
Dernière intervention
20 janvier 2010
-
Bonjour,
Je fais appel à vous car je suis désespéré, je n'arrive pas à trouver de solutions...
Je vous explique mon problème :

J'ai dans une table des données comme suit :

ID | Name | Parent_id
---------------------------
1 | Suite 1 | null
---------------------------
2 | Suite 2 | null
---------------------------
3 | Suite1-1 | 1
---------------------------
4 | Suite1-2 | 1
---------------------------
5 | Suite1-1-1 | 3



J'aimerai récupérer dans une treeview toutes ces données en respectant la règle de parent-enfant à savoir :

-Suite 1
|
|_____Suite1-1
| |_____Suite1-1-1
|
|_____Suite1-2

-Suite2


Sachant que je n'ai aucun moyen apparemment de prédire la profondeur de chaque noeud et que le nombre de noeuds enfants est variable.


J'ai alors essayé avec :
TLC.TLGetMySQLTestSuites("1"); //Récupération des Suites de premier niveau
            for (int i = 0; i < TLC.tabGetMySQLSuites.GetLength(0); i++)
            { //Ajout des Suites de premier Niveau 
                TreeNode tn = treeView3.Nodes.Add(TLC.tabGetMySQLSuites.GetValue(i, 1).ToString());
                tn.Name = TLC.tabGetMySQLSuites.GetValue(i, 0).ToString();
            }
           int Checked = 0;
           while (Checked < treeView3.GetNodeCount(true)) //tant que le nombre de treenode checked < nb treenode total
           {
              

               foreach (TreeNode tnode in treeView3.Nodes) //récupération des nodes de treeview3
               {
                   if (tnode.Nodes.Count 0 || tnode.Checked false)
                   {
                       TLC.TLGetMySQLTestSuites(tnode.Name);
                       if (TLC.tabGetMySQLSuites.GetValue(0, 0).ToString() != "0")
                       {
                           for (int i = 0; i < TLC.tabGetMySQLSuites.GetLength(0); i++)
                           {
                               //Ajout des Suites enfants
                               TreeNode tn = tnode.Nodes.Add(TLC.tabGetMySQLSuites.GetValue(i, 1).ToString());
                               tn.Name = TLC.tabGetMySQLSuites.GetValue(i, 0).ToString();
                           }
                       }
                       else
                       {
                           tnode.Checked == true;
                       }

                   }
                   else
                   {
                       tnode.Checked == true;
                   }
                   treeView3.Refresh();
                   treeView3.ExpandAll();

               }

               // Permet de comparer le nombre de noeuds aux suites
               Checked = 0;
               int nodecount = treeView3.GetNodeCount(true);
               foreach (TreeNode tn in treeView3.Nodes)
               {
                   if (tnode.Checked == true)
                   {
                       Checked++;
                   }
               }
           }



Le Problème c'est que treeview3.nodes ne me renvoi que les premiers noeuds or j'aimerai une collection de tous les noeuds de la treeview.


Si vous avez une idée je suis prenneur.


Merci

2 réponses

Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
42
Salut

La méthode la plus simple pour remplir un arbre de cette manière est une méthode récursive :

void maFonctionRecursive(int? idParent, TreeNodesCollection nodes)
{
    // On récupère l'ensemble des enfants du noeud actuel depuis la BDD
    IEnumerable<ElementTable> nodesFromDB = DataAccessLayer.GetWhereParentIs(idParent);

    // Pour chaque donnée enfant
    foreach(ElementTable element in nodesFromDB)
    {
        // On crée un nouveau noeud, que l'on remplit
        TreeNode tn = new TreeNode();
        tn.Text = element.Name;

        // On ajoute ce noeud créé aux enfants du noeud parent
        nodes.Add(tn);

        // Puis on rappelle cette même fonction sur ce noeud
        // pour voir si lui-même a des enfants
        maFonctionRecursive(element.ID, tn.Nodes);
    }
}


Tu appelles cette fonction comme ceci :
maFonctionRecursive(null, MonTreeView.Nodes);


Ta fonction DataAccessLayer.GetWhereParentIs(int? id) te renvoie donc un tableau d'ElementTable, une simple structure qui possède les valeurs de chaque champ de ta table (j'aurais bien mis un nom plus explicite, mais tu n'as pas expliqué exactement ce que seront tes données).

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Messages postés
18
Date d'inscription
mercredi 25 mai 2005
Statut
Membre
Dernière intervention
20 janvier 2010

Bonjour,
Merci de votre réponse, je vais essayer dès que possible.