Припустимо є таблиця підрозділів вузу (tblDepartment) в форматі:
intID - strDepartmentName - intParentID
де,
intID - ідентифікатор підрозділу,
strDepartmentName - найменування підрозділу,
intParentID - ідентифікатор батьківського підрозділу.
Кореневий елемент буде посилатися в якості "батька" на самого себе.
Також для зручності в конструкторі таблиці в поле батька можна задати підстановку, посилаючись на цю ж таблицю:
Текст запиту для підстановки:
SELECT tblDepartment. strDepartmentName AS П про дразде л е н ие,
tblDepartment_1. strDepartmentName AS Р про дитя л ь,
FROM tblDepartment LEFTJOIN tblDepartment AS tblDepartment_1
ON tblDepartment. intParentID = tblDepartment_1. intID
ORDERBY tblDepartment. strDepartmentName;
Після цього в колонці батька ми зможемо вибирати не ідентифікатором, а по імені підрозділу (але в колонці буде як і раніше зберігатися ідентифікатор).
У підсумку ми зможемо заповнювати таблицю наступним чином:
Тепер побудуємо дерево. Для цього створюємо порожню форму в режимі конструктора і виберемо пункт "Елементи ActiveX":
У списку вибираємо елемент "Microsoft TreeView Control (6.0)"
Обраний елемент додаємо на форму в потрібному місці потрібного розміру:
Далі переходимо в режим коду Visual Basic і додаємо наступний код:
Option Compare Database
Щоб працювало з node, де батьки null
Option Compare Database
Private Sub Form_Load ()
Dim strRoot
strRoot = ""
Private Sub AddNode (ByVal ParentID As String)
Set rsCommon = New ADODB.Recordset
If ParentID = "" Then
rsCommon.Open "SELECT Êîä, Ðîäèòåëü, Èìÿ FROM Req DP WHERE IsNull (Ðîäèòåëü)" "ORDER BY Èìÿ", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
Do While Not rsCommon.EOF
TreeViewDep.Nodes.Add. Str (rsCommon ( "Êîä")) "$ KEY", rsCommon ( "Èìÿ")
TreeViewDep.Nodes.Item (Str (rsCommon ( "Êîä")) "$ KEY"). Expanded = True
AddNode (Str (rsCommon ( "Êîä")))
rsCommon.MoveNext
Loop
rsCommon.Close
Set rsCommon = Nothing
Else
rsCommon.Open "SELECT Êîä, Ðîäèòåëü, Èìÿ FROM Req DP WHERE Êîä <> Ðîäèòåëü AND Ðîäèòåëü = " ParentID "ORDER BY Èìÿ", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
Do While Not rsCommon.EOF
TreeViewDep.Nodes.Add ParentID "$ KEY", tvwChild, Str (rsCommon ( "Êîä")) "$ KEY", rsCommon ( "Èìÿ")
TreeViewDep.Nodes.Item (Str (rsCommon ( "Êîä")) "$ KEY"). Expanded = True
AddNode (Str (rsCommon ( "Êîä")))
rsCommon.MoveNext
Loop
rsCommon.Close
Set rsCommon = Nothing
End If
Добрий день. Доріс вже до наповнення дерева по частинах. Оскільки елементів кілька тисяч, то побудова дерева займає відчутний час. Тепер я довантажувати гілку при натисканні на елемент. Питання: як вивести біля елемента значок "+". А то незручно - поки не клікнув, не знаєш є у цього елемента дочірні позиції чи ні
Давно не працювала з цим контролом. Може як варіант виводити у кожного елемента в дужках кількість дочірніх елементів? Або довантажувати до кліка на елементі хоча б один його дочірній елемент?
Спасибі за пораду. Зараз цю проблему так і вирішую, довантажуючи дочірні елементи. Але це не зовсім зручно, враховуючи рекурсивний характер нумерації елементів, який у мене використовується. Хотів трохи полегшити собі життя.