Многие системы имеют структуру таблиц, подобную следующей (таблица1):
IDName РодительскийID
-------------------------------------------------- -------
001 Электроника0
002 Металл 0
003 Конденсаторная электроника001
004 Сопротивление электроники001
005 Цветные металлы002
И все привыкли использовать дерево (TreeView) для отображения, чтобы можно было хорошо отобразить классификацию всей таблицы. Однако если объем данных велик, генерация дерева будет медленнее, особенно при использовании рекурсии для его реализации, количество обращений к базе данных будет большим (в зависимости от количества слоев), и эффект будет больше. очевидно при использовании в три слоя. Вот хороший способ создать древовидную структуру.
Этот алгоритм обращается к базе данных только один раз. Конкретная реализация следующая:
1. Получите все данные из базы данных одновременно и отсортируйте их по полю ParentID, чтобы гарантировать, что родительский узел каждого фрагмента данных находится перед ним.
2. Выньте первый фрагмент данных и нарисуйте его в дереве. При добавлении его в дерево сначала найдите родительский узел этих данных. Если родительского узла нет, используйте эту запись непосредственно как узел первого уровня. дерево.
3. Если данные еще есть, выньте их и выполняйте шаг 2, пока данных не будет.
Реализация программы:
Эта программа будет использовать переменную TStringList stlID для хранения значения идентификатора каждого узла в соответствующем дереве и использовать функцию FindParent для поиска родительского узла.
функция FindParent(ID:String):TTreeNode;
вар
я: целое число;
начинать
результат: = ноль;
для i:=TreeView1.Items.Count-1 до 0 сделать
если stlID.Strings[i]=ID, то
начинать
результат:=TreeView1.Items[i];
перерыв;
конец;
конец;
// Связующее дерево
ПРОЦЕДУРА CreateTree;
вар
tmpNode:TTreeNode;
начинать
Запрос1.закрыть;
Query1.SQL.Text:='выбрать * из таблицы1 в порядке ParentID';
Запрос1.Открыть;
Запрос1.Первый;
пока не Query1.Eof сделать
начинать
tmpNode:=TreeView1.Items.AddChild(FindParent(Query1.FieldByName('ParentID').AsString),Query1.FieldByName('Name').AsString);
stlID.Add(Query1.FieldByName('ID').AsString);//Идентификатор записи
Запрос1.Далее;
конец;
конец;