會(huì)員登錄 - 用戶(hù)注冊(cè) - 網(wǎng)站地圖 Office中國(guó)(office-cn.net),專(zhuān)業(yè)Office論壇
當(dāng)前位置:主頁(yè) > 技巧 > Access技巧 > ActiveX控件圖表 > 正文

三小時(shí)掌握TREEVIEW控件

時(shí)間:2006-09-16 14:07 來(lái)源:http://bbs.office-cn.net 作者:eddieliu 閱讀:

三小時(shí)掌握TREEVIEW控件

能不能掌握控件的使用,是業(yè)余向準(zhǔn)專(zhuān)業(yè)進(jìn)步的關(guān)鍵。雖然我本人不太喜歡用控件,因?yàn)榛诓煌牟僮鳝h(huán)境成品后效果很難保證。但有些成熟控件,會(huì)使用還是能提高軟件水平。比如TREEVIEW控件,TREEVIEW控件,也叫樹(shù)控件,主要用于層級(jí)顯示和控制,應(yīng)用廣泛。我一直很想學(xué)習(xí)這個(gè)控件的使用,但每次都沒(méi)有學(xué)成,總感覺(jué)很難。前幾天有空,狠下心來(lái)將論壇搜索一遍,發(fā)現(xiàn)也不是太難,在很短時(shí)間內(nèi)只要方法得當(dāng),很快可以掌握,因?yàn)槲沂遣锁B(niǎo),所以用菜鳥(niǎo)的方法和大家交流,可能大家學(xué)得更快一點(diǎn),只要你用心,三個(gè)小時(shí)一定可以掌握。請(qǐng)大家一定要自己動(dòng)手做,只有做才能理解,光看幫助和說(shuō)明是沒(méi)有用的。

熱身:
理解層級(jí)概念,層級(jí)理論上可以有無(wú)限級(jí),一般用到四,五級(jí)也夠用了。最上級(jí)的只能有一個(gè),我們把它叫做“爺”,接下來(lái)是“父”,再是“子”,再是“孫”,接下來(lái)是“曾孫”......,匯總?cè)缦拢骸盃敚,子,孫,曾孫”,這里是5級(jí)關(guān)系,除了“爺”只能有一個(gè)外,其余可以有無(wú)限個(gè)。記住這些,下面要用。


第一小時(shí):學(xué)習(xí)直接用代碼將數(shù)據(jù)填充到樹(shù)控件中。
為什么要先學(xué)習(xí)直接用代碼將數(shù)據(jù)填充到樹(shù)控件中?因?yàn)檫@種方法是最簡(jiǎn)單的,代碼也最容易理解,學(xué)習(xí)樹(shù)控件,先將這個(gè)學(xué)會(huì),已經(jīng)掌握了一半,所以先不要急著想怎么將表中的數(shù)據(jù)填充到樹(shù)控件中,在第一小時(shí)里,樹(shù)控件和表完全沒(méi)有關(guān)系。
目的:我們要在樹(shù)控件中建立如下的一個(gè)3層級(jí)關(guān)系

   水果
    |
    |__蘋(píng)果
    |  |__紅富士
    |  |__國(guó)光
    |
    |__葡萄
       |__紅提子
       |__青提子

解釋?zhuān)核?種,一種是蘋(píng)果,一種是葡萄,蘋(píng)果又包含2種,一種是紅富士,一種是國(guó)光,葡萄也如此。
在這里:“爺”是水果,“父”是蘋(píng)果,葡萄,“子”是紅富士,國(guó)光,紅提子,青提子。概括如下:
爺(只能有一個(gè)):水果
父(這里有2個(gè)):父1:蘋(píng)果;父2:葡萄
子(這里有4個(gè)):子1:紅富士(父1蘋(píng)果的子);子2:國(guó)光(父1蘋(píng)果的子);子3:紅提子(父2葡萄的子);子4:青提子(父2葡萄的子)
      

