問(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)和收縮功能。
在對(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)和收縮功能。

