1. 程式人生 > >三小時學會 VB6.0 應運程式 TreeView控制元件的使用

三小時學會 VB6.0 應運程式 TreeView控制元件的使用

能不能掌握控制元件的使用,是業餘向準專業進步的關鍵。雖然我本人不太喜歡用控制元件,因為基於不同的操作環境成品後效果很難保證。但有些成熟控制元件,會使用還是能提高軟體水平。比如TREEVIEW控制元件,TREEVIEW控制元件,也叫樹控制元件,主要用於層級顯示和控制,應用廣泛。我一直很想學習這個控制元件的使用,但每次都沒有學成,總感覺很難。前幾天有空,狠下心來將論壇搜尋一遍,發現也不是太難,在很短時間內只要方法得當,很快可以掌握,因為我是菜鳥,所以用菜鳥的方法和大家交流,可能大家學得更快一點,只要你用心,三個小時一定可以掌握。請大家一定要自己動手做,只有做才能理解,光看幫助和說明是沒有用的。

熱身:
理解層級概念,層級理論上可以有無限級,一般用到四,五級也夠用了。最上級的只能有一個,我們把它叫做“爺”,接下來是“父”,再是“子”,再是“孫”,接下來是“曾孫”......,彙總如下:“爺,父,子,孫,曾孫”,這裡是5級關係,除了“爺”只能有一個外,其餘可以有無限個。記住這些,下面要用。


第一小時:學習直接用程式碼將資料填充到樹控制元件中。
為什麼要先學習直接用程式碼將資料填充到樹控制元件中?因為這種方法是最簡單的,程式碼也最容易理解,學習樹控制元件,先將這個學會,已經掌握了一半,所以先不要急著想怎麼將表中的資料填充到樹控制元件中,在第一小時裡,樹控制元件和表完全沒有關係。
目的:我們要在樹控制元件中建立如下的一個3層級關係

   水果
    |
    |__蘋果
    |  |__紅富士
    |  |__國光
    |
    |__葡萄
       |__紅提子
       |__青提子

解釋:水果包含2種,一種是蘋果,一種是葡萄,蘋果又包含2種,一種是紅富士,一種是國光,葡萄也如此。
在這裡:“爺”是水果,“父”是蘋果,葡萄,“子”是紅富士,國光,紅提子,青提子。概括如下:
爺(只能有一個):水果
父(這裡有2個):父1:蘋果;父2:葡萄
子(這裡有4個):子1:紅富士(父1蘋果的子);子2:國光(父1蘋果的子);子3:紅提子(父2葡萄的子);子4:青提子(父2葡萄的子)
      

1、新建一個窗體,在窗體上放置兩個控制元件,一個是Treeview,一個是Imagelist
如何找到這兩個控制元件?
Treeview控制元件在“工具箱”的榔頭加扳手圖示(其他控制元件)中選“Microsoft Treeview Control,Version 6.0"
Imagelist控制元件在“工具箱”的榔頭加扳手圖示(其他控制元件)中選“Microsoft Imagelist Control,Version 6.0"
Treeview控制元件大家都明白乾什麼用的,Imagelist控制元件是幹什麼用呢?原來這個控制元件是放圖示用的,如果你想在樹控制元件中顯示圖示的,這個圖示都將儲存在ImageList控制元件中。

2、設定這兩個控制元件的屬性
首先要講清楚控制元件的屬性設定有2種,一種是設定這個控制元件在ACCESS中的屬性,比如名稱等。一種是設定這個控制元件本身的屬性。要設定這個控制元件在ACCESS中的屬性,選中控制元件後按滑鼠右鍵選“屬性”就可以了。跟我們平時設定文字框什麼的一樣。要設定這個控制元件本身的屬性,只要雙擊這個控制元件就可以了。
1)設定Treeview控制元件在ACCESS中的名稱屬性,將名稱設定為“Treeview"
2)設定Imagelist控制元件在ACCESS中的名稱屬性,將名稱設定為“Image"
2)設定Imagelist控制元件本身的屬性,雙擊控制元件後,在彈出來的設定框中選“Images",單擊“Insert Picture"按鈕,在你電腦中選擇你需要的圖示。在“Key:”欄中填入“K1”。其他預設設定不用改。
3)設定Treeview控制元件本身的屬性,雙擊控制元件後,在彈出來的設定框中選“General”,在這個選項面版中有很多項設定,大多數是設定樹控制元件的顯示格式,你自己慢慢研究。這裡我們將第一項“Style"選7,在第五項“Imagelist"選項中將我們放置的Imagelist控制元件“Image"選上。這項設定就將圖示和樹控制元件聯絡了起來。