1、新建一個(gè)窗體,在窗體上放置兩個(gè)控件,一個(gè)是Treeview,一個(gè)是Imagelist
如何找到這兩個(gè)控件?
Treeview控件在“工具箱”的榔頭加扳手圖標(biāo)(其他控件)中選“Microsoft Treeview Control,Version 6.0"
Imagelist控件在“工具箱”的榔頭加扳手圖標(biāo)(其他控件)中選“Microsoft Imagelist Control,Version 6.0"
Treeview控件大家都明白干什么用的,Imagelist控件是干什么用呢?原來(lái)這個(gè)控件是放圖標(biāo)用的,如果你想在樹(shù)控件中顯示圖標(biāo)的,這個(gè)圖標(biāo)都將儲(chǔ)存在ImageList控件中。

2、設(shè)置這兩個(gè)控件的屬性
首先要講清楚控件的屬性設(shè)置有2種,一種是設(shè)置這個(gè)控件在ACCESS中的屬性,比如名稱(chēng)等。一種是設(shè)置這個(gè)控件本身的屬性。要設(shè)置這個(gè)控件在access中的屬性,選中控件后按鼠標(biāo)右鍵選“屬性”就可以了。跟我們平時(shí)設(shè)置文本框什么的一樣。要設(shè)置這個(gè)控件本身的屬性,只要雙擊這個(gè)控件就可以了。
1)設(shè)置Treeview控件在access中的名稱(chēng)屬性,將名稱(chēng)設(shè)置為“Treeview"
2)設(shè)置Imagelist控件在access中的名稱(chēng)屬性,將名稱(chēng)設(shè)置為“Image"
2)設(shè)置Imagelist控件本身的屬性,雙擊控件后,在彈出來(lái)的設(shè)置框中選“Images",單擊“Insert Picture"按鈕,在你電腦中選擇你需要的圖標(biāo)。在“Key:”欄中填入“K1”。其他默認(rèn)設(shè)置不用改。
3)設(shè)置Treeview控件本身的屬性,雙擊控件后,在彈出來(lái)的設(shè)置框中選“General”,在這個(gè)選項(xiàng)面版中有很多項(xiàng)設(shè)置,大多數(shù)是設(shè)置樹(shù)控件的顯示格式,你自己慢慢研究。這里我們將第一項(xiàng)“Style"選7,在第五項(xiàng)“Imagelist"選項(xiàng)中將我們放置的Imagelist控件“Image"選上。這項(xiàng)設(shè)置就將圖標(biāo)和樹(shù)控件聯(lián)系了起來(lái)。

3、寫(xiě)代碼將數(shù)據(jù)填充到樹(shù)控件中
代碼寫(xiě)在哪里?我們希望窗體一打開(kāi),數(shù)據(jù)就自動(dòng)填充在樹(shù)控件中,所以這個(gè)代碼就寫(xiě)在窗體的加載事件中,代碼及解釋如下:

Private Sub Form_Load()
'* -----------------------------------------------------------------
'*用代碼將數(shù)據(jù)填充到樹(shù)控件中
'* -----------------------------------------------------------------
  Dim Nodeindex As Node
'*------------------------------------------------------------------
'*解釋?zhuān)憾xNode
'*Node是樹(shù)控件的對(duì)象
'*每個(gè)Node都有三個(gè)東西,圖標(biāo),文本,索引值
'*圖標(biāo)和文本都是實(shí)際顯示出來(lái)的,索引值是隱含的
'*------------------------------------------------------------------
    '設(shè)置最頂級(jí)的“爺”:
'* ---------------------------
    Set Nodeindex = TreeView.Nodes.Add(, , "爺", "水果", "K1")
    Nodeindex.Sorted = True
'*------------------------------------------------------------------
'*樹(shù)控件填充數(shù)據(jù)的方法是Nodes.Add
'*括號(hào)內(nèi)是Add方法的參數(shù)
'*在這里“爺”是索引值,“水果”是將顯示的文本,“K1”是圖標(biāo)的索引值
'*Sorted是指Node的排序,True就是指采用排序,默認(rèn)是按拼音
'*第一,二個(gè)參數(shù)是空的
'*具體的參數(shù)設(shè)置以后你可以慢慢詳細(xì)研究
'*------------------------------------------------------------------  
    
    '設(shè)置第二級(jí)“父”
