Muchos sistemas tienen una estructura de tabla similar a la siguiente (tabla 1):
IDNombreID del padre
-------------------------------------------------- -------
001 Electrónica0
002 metales 0
003 Electrónica de condensadores001
004 Electrónica de Resistencia001
005 Metales no ferrosos002
Y todo el mundo está acostumbrado a utilizar el árbol (TreeView) para mostrar, de modo que la clasificación de toda la tabla se pueda mostrar bien. Sin embargo, si la cantidad de datos es grande, la generación del árbol será más lenta, especialmente cuando se usa la recursividad para implementarlo, la cantidad de accesos a la base de datos será mucha (dependiendo de la cantidad de capas) y el efecto será mayor. obvio cuando se usa en tres capas. Aquí hay una buena manera de generar una estructura de árbol.
Este algoritmo solo accede a la base de datos una vez. La implementación específica es la siguiente:
1. Obtenga todos los datos de la base de datos a la vez y ordénelos de acuerdo con el campo ParentID, para garantizar que el nodo principal de cada dato esté frente a él.
2. Saque el primer dato y dibújelo en el árbol. Al agregarlo al árbol, primero busque el nodo principal de estos datos. Si no hay un nodo principal, use este registro directamente como el nodo de primer nivel. el árbol.
3. Si todavía hay datos, sáquelos y realice el paso 2 hasta que no queden datos.
Implementación del programa:
Este programa utilizará una variable TStringList de stlID para almacenar el valor de ID de cada nodo en el árbol correspondiente y utilizará la función FindParent para encontrar el nodo principal.
función FindParent(ID:Cadena):TTreeNode;
var
i:Entero;
comenzar
resultado:=nulo;
para i:=TreeView1.Items.Count-1 hasta 0 hacer
si stlID.Strings[i]=ID entonces
comenzar
resultado:=TreeView1.Items[i];
romper;
fin;
fin;
// árbol de expansión
Procedimiento CreateTree;
var
tmpNode:TTreeNode;
comenzar
Consulta1.cerrar;
Query1.SQL.Text:='seleccionar * de la tabla1 ordenar por ParentID';
Consulta1.Abrir;
Consulta1.Primero;
mientras no Query1.Eof lo haga
comenzar
tmpNode:=TreeView1.Items.AddChild(FindParent(Query1.FieldByName('ParentID').AsString),Query1.FieldByName('Name').AsString);
stlID.Add(Query1.FieldByName('ID').AsString);//ID de registro
Consulta1.Siguiente;
fin;
fin;