De nombreux systèmes ont une structure de table similaire à la suivante (tableau 1) :
IDNameParentID
-------------------------------------------------- -------
001 Electronique0
002 Métal 0
003 Électronique de condensateur001
004 Électronique de résistance001
005 Métaux non ferreux002
Et tout le monde est habitué à utiliser l'arborescence (TreeView) pour afficher, afin que la classification de l'ensemble du tableau puisse être bien affichée. Cependant, si la quantité de données est importante, la génération de l'arborescence sera plus lente, notamment lors de l'utilisation de la récursivité pour l'implémenter, le nombre d'accès à la base de données sera important (en fonction du nombre de couches), et l'effet sera plus important. évident lorsqu'il est utilisé en trois couches. Voici un bon moyen de générer une arborescence.
Cet algorithme n'accède à la base de données qu'une seule fois. L'implémentation spécifique est la suivante :
1. Récupérez toutes les données de la base de données en une seule fois et triez-les en fonction du champ ParentID, afin de vous assurer que le nœud parent de chaque élément de données se trouve devant lui.
2. Retirez la première donnée et dessinez-la dans l'arborescence. Lorsque vous l'ajoutez à l'arborescence, recherchez d'abord le nœud parent de ces données. S'il n'y a pas de nœud parent, utilisez cet enregistrement directement comme nœud de premier niveau. l'arbre.
3. S'il y a encore des données, supprimez-les et effectuez l'étape 2 jusqu'à ce qu'il n'y ait plus de données.
Mise en œuvre du programme :
Ce programme utilisera une variable TStringList de stlID pour stocker la valeur ID de chaque nœud dans l'arborescence correspondante et utilisera la fonction FindParent pour trouver le nœud parent.
fonction FindParent(ID:String):TTreeNode;
var
je:Entier;
commencer
résultat :=nul ;
pour i:=TreeView1.Items.Count-1 jusqu'à 0 faire
si stlID.Strings[i]=ID alors
commencer
résultat :=TreeView1.Items[i] ;
casser;
fin;
fin;
// Arbre couvrant
PROcédure CreateTree ;
var
tmpNode:TTreeNode;
commencer
Requête1.close ;
Query1.SQL.Text:='select * from table1 order by ParentID';
Requête1.Open ;
Requête1.Premier ;
alors que ce n'est pas Query1.Eof
commencer
tmpNode:=TreeView1.Items.AddChild(FindParent(Query1.FieldByName('ParentID').AsString),Query1.FieldByName('Name').AsString);
stlID.Add(Query1.FieldByName('ID').AsString);//ID d'enregistrement
Requête1.Suivant ;
fin;
fin;