'* ---------------------------
   Set Nodeindex = TreeView.Nodes.Add("爺", tvwChild, "父1", "蘋(píng)果", "K1")
   Nodeindex.Sorted = True
    
   Set Nodeindex = TreeView.Nodes.Add("爺", tvwChild, "父2", "葡萄", "K1")
   Nodeindex.Sorted = True
'*------------------------------------------------------------------
'*第一個(gè)參數(shù)“爺”是指這一層對(duì)應(yīng)上層“爺”的
'*tvwChild參數(shù)是規(guī)定格式,指相對(duì)來(lái)說(shuō),這一層是爺?shù)淖訉?BR>'*“父1”是索引值,因?yàn)椤案浮庇?個(gè),而索引值是唯一的,所以要編號(hào),用“父1”“父2”分開(kāi)
'*“蘋(píng)果”“葡萄”是要顯示的文本,K1是顯示圖標(biāo)的索引值
'*現(xiàn)在知道為什么在“爺”層設(shè)置時(shí),第一,第二個(gè)參數(shù)是空的,因?yàn)檫@是最頂層
'*------------------------------------------------------------------
    
    '設(shè)置第三級(jí)“子”
'* ---------------------------
   Set Nodeindex = TreeView.Nodes.Add("父1", tvwChild, "子1", "紅富士", "K1")
   Nodeindex.Sorted = True
    
   Set Nodeindex = TreeView.Nodes.Add("父1", tvwChild, "子2", "國(guó)光", "K1")
   Nodeindex.Sorted = True

   Set Nodeindex = TreeView.Nodes.Add("父2", tvwChild, "子3", "紅提子", "K1")
   Nodeindex.Sorted = True

   Set Nodeindex = TreeView.Nodes.Add("父2", tvwChild, "子4", "青提子", "K1")
   Nodeindex.Sorted = True
'*------------------------------------------------------------------
'*第一個(gè)參數(shù)“父1,2”是指這一層對(duì)應(yīng)上層“父”的,但要注意對(duì)應(yīng)的是“父1”還是“父2”
'*tvwChild參數(shù)是規(guī)定格式,指相對(duì)來(lái)說(shuō),這一層是父的子層
'*“子1”是索引值,因?yàn)椤白印庇?個(gè),而索引值是唯一的,所以要編號(hào),用“1,2,3,4”分開(kāi)
'*“紅富士”等是要顯示的文本,K1是顯示圖標(biāo)的索引值
'*------------------------------------------------------------------
End Sub

就這么多代碼,總共十幾行,就可以在樹(shù)控件中顯示數(shù)據(jù)了,很簡(jiǎn)單吧。第一小時(shí)結(jié)束。

第二小時(shí):學(xué)習(xí)怎樣將樹(shù)控件和數(shù)據(jù)庫(kù)中的數(shù)據(jù)綁起來(lái)
在第一小時(shí)里,我們學(xué)習(xí)了怎樣直接用代碼填充樹(shù)控件,但在實(shí)際使用中,這種方法的應(yīng)用性不大,只有將樹(shù)控件與數(shù)據(jù)庫(kù)中的數(shù)據(jù)結(jié)合起來(lái),才能有真正的應(yīng)用。其實(shí)綁定數(shù)據(jù)庫(kù)的方法和直接用代碼填充是大同小異的,我們要做的只是將Add的參數(shù)里,原來(lái)我們手工輸入的變換一下,讓程序知道去數(shù)據(jù)庫(kù)中找數(shù)據(jù)。

目的:將數(shù)據(jù)庫(kù)中的數(shù)據(jù)與樹(shù)控件綁定
背景:我們想在樹(shù)控件中顯示銷(xiāo)售客戶(hù)的層級(jí)列表,這個(gè)銷(xiāo)售客戶(hù)的分層是這樣的,先按“大區(qū)”,再按“省份”,最后到“客戶(hù)”我們?cè)跀?shù)據(jù)庫(kù)中建立了三個(gè)表,字段如下:
大區(qū)表:大區(qū)ID,大區(qū)名稱(chēng)
省份表:省份ID,省份名稱(chēng),所屬大區(qū)
客戶(hù)表:客戶(hù)ID,客戶(hù)名稱(chēng),所屬省份
這三個(gè)表互相建立了關(guān)系