3、寫程式碼將資料填充到樹控制元件中
程式碼寫在哪裡?我們希望窗體一開啟,資料就自動填充在樹控制元件中,所以這個程式碼就寫在窗體的載入事件中,程式碼及解釋如下:

Private Sub Form_Load()
'* -----------------------------------------------------------------
'*用程式碼將資料填充到樹控制元件中
'* -----------------------------------------------------------------
  Dim Nodeindex As Node
'*------------------------------------------------------------------
'*解釋:定義Node
'*Node是樹控制元件的物件
'*每個Node都有三個東西,圖示,文字,索引值
'*圖示和文字都是實際顯示出來的,索引值是隱含的
'*------------------------------------------------------------------
    '設定最頂級的“爺”:
'* ---------------------------
    Set Nodeindex = TreeView.Nodes.Add(, , "爺", "水果", "K1")
    Nodeindex.Sorted = True
'*------------------------------------------------------------------
'*樹控制元件填充資料的方法是Nodes.Add
'*括號內是Add方法的引數
'*在這裡“爺”是索引值,“水果”是將顯示的文字,“K1”是圖示的索引值
'*Sorted是指Node的排序,True就是指採用排序,預設是按拼音
'*第一,二個引數是空的
'*具體的引數設定以後你可以慢慢詳細研究
'*------------------------------------------------------------------   
    

    '設定第二級“父”
'* ---------------------------
   Set Nodeindex = TreeView.Nodes.Add("爺", tvwChild, "父1", "蘋果", "K1")
   Nodeindex.Sorted = True
    
   Set Nodeindex = TreeView.Nodes.Add("爺", tvwChild, "父2", "葡萄", "K1")
   Nodeindex.Sorted = True
'*------------------------------------------------------------------
'*第一個引數“爺”是指這一層對應上層“爺”的
'*tvwChild引數是規定格式,指相對來說,這一層是爺的子層
'*“父1”是索引值,因為“父”有2個,而索引值是唯一的,所以要編號,用“父1”“父2”分開
'*“蘋果”“葡萄”是要顯示的文字,K1是顯示圖示的索引值
'*現在知道為什麼在“爺”層設定時,第一,第二個引數是空的,因為這是最頂層
'*------------------------------------------------------------------
    
    '設定第三級“子”
