Bonsoir,
Je suis a la recherche d'un petit code pour remplir d'une manière récursive un Treeview depuis une table contenant les champs :
(ID, ID_PARENT, LIBELLE, etc...)
Si quelqu'un saurait ...?
Merci pour votre aide.
Bonsoir,
Je suis a la recherche d'un petit code pour remplir d'une manière récursive un Treeview depuis une table contenant les champs :
(ID, ID_PARENT, LIBELLE, etc...)
Si quelqu'un saurait ...?
Merci pour votre aide.
ma mere me disait toujours "les si n'aiment pas les rai".
Tu n'as pas d'autre choix que d'effectuer les requetes pour trouver les enfants d'un id pere donné, et recursivement pour les enfants trouvés
Tu peux aussi ne remplir que le Level 1, puis lors du OnExpanding (voir HasChildren pour afficher un + bidon), tu charge les enfants à ce moment, ainsi cela évite de créer une arbre de 3000 items pour rien, j'ai fait cela pour la Base de Registre ou pour la Codification CIM 10 et les Notes hierarchique de la CCAM, cela fonctionne à tous les coups !
ne pas oublier BeginUpdate et EndUpdate, cela évite des lenteurs de remplissage par des tentatives d'affichage inutile
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !![]()
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
Aucun problème pour remplir le level 1 mais pour les autres level qui ont d'autres et ainsi de suite..... mais bon.... je vais voir ca.
Merci
normalement la fonction qui rempli le niveau 1 doit être la même que celle des niveaux suivant, faut juste gérer le Parent NULL ou Vide, mais cela doit être le même code, ou les paramètres sont un Noeud Parent et l'Id du Parent, rien de plus ...
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !![]()
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
n'oublie pas que dans les TreeNode, tu as un Data, qui peut te servir par exemple a stocker ... l'id du noeud dans ta table
Tu as de nombreuses façons de procéder :
1. La méthode indiquée par ShaiLeTroll : Cette méthode est intéressante si tu n'as pas besoin de construire l'arbre complet au chargement. Elle te permettra de faire le chargement des parties utilisées au fûr et à mesure des besoins. En revanche, si tu dois développer plus ou moins la totalité de l'arbre, c'est une méthode qui sera finalement assez gourmante car tu va exécuter une requête SQL par éléments dans l'arbre.
2. Tu fais une requête SQL avec une CTE qui te permettra de charger l'arbre complet depuis la base de données, en une seule requête. Tu n'auras alors plus qu'à lire le résultat et construire les noeuds du TreeView.
3. Tu fais le travail de la CTE à la main depuis le client : Tu fais une première requête qui te retourne le ou les noeuds racines. Puis une deuxième qui récupère les noeuds qui on pour parent les noeuds racines, puis une troisième pour avoir les noeuds qui ont pour parent les noeuds dont les parents sont les noeuds racines... Tu avances d'un niveau à chaque fois dans la hierarchie. Ca permet de limiter le nombre de requêtes SQL et ainsi que conserver des perfs descentes. Mais si ton SGBD le supporte, le mieux c'est la CTE.
4. Si ton arborescence représente plus ou moins toute la table, tu fais un SELECT complet de la table et tu construits l'arbre progressivement en lisant les lignes une à une.
Justement c'est la 1ere des choses que j'ai chercher et trouver pour stocker l'ID :Envoyé par guillemouze
En effet, la méthode de ShaiLeTroll est intérréssante mais les lignes seront limitée à quelques 200 ou 300 je préfère donc rapatrié toutes les informations.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 CNode:=TreeView1.Items.Add(Cnode,IntToStr(i)); Cnode.Data:=pointer(i);
C'est avec FireBird et je crois qu'il le supporte depuis la version 2.1, je le ferais donc avec la CTE.Envoyé par Franck SORIANO
guillemouze, ShaiLeTroll, Franck SORIANO, vous m'avez donner de trés bonnes pistes merci à vous![]()
Partager