Intégration données dans TreeView

beufreecasse Messages postés 18 Date d'inscription mercredi 25 mai 2005 Statut Membre Dernière intervention 20 janvier 2010 - 19 janv. 2010 à 17:43
beufreecasse Messages postés 18 Date d'inscription mercredi 25 mai 2005 Statut Membre Dernière intervention 20 janvier 2010 - 20 janv. 2010 à 17:32
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

krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
20 janv. 2010 à 10:13
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é. -
0
beufreecasse Messages postés 18 Date d'inscription mercredi 25 mai 2005 Statut Membre Dernière intervention 20 janvier 2010
20 janv. 2010 à 17:32
Bonjour,
Merci de votre réponse, je vais essayer dès que possible.
0
Rejoignez-nous