|
Функции для тривью
Построение тривью по одному рекордсету возвращающему все дерево
Private Sub btree(Tv, idroot As Integer)
Dim nodx As Node
Dim nodetype
Dim rs As New ADODB.Recordset
Dim IdParent
'Рекордсет должен выдавать дерево в отсортрованном порядке сначала родитель затем наследники
rs.Open "SELECT ... as id_parent, ... as ID, ... as НазваниеУзла, ... as ИконкаУзла FROM ... where Id = " & idroot & " order by parentpath ", CurrentProject.Connection, adOpenKeyset, adLockReadOnly
Do Until rs.EOF
IdParent = "id" & rs!id_parent 'Код Родителя этого узла, для корневого null
If rs.AbsolutePosition = 1 Then IdParent = Null 'Первый узел всегда корневой
If IsNull(IdParent) Then nodetype = Null Else nodetype = tvwChild 'Если добавляем корневой элемент то тип Null
Set nodx = Tv.Nodes.add(IdParent, nodetype, "id" & rs!ID, rs!НазваниеУзла , rs!ИконкаУзла)
nodx.EnsureVisible
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
End Sub
Пример использования:
Private Sub Form_Load()
Call btree(Me.TreeView1, 100)
Call btree(Me.TreeView2, 105)
End Sub
Функция установки чекбокса всех дочерних узлов тривью на выбираемое для текущего родительского.
Private Sub CheckChilds(ByVal Node As Object)
Dim ChN
If Node.Children > 0 Then
Set ChN = Node.Child
While ChN.Index <> ChN.LastSibling.Index
ChN.Checked = Node.Checked
If ChN.Children > 0 Then Call CheckChilds(ChN)
Set ChN = ChN.Next
Wend
ChN.LastSibling.Checked = Node.Checked
If ChN.LastSibling.Children > 0 Then Call CheckChilds(ChN.LastSibling)
End If
End Sub
Функция снятия выделения у родительских узлов тривью
Private Sub UnCheckParents(ByVal Node As Object)
If Node.Parent Is Nothing Then Exit Sub
Node.Parent.Checked = False
Call UnCheckParents(Node.Parent)
End Sub
Типовой код вызова:
Private Sub Treeview1_NodeCheck(ByVal Node As Object)
Call CheckChilds(Node)
Call UnCheckParents(Node)
End Sub
Функция возвращающая строку - список ID через запятую Записей рекордсета отмеченных (Checked) на уровне листьев тривью
Private Function LastLevelSelNodesIDtoList(TV As Object)
Dim ListStr
Dim N
For Each N In TV.Nodes
If N.Children = 0 And N.Checked Then
ListStr = ListStr & N.key & ","
End If
Next
ListStr = Replace(ListStr, "id", "", , , vbTextCompare)
If Len(ListStr) <> 0 Then LastLevelSelNodesIDtoList = Left(ListStr, Len(ListStr) - 1)
End Function
Функция Восстанавливающая отметки (Checked) узлов из строки-списка ID:
Private Sub SelectNodeByList(ByRef TV As Object, KeyList)
Dim arr, key, N
arr = Split(KeyList, ",")
For Each key In arr
Set N = TV.Nodes("id" & key)
N.Checked = True
N.EnsureVisible
Next key
End Sub
'Прим: функцию надо запускать из события таймер а затем отключать его:
(при загрузке включить таймер)
Private Sub Form_Timer()
If RaspredTOIdFindepList <> "" Then Call SelectNodeByList(Me.Treeview1, RaspredTOIdFindepList)
Me.TimerInterval = 0
End Sub
Полный Help по работе с контролом тривью находится в файле: CMCTL198.CHM
обычное расположение файла: windows\help\
| |