'* ---------------------------
   Set Nodeindex = TreeView.Nodes.Add("父1", tvwChild, "子1", "紅富士", "K1")
   Nodeindex.Sorted = True
    
   Set Nodeindex = TreeView.Nodes.Add("父1", tvwChild, "子2", "國光", "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
'*------------------------------------------------------------------
'*第一個引數“父1,2”是指這一層對應上層“父”的,但要注意對應的是“父1”還是“父2”
'*tvwChild引數是規定格式,指相對來說,這一層是父的子層
'*“子1”是索引值,因為“子”有4個,而索引值是唯一的,所以要編號,用“1,2,3,4”分開
'*“紅富士”等是要顯示的文字,K1是顯示圖示的索引值
'*------------------------------------------------------------------
End Sub

就這麼多程式碼,總共十幾行,就可以在樹控制元件中顯示資料了,很簡單吧。第一小時結束。

第二小時:學習怎樣將樹控制元件和資料庫中的資料綁起來
在第一小時裡,我們學習了怎樣直接用程式碼填充樹控制元件,但在實際使用中,這種方法的應用性不大,只有將樹控制元件與資料庫中的資料結合起來,才能有真正的應用。其實繫結資料庫的方法和直接用程式碼填充是大同小異的,我們要做的只是將Add的引數裡,原來我們手工輸入的變換一下,讓程式知道去資料庫中找資料。

目的:將資料庫中的資料與樹控制元件繫結
背景:我們想在樹控制元件中顯示銷售客戶的層級列表,這個銷售客戶的分層是這樣的,先按“大區”,再按“省份”,最後到“客戶”我們在資料庫中建立了三個表,欄位如下:
大區表:大區ID,大區名稱
省份表:省份ID,省份名稱,所屬大區
客戶表:客戶ID,客戶名稱,所屬省份
這三個表互相建立了關係

1、新建一個窗體,在窗體上放置兩個控制元件,一個是Treeview,一個是Imagelist
2、設定這兩個控制元件的屬性在這裡和第一小時唯一的區別是我們在Imagelist控制元件的設定時,匯入了兩個圖示,一個KEY為K1,一個為K2,原來樹控制元件的Node圖示是可以變化的,我們準備某個項沒有選中時的圖示是一個沒有開啟的資料夾,選中時是一個開啟的資料夾,以區別。
3、編寫程式碼,如下:

Private Sub Form_Load()
'* -----------------------------------------------------------------
'* 用資料庫表(查詢也一樣)中資料填充樹控制元件
'* -----------------------------------------------------------------
    Dim Rec As New ADODB.Recordset
    Dim stRecQL As String
    Dim Item As Integer
    Dim i As Integer
    Dim nodindex As Node
'* -----------------------------------------------------------------
'* 定義各類
'* ----------------------------------------------------------------- 
   
    '設定最頂級的"爺"
'* ---------------------------
    Set nodindex = TreeView.Nodes.Add(, , "爺", "銷售客戶", "K1", "K2")
    nodindex.Sorted = True
'* -----------------------------------------------------------------
'*這裡的設定跟第一小時裡基本是一樣的
'*但最後多了一個"K2"的引數,"K1"代表的是未被選中時的圖示,"K2"代表是被選中後的圖示
'*仔細觀察一下,你會發現選中和沒選中的圖示是不一樣的,一個是一個資料夾,一個是一個開啟的資料夾
'* -----------------------------------------------------------------
    
    '設定第二級"父"
'* ---------------------------
    Rec.Open "大區表", CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdTableDirect
    For i = 0 To Rec.RecordCount - 1
        Set nodindex = TreeView.Nodes.Add("爺", tvwChild, "父" & Rec.Fields("大區ID"), Rec.Fields("大區名稱"), "K1", "K2")
        nodindex.Sorted = True
        Rec.MoveNext
    Next
    Rec.Close
'* -----------------------------------------------------------------
'*第一行意思是開啟一個表去尋找資料(查詢也是可以的)
'*關鍵在與Add引數的變化
'*大家看第三個引數,在第一小時裡,這裡是"父1",這裡用Rec.Fields("大區ID")來代替"1",意思是用表的編號來代替手工編號
'*第四個引數也是一樣,直接用表中的名稱欄位來取代原來我們手工的命名
'* -----------------------------------------------------------------

    '設定第三級"子"
'* ---------------------------
   Rec.Open "省份表", CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdTableDirect
    For i = 0 To Rec.RecordCount - 1
        Set nodindex = TreeView.Nodes.Add("父" & Rec.Fields("所屬大區"), tvwChild, "子" & Rec.Fields("省份ID"), Rec.Fields("省份名稱"), "K1", "K2")
        nodindex.Sorted = True
        Rec.MoveNext
    Next
    Rec.Close
'* -----------------------------------------------------------------
'*不用再解釋了吧
'*要注意的是,定義第一個引數的時候,不是用"父" & Rec.Fields("大區ID"),而是用"父" & Rec.Fields("所屬大區")
'*這個意思是:用省份表中關聯大區表的欄位,而不是直接用大區表的ID
'* -----------------------------------------------------------------

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

End Sub

第二小時結束

第三小時:將樹控制元件與窗體結合
我們做樹控制元件,當然不可能單單為了顯示層級資料,我們希望跟窗體結合,當我們單擊樹控制元件中的某個客戶時,窗體上能相應的轉到這個客戶的資料。

目的:將樹控制元件與窗體結合
1、我們還是沿用第二個小時裡的例子,但在建立窗體時,將窗體的資料來源設為“客戶表”,並在窗體中放置好客戶表的欄位。
2、寫入如下程式碼:

Private Sub Treeview_NodeClick(ByVal Node As Object)
'* -----------------------------------------------------------------
'*樹控制元件的滑鼠點選事件為NodeClick
'* -----------------------------------------------------------------
Dim str As String
'* -----------------------------------------------------------------
'*定義一個篩選
'* -----------------------------------------------------------------
If Node.Text = "銷售客戶" Or Node.Key Like "父*" Or Node.Key Like "子*" Then
str = ""
'* -----------------------------------------------------------------
'*在第一小時裡,我們說了Node有三個東西,圖示,文字,索引值
'*文字就是text,索引值就是Key
'這裡將就是說當我們點選"爺","父"或"子"層的時候,不篩選窗體
'*這個條件也可寫成:If Node.key = "爺" Or Node.Key Like "父*" Or Node.Key Like "子*" Then
'* -----------------------------------------------------------------
Else
str = "[客戶名稱]='" & Node.Text & "'"
End If
Me.Form.FilterOn = True
Me.Form.Filter = str
'*按指定的條件進行窗體篩選
End Sub

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

學習很有樂趣,但寫文章卻很無聊,如果你通過這篇文章學會了樹控制元件的基本使用,跟個貼吧,也好讓我有點成就感