會員登錄 - 用戶注冊 - 網(wǎng)站地圖 Office中國(office-cn.net),專業(yè)Office論壇
當(dāng)前位置:主頁 > 技巧 > Access技巧 > 窗體控件 > 正文

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

時間:2005-02-09 10:39 來源:Access專家門診200問 作者:tmtony『… 閱讀:

問題詳述

在對產(chǎn)品或客戶進(jì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é)果,詳細(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)建一個查詢,查詢中使用了上面這個自定義函數(shù)進(jìn)行數(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)的組合框和列表框的效果,如圖4-30所示。

4-30  帶樹形結(jié)構(gòu)的組合框和列表框

專家點評

這個例子從查詢上實現(xiàn)了樹形結(jié)構(gòu),但在組合框和列表框的實現(xiàn)上還并不完全具備Treeview的所有屬性,如雙擊結(jié)點進(jìn)行展開和收縮、結(jié)點圖標(biāo)等。如果要實現(xiàn)展開和收縮功能,需要對組合框和列表框再進(jìn)行編程,判斷當(dāng)前選擇的項目是子結(jié)點還是父結(jié)點,然后相應(yīng)改變組合框和列表框行來源對應(yīng)的查詢的內(nèi)容,再刷新組合框和列表框來實現(xiàn)結(jié)點的展開和收縮功能。

(責(zé)任編輯:admin)

頂一下
(0)
0%
踩一下
(0)
0%
發(fā)表評論
請自覺遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動的言論。
評價: