Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > access древовидный список


Автор: Neivin 18.3.2010, 09:48
Скачала из инета пример с древовидным списокм, под свою базу я его без проблем переделала, но хотелось бы еще и понять как он работает. Можете помочь? очень надо в пятницу предзащита.. была бы вам очень благодарна ))

Целиком базочку тоже прикрепила

Option Compare Database
Option Explicit

Dim tab_1 As String, Kod_1 As String, Name_1 As String
Dim tab_2 As String, Kod_2 As String, Name_2 As String
Dim tab_3 As String, Kod_3 As String, Name_3 As String
Dim tab_4 As String, Kod_4 As String

Private Sub Form_Load()
    '   îáúÿâëÿåì êîíñòàíòû. Çäåñü íóæíî ïðîñòî ïðîïèñàòü èìåíà Âàøèõ òàáëèö è ïîëåé
    '   ó÷àñòâóþùèõ â çàïðîñå
    tab_1 = "tab_1"
    Kod_1 = "Kod_1"
    Name_1 = "Name_1"
    tab_2 = "tab_2"
    Kod_2 = "Kod_2"
    Name_2 = "Name_2"
    tab_3 = "tab_3"
    Kod_3 = "Kod_3"
    Name_3 = "Name_3"
    tab_4 = "tab_4"
    Kod_4 = "Kod_4"
    lst_TList.RowSource = "SELECT Kod_1 AS Kod, 'Level_1_' AS Levels, ('' & ChrW(9658) & ' ' & Name_1) AS NameL FROM tab_1"
    lst_TList.Selected(0) = True
End Sub

Sub LoadLevels()
Dim kod As Long
Dim Kod_2 As Long
kod = lst_TList
    Select Case lst_TList.Column(1, lst_TList.ListIndex)
        Case "Level_1_back"
            lst_TList.RowSource = "SELECT Kod_1 AS Kod, 'Level_1_'     AS Levels, ('' & ChrW(9658) & ' ' & Name_1)   AS NameL FROM tab_1"
        Case "Level_1_", "Level_2_back"
            If lst_TList.Column(1, lst_TList.ListIndex) = "Level_2_back" Then
                kod = lst_TList.Column(0, 0)
            End If
            lst_TList.RowSource = "SELECT Kod_1 AS Kod, 'Level_1_back' AS Levels, ('' & ChrW(9660) & ' ' & Name_1)   AS NameL FROM tab_1 WHERE (Kod_1=" & kod & ") " & _
                "UNION             SELECT Kod_2 AS Kod, 'Level_2_'     AS Levels, ('  ' & ChrW(9658) & ' ' & Name_2) AS NameL FROM tab_2 INNER JOIN tab_1 ON tab_2.Kod_1 = tab_1.Kod_1 WHERE (tab_2.Kod_1=" & kod & ") ORDER BY Levels, NameL;"
        Case "Level_2_"
            Kod_2 = lst_TList.Column(0, 0)
            lst_TList.RowSource = "SELECT Kod_1 AS Kod, 'Level_1_back' AS Levels, ('' & ChrW(9660) & ' ' & Name_1)   AS NameL FROM tab_1 WHERE (Kod_1=" & Kod_2 & ") " & _
                "UNION             SELECT Kod_2 AS Kod, 'Level_2_back' AS Levels, ('  ' & ChrW(9660) & ' ' & Name_2) AS NameL FROM tab_2 WHERE (Kod_2=" & kod & ") ORDER BY NameL " & _
                "UNION             SELECT Kod_3 AS Kod, 'Level_3_'     AS Levels, ('       - ' & Name_3)             AS NameL FROM tab_3 INNER JOIN tab_2 ON tab_3.Kod_2 = tab_2.Kod_2 WHERE (tab_3.Kod_2=" & kod & ") ORDER BY Levels, NameL;"
    End Select
End Sub

Private Sub lst_TList_KeyDown(KeyCode As Integer, Shift As Integer)
Dim LvlNum As Integer, Lvl As String

    Lvl = Nz(lst_TList.Column(1, lst_TList.ListIndex), "")
    If Lvl = "" Then
        LvlNum = 1
      Else
        LvlNum = Val(Split(Lvl, "_")(1))
    End If

    Select Case KeyCode
        Case vbKeyReturn
            'Îòêðûâàåì/çàêðûâàåì ïîäâåòêó
            Call LoadLevels
        Case vbKeyBack
            'Çàêðûâàåì ïîäâåòêó
            lst_TList.Selected(NumRow(LvlNum)) = True
            Call LoadLevels
        Case vbKeyLeft
            If Split(Lvl, "_")(2) = "back" Then
                'Çàêðûâàåì âåòêó
                Call LoadLevels
              Else
                'Óñòàíàâëèâàåì êóðñîð íà ðîäèòåëüñêóþ âåòêó
                LvlNum = NumRow(LvlNum)
                lst_TList.Selected(LvlNum) = True
            End If
        Case vbKeyRight
            If Split(Lvl, "_")(2) = "back" Then
                If lst_TList.ListCount > LvlNum Then
                    'Ïåðåõîä íà ïîäâåòêó
                    lst_TList.Selected(LvlNum) = True
                End If
              Else
                'Îòêðûâàåì ïîäâåòêó
                Call LoadLevels
            End If
        Case vbKeyHome
            'Óñòàíàâëèâàåì êóðñîð íà ïåðâóþ âåòêó
            lst_TList.Selected(0) = True
        Case vbKeyEnd
            'Óñòàíàâëèâàåì êóðñîð íà ïîñëåäíþþ âåòêó
            lst_TList.Selected(lst_TList.ListCount - 1) = True
    End Select
End Sub

Private Function NumRow(ByVal LvlNum As Integer) As Integer
    If LvlNum > 1 Then
        Do
            If lst_TList.Column(1, NumRow) = "Level_" & LvlNum - 1 & "_back" Then
                Exit Do
            End If
            NumRow = NumRow + 1
        Loop
    End If
End Function

Private Sub lst_TList_DblClick(Cancel As Integer)
    Call LoadLevels
End Sub

Private Sub lst_TList_AfterUpdate()
    If Nz(lst_TList.Column(1, lst_TList.ListIndex), "") = "Level_3_" Then
        frm_subForm.Form.RecordSource = "SELECT * FROM tab_4 WHERE (Kod_3=" & lst_TList & ");"
        frm_subForm.Form.RecordsetType = 0
      Else
        If frm_subForm.Form.RecordsetType = 0 Then
            frm_subForm.Form.RecordSource = "SELECT * FROM tab_4 WHERE (0=1)"
            frm_subForm.Form.RecordsetType = 2
        End If
    End If
End Sub

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)