Proіт access побудова дерева розділів - treeview і vba

Припустимо є таблиця підрозділів вузу (tblDepartment) в форматі:
intID - strDepartmentName - intParentID
де,
intID - ідентифікатор підрозділу,
strDepartmentName - найменування підрозділу,
intParentID - ідентифікатор батьківського підрозділу.

Кореневий елемент буде посилатися в якості "батька" на самого себе.
Також для зручності в конструкторі таблиці в поле батька можна задати підстановку, посилаючись на цю ж таблицю:

Proіт access побудова дерева розділів - treeview і vba


Текст запиту для підстановки:

SELECT tblDepartment. strDepartmentName AS П про дразде л е н ие,

tblDepartment_1. strDepartmentName AS Р про дитя л ь,

FROM tblDepartment LEFTJOIN tblDepartment AS tblDepartment_1

ON tblDepartment. intParentID = tblDepartment_1. intID

ORDERBY tblDepartment. strDepartmentName;

Після цього в колонці батька ми зможемо вибирати не ідентифікатором, а по імені підрозділу (але в колонці буде як і раніше зберігатися ідентифікатор).

У підсумку ми зможемо заповнювати таблицю наступним чином:

Proіт access побудова дерева розділів - treeview і vba


Тепер побудуємо дерево. Для цього створюємо порожню форму в режимі конструктора і виберемо пункт "Елементи ActiveX":

Proіт access побудова дерева розділів - treeview і vba


У списку вибираємо елемент "Microsoft TreeView Control (6.0)"

Proіт access побудова дерева розділів - treeview і vba


Обраний елемент додаємо на форму в потрібному місці потрібного розміру:

Proіт access побудова дерева розділів - treeview і vba


Далі переходимо в режим коду 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

Добрий день. Доріс вже до наповнення дерева по частинах. Оскільки елементів кілька тисяч, то побудова дерева займає відчутний час. Тепер я довантажувати гілку при натисканні на елемент. Питання: як вивести біля елемента значок "+". А то незручно - поки не клікнув, не знаєш є у цього елемента дочірні позиції чи ні

Давно не працювала з цим контролом. Може як варіант виводити у кожного елемента в дужках кількість дочірніх елементів? Або довантажувати до кліка на елементі хоча б один його дочірній елемент?

Спасибі за пораду. Зараз цю проблему так і вирішую, довантажуючи дочірні елементи. Але це не зовсім зручно, враховуючи рекурсивний характер нумерації елементів, який у мене використовується. Хотів трохи полегшити собі життя.

Схожі статті