1、新建一個(gè)窗體,在窗體上放置兩個(gè)控件,一個(gè)是Treeview,一個(gè)是Imagelist
2、設(shè)置這兩個(gè)控件的屬性在這里和第一小時(shí)唯一的區(qū)別是我們?cè)贗magelist控件的設(shè)置時(shí),導(dǎo)入了兩個(gè)圖標(biāo),一個(gè)KEY為K1,一個(gè)為K2,原來(lái)樹(shù)控件的Node圖標(biāo)是可以變化的,我們準(zhǔn)備某個(gè)項(xiàng)沒(méi)有選中時(shí)的圖標(biāo)是一個(gè)沒(méi)有打開(kāi)的文件夾,選中時(shí)是一個(gè)打開(kāi)的文件夾,以區(qū)別。
3、編寫(xiě)代碼,如下:

Private Sub Form_Load()
'* -----------------------------------------------------------------
'* 用數(shù)據(jù)庫(kù)表(查詢(xún)也一樣)中數(shù)據(jù)填充樹(shù)控件
'* -----------------------------------------------------------------
    Dim Rec As New ADODB.Recordset
    Dim stRecQL As String
    Dim Item As Integer
    Dim i As Integer
    Dim nodindex As Node
'* -----------------------------------------------------------------
'* 定義各類(lèi)
'* -----------------------------------------------------------------

    
  
    '設(shè)置最頂級(jí)的"爺"
'* ---------------------------
    Set nodindex = TreeView.Nodes.Add(, , "爺", "銷(xiāo)售客戶(hù)", "K1", "K2")
    nodindex.Sorted = True
'* -----------------------------------------------------------------
'*這里的設(shè)置跟第一小時(shí)里基本是一樣的
'*但最后多了一個(gè)"K2"的參數(shù),"K1"代表的是未被選中時(shí)的圖標(biāo),"K2"代表是被選中后的圖標(biāo)
'*仔細(xì)觀察一下,你會(huì)發(fā)現(xiàn)選中和沒(méi)選中的圖標(biāo)是不一樣的,一個(gè)是一個(gè)文件夾,一個(gè)是一個(gè)打開(kāi)的文件夾
'* -----------------------------------------------------------------
    
    '設(shè)置第二級(jí)"父"
'* ---------------------------
    Rec.Open "大區(qū)表", CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdTableDirect
    For i = 0 To Rec.RecordCount - 1
        Set nodindex = TreeView.Nodes.Add("爺", tvwChild, "父" & Rec.Fields("大區(qū)ID"), Rec.Fields("大區(qū)名稱(chēng)"), "K1", "K2")
        nodindex.Sorted = True
        Rec.MoveNext
    Next
    Rec.Close
'* -----------------------------------------------------------------
'*第一行意思是打開(kāi)一個(gè)表去尋找數(shù)據(jù)(查詢(xún)也是可以的)
'*關(guān)鍵在與Add參數(shù)的變化
'*大家看第三個(gè)參數(shù),在第一小時(shí)里,這里是"父1",這里用Rec.Fields("大區(qū)ID")來(lái)代替"1",意思是用表的編號(hào)來(lái)代替手工編號(hào)
'*第四個(gè)參數(shù)也是一樣,直接用表中的名稱(chēng)字段來(lái)取代原來(lái)我們手工的命名
'* -----------------------------------------------------------------

    '設(shè)置第三級(jí)"子"
'* ---------------------------
   Rec.Open "省份表", CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdTableDirect
    For i = 0 To Rec.RecordCount - 1
        Set nodindex = TreeView.Nodes.Add("父" & Rec.Fields("所屬大區(qū)"), tvwChild, "子" & Rec.Fields("省份ID"), Rec.Fields("省份名稱(chēng)"), "K1", "K2")
        nodindex.Sorted = True
        Rec.MoveNext
    Next
    Rec.Close
