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

字號(hào):

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