如何實現(xiàn)帶樹形結(jié)構(gòu)的組合框和列表框

字號:

問題詳述
    在對產(chǎn)品或客戶進行分類時,類別需要多層分類結(jié)構(gòu),也就是常見的樹形結(jié)構(gòu),但access的組合框和列表框都不支持樹形結(jié)構(gòu),只能通過Treeview這個ActiveX控件來實現(xiàn),不知有沒有方法能夠在組合框和列表框中實現(xiàn)樹形結(jié)構(gòu)呢?
    專家解答
    組合框和列表框的行來源屬性可為表或查詢,由于組合框和列表框本身的限制,無法直接實現(xiàn)樹形結(jié)構(gòu),所以只能在行來源屬性上想辦法。創(chuàng)建一個查詢,然后通過函數(shù)來將數(shù)據(jù)的內(nèi)容轉(zhuǎn)換成樹形結(jié)構(gòu)的格式,由于組合框和列表框的數(shù)據(jù)來源于查詢,所以就間接地實現(xiàn)了帶樹形結(jié)構(gòu)的組合框和列表框。
    首先創(chuàng)建一個通用函數(shù),用來實現(xiàn)樹形結(jié)構(gòu)的查詢結(jié)果,詳細代碼如下。
    Public Function GetNodeText(rlngDepth As Long, rlngNextId As Long, rstrClassName As String) As String
    Dim sqlClass As String
    Dim strTemp As String
    Dim tmpDepth As Integer
    Dim i As Integer
    Dim arrShowLine(20) As Boolean
    For i = 0 To UBound(arrShowLine)
    arrShowLine(i) = False
    Next
    tmpDepth = rlngDepth
    If rlngNextId > 0 Then
    arrShowLine(tmpDepth) = True
    Else
    arrShowLine(tmpDepth) = False
    End If
    strTemp = ""
    If tmpDepth = 2 Then
    End If
    If tmpDepth > 0 Then
    For i = 1 To tmpDepth
    strTemp = strTemp & " "
    If i = tmpDepth Then
    If rlngNextId > 0 Then
    strTemp = strTemp & "├ "
    Else
    strTemp = strTemp & "└ "
    End If
    Else
    If i = 1 Then
    strTemp = strTemp & "│"
    Else
    strTemp = strTemp & " "
    End If
    End If
    Next
    End If
    GetNodeText = strTemp & rstrClassName
    End Function
    然后創(chuàng)建一個查詢,查詢中使用了上面這個自定義函數(shù)進行數(shù)據(jù)格式轉(zhuǎn)換,查詢的語法如下。
    SELECT GetNodeText([depth],[NextId],[classname]) AS NodeText, *
    FROM SoftClass
    ORDER BY SoftClass.RootID, SoftClass.OrderID;
    最后創(chuàng)建一個新的窗體,在窗體上放置一個組合框及列表框,它們的行來源都設(shè)置如下。
    SELECT qryClass.NodeText, qryClass.ClassID FROM qryClass;
    打開窗體到“窗體視圖”狀態(tài),可看到帶樹形結(jié)構(gòu)的組合框和列表框的效果。
    專家點評
    這個例子從查詢上實現(xiàn)了樹形結(jié)構(gòu),但在組合框和列表框的實現(xiàn)上還并不完全具備Treeview的所有屬性,如雙擊結(jié)點進行展開和收縮、結(jié)點圖標(biāo)等。如果要實現(xiàn)展開和收縮功能,需要對組合框和列表框再進行編程,判斷當(dāng)前選擇的項目是子結(jié)點還是父結(jié)點,然后相應(yīng)改變組合框和列表框行來源對應(yīng)的查詢的內(nèi)容,再刷新組合框和列表框來實現(xiàn)結(jié)點的展開和收縮功能。