'* -----------------------------------------------------------------
'*不用再解釋了吧
'*要注意的是,定義第一個(gè)參數(shù)的時(shí)候,不是用"父" & Rec.Fields("大區(qū)ID"),而是用"父" & Rec.Fields("所屬大區(qū)")
'*這個(gè)意思是:用省份表中關(guān)聯(lián)大區(qū)表的字段,而不是直接用大區(qū)表的ID
'* -----------------------------------------------------------------

    '設(shè)置第四級(jí)"孫"
'* ---------------------------
    
Rec.Open "客戶(hù)表", CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdTableDirect
    For i = 0 To Rec.RecordCount - 1
        Set nodindex = TreeView.Nodes.Add("子" & Rec.Fields("所屬省份"), tvwChild, "孫" & Rec.Fields("客戶(hù)ID"), Rec.Fields("客戶(hù)名稱(chēng)"), "K1", "K2")
        nodindex.Sorted = True
        Rec.MoveNext
    Next
    Rec.Close
    
'* -----------------------------------------------------------------
'*到此你應(yīng)該完全明白了
'* -----------------------------------------------------------------

End Sub

第二小時(shí)結(jié)束

第三小時(shí):將樹(shù)控件與窗體結(jié)合
我們做樹(shù)控件,當(dāng)然不可能單單為了顯示層級(jí)數(shù)據(jù),我們希望跟窗體結(jié)合,當(dāng)我們單擊樹(shù)控件中的某個(gè)客戶(hù)時(shí),窗體上能相應(yīng)的轉(zhuǎn)到這個(gè)客戶(hù)的資料。

目的:將樹(shù)控件與窗體結(jié)合
1、我們還是沿用第二個(gè)小時(shí)里的例子,但在建立窗體時(shí),將窗體的數(shù)據(jù)來(lái)源設(shè)為“客戶(hù)表”,并在窗體中放置好客戶(hù)表的字段。
2、寫(xiě)入如下代碼:

Private Sub Treeview_NodeClick(ByVal Node As Object)
'* -----------------------------------------------------------------
'*樹(shù)控件的鼠標(biāo)點(diǎn)擊事件為NodeClick
'* -----------------------------------------------------------------
Dim str As String
'* -----------------------------------------------------------------
'*定義一個(gè)篩選
'* -----------------------------------------------------------------
If Node.Text = "銷(xiāo)售客戶(hù)" Or Node.Key Like "父*" Or Node.Key Like "子*" Then
str = ""
'* -----------------------------------------------------------------
'*在第一小時(shí)里,我們說(shuō)了Node有三個(gè)東西,圖標(biāo),文本,索引值
'*文本就是text,索引值就是Key
'這里將就是說(shuō)當(dāng)我們點(diǎn)擊"爺","父"或"子"層的時(shí)候,不篩選窗體
'*這個(gè)條件也可寫(xiě)成:If Node.key = "爺" Or Node.Key Like "父*" Or Node.Key Like "子*" Then
'* -----------------------------------------------------------------
Else
str = "[客戶(hù)名稱(chēng)]='" & Node.Text & "'"
End If
Me.Form.FilterOn = True
Me.Form.Filter = str
'*按指定的條件進(jìn)行窗體篩選
End Sub

明白了吧,所謂結(jié)合窗體,實(shí)際不過(guò)是進(jìn)行窗體篩選而已。第三小時(shí)結(jié)束(5分鐘也夠了,哈哈)

學(xué)習(xí)很有樂(lè)趣,但寫(xiě)文章卻很無(wú)聊,如果你通過(guò)這篇文章學(xué)會(huì)了樹(shù)控件的基本使用,跟個(gè)貼吧,也好讓我有點(diǎn)成就感。

請(qǐng)到源碼/作品下載附件

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

頂一下
(1)
100%
踩一下
(0)
0%
上一篇:沒(méi)有了
下一篇:樹(shù)視TreeView的使用技巧
發(fā)表評(píng)論
請(qǐng)自覺(jué)遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動(dòng)的言論。
評(píng)價(jià):