三小時掌握TREEVIEW控件
能不能掌握控件的使用,,是業(yè)余向準專業(yè)進步的關鍵。雖然我本人不太喜歡用控件,,因為基于不同的操作環(huán)境成品后效果很難保證,。但有些成熟控件,會使用還是能提高軟件水平,。比如TREEVIEW控件,,TREEVIEW控件,,也叫樹控件,主要用于層級顯示和控制,,應用廣泛,。我一直很想學習這個控件的使用,但每次都沒有學成,,總感覺很難,。前幾天有空,狠下心來將論壇搜索一遍,,發(fā)現也不是太難,,在很短時間內只要方法得當,很快可以掌握,,因為我是菜鳥,,所以用菜鳥的方法和大家交流,可能大家學得更快一點,,只要你用心,,三個小時一定可以掌握。請大家一定要自己動手做,,只有做才能理解,,光看幫助和說明是沒有用的。
熱身: 理解層級概念,,層級理論上可以有無限級,,一般用到四,五級也夠用了,。最上級的只能有一個,,我們把它叫做“爺”,接下來是“父”,,再是“子”,,再是“孫”,接下來是“曾孫”......,,匯總如下:“爺,,父,子,,孫,,曾孫”,這里是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參數是規(guī)定格式,指相對來說,,這一層是爺的子層 '*“父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參數是規(guī)定格式,指相對來說,,這一層是父的子層 '*“子1”是索引值,,因為“子”有4個,而索引值是唯一的,,所以要編號,,用“1,2,,3,,4”分開 '*“紅富士”等是要顯示的文本,K1是顯示圖標的索引值 '*------------------------------------------------------------------ End Sub
就這么多代碼,,總共十幾行,,就可以在樹控件中顯示數據了,很簡單吧,。第一小時結束,。
第二小時:學習怎樣將樹控件和數據庫中的數據綁起來 在第一小時里,,我們學習了怎樣直接用代碼填充樹控件,,但在實際使用中,這種方法的應用性不大,,只有將樹控件與數據庫中的數據結合起來,,才能有真正的應用。其實綁定數據庫的方法和直接用代碼填充是大同小異的,,我們要做的只是將Add的參數里,,原來我們手工輸入的變換一下,讓程序知道去數據庫中找數據,。
目的:將數據庫中的數據與樹控件綁定 背景:我們想在樹控件中顯示銷售客戶的層級列表,,這個銷售客戶的分層是這樣的,,先按“大區(qū)”,再按“省份”,,最后到“客戶”我們在數據庫中建立了三個表,,字段如下: 大區(qū)表:大區(qū)ID,大區(qū)名稱 省份表:省份ID,,省份名稱,,所屬大區(qū) 客戶表:客戶ID,客戶名稱,,所屬省份 這三個表互相建立了關系
1,、新建一個窗體,在窗體上放置兩個控件,,一個是Treeview,,一個是Imagelist 2、設置這兩個控件的屬性在這里和第一小時唯一的區(qū)別是我們在Imagelist控件的設置時,,導入了兩個圖標,,一個KEY為K1,一個為K2,,原來樹控件的Node圖標是可以變化的,,我們準備某個項沒有選中時的圖標是一個沒有打開的文件夾,選中時是一個打開的文件夾,,以區(qū)別,。 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"代表是被選中后的圖標 '*仔細觀察一下,你會發(fā)現選中和沒選中的圖標是不一樣的,一個是一個文件夾,一個是一個打開的文件夾 '* ----------------------------------------------------------------- '設置第二級"父" '* --------------------------- 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ū)名稱"), "K1", "K2") nodindex.Sorted = True Rec.MoveNext Next Rec.Close '* ----------------------------------------------------------------- '*第一行意思是打開一個表去尋找數據(查詢也是可以的) '*關鍵在與Add參數的變化 '*大家看第三個參數,在第一小時里,這里是"父1",這里用Rec.Fields("大區(qū)ID")來代替"1",意思是用表的編號來代替手工編號 '*第四個參數也是一樣,直接用表中的名稱字段來取代原來我們手工的命名 '* -----------------------------------------------------------------
'設置第三級"子" '* --------------------------- 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("省份名稱"), "K1", "K2") nodindex.Sorted = True Rec.MoveNext Next Rec.Close '* ----------------------------------------------------------------- '*不用再解釋了吧 '*要注意的是,定義第一個參數的時候,不是用"父" & Rec.Fields("大區(qū)ID"),而是用"父" & Rec.Fields("所屬大區(qū)") '*這個意思是:用省份表中關聯大區(qū)表的字段,而不是直接用大區(qū)表的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分鐘也夠了,哈哈)
|