樹形目錄控件——TreeView控件介紹 分類:ExcelVBA>>控件的使用>>TreeView控件 1 添加TreeView控件 在“控件工具箱”中單擊鼠標(biāo)右鍵,,從彈出的快捷菜單中選擇“附加控件”(如圖1所示),出現(xiàn)“附加控件”對(duì)話框,。在該對(duì)話框中,,找到“Microsoft TreeView Control,version 6.0”并選中前面的復(fù)選框,如圖2所示,,單擊“確定”按鈕,。 圖1:在工具箱中單擊右鍵,選擇“附加控件”,。 圖2:在“附加控件”對(duì)話框選中“TreeView控件”,。 注:下面的示例中可能要用到ImageList控件和ImageCombo控件,因此,,將這兩個(gè)控件也添加到“控件工具箱”中,。最后的控件工具箱如圖3所示。 圖3:添加控件后的工具箱,。
|
UYHRXI5m.jpg (11.56 KB, 下載次數(shù): 273) [分享]樹形目錄控件——TreeView控件介紹
P34Qhiht.jpg (34.65 KB, 下載次數(shù): 183) [分享]樹形目錄控件——TreeView控件介紹
Tr1whO9o.jpg (10.62 KB, 下載次數(shù): 175) [分享]樹形目錄控件——TreeView控件介紹
2 TreeView控件概述 TreeView控件顯示Node對(duì)象的分層列表,,每個(gè)Node對(duì)象均由一個(gè)標(biāo)簽和一個(gè)可選的位圖組成。TreeView 一般用于顯示文檔標(biāo)題,、索引入口,、磁盤上的文件和目錄,、或能被有效地分層顯示的其它種類信息。 創(chuàng)建了TreeView控件之后,,可以通過(guò)設(shè)置屬性與調(diào)用方法對(duì)各Node對(duì)象進(jìn)行操作,,這些操作包括添加、刪除,、對(duì)齊和其它操作,。可以編程展開與折疊Node對(duì)象來(lái)顯示或隱藏所有子節(jié)點(diǎn),。Collapse,、Expand和NodeClick三個(gè)事件也提供了編程功能。 2.1 常用屬性 (1) Nodes屬性返回對(duì)TreeView控件的Node對(duì)象的集合的引用,。 [語(yǔ)法] object.Nodes object代表一個(gè)對(duì)象表達(dá)式,。可以使用標(biāo)準(zhǔn)的集合方法(例如:Add和Remove方法)操作Node對(duì)象,,可以按其索引或存儲(chǔ)在Key屬性中的唯一鍵來(lái)訪問(wèn)集合中的每個(gè)元素,。 (2) Style屬性返回或設(shè)置圖形類型(圖象、文本,、+/-號(hào),、直線)以及出現(xiàn)在TreeView控件中每一Node對(duì)象上的文本的類型。 [語(yǔ)法] object.Style [ = number] Object代表一個(gè)對(duì)象表達(dá)式,,number指定圖形類型的整數(shù),,number 的設(shè)置值是:0僅為文本;1為圖象和文本,,2為+/-號(hào)和文本,;3為+/- 號(hào)、圖象和文本,;4為直線和文本,;5為直線、圖象和文本,;6為直線,、+/-號(hào)和文本;7(缺省)為直線,、+/- 號(hào),、圖象和文本。若Style屬性設(shè)置為包含直線的值,,則LineStyle屬性就確定了直線的外觀,;如果Style屬性設(shè)置為不含直線的值,則LineStyle屬性將被忽略,。 (3)Sorted屬性返回或設(shè)置值,,此值確定Node對(duì)象的根節(jié)點(diǎn)或子節(jié)點(diǎn)是否按字母順序排列,。 [語(yǔ)法] object.Sorted [ = boolean] Object代表一個(gè)對(duì)象表達(dá)式。boolean的設(shè)置值是:True——Node對(duì)象根據(jù)它們的 Text 屬性按字母順序排列,。其Text屬性由數(shù)字開始的Node對(duì)象也作為字符串排序,,第一個(gè)數(shù)字確定在排序中的初始位置,后面的數(shù)字確定以后的排序,。False——Node對(duì)象不排序。Sorted屬性有兩種用法,,第一,,在TreeView控件的根(頂)層排列Node對(duì)象;第二,,對(duì)任何單個(gè)Node對(duì)象的子節(jié)點(diǎn)排序,。 設(shè)置 Sorted 屬性為True僅對(duì)當(dāng)前Nodes集合排序。在TreeView控件中添加新的Node對(duì)象時(shí),,必須再次設(shè)置Sorted屬性為 True,,以便對(duì)添加的Node對(duì)象排列。 (4) appearance屬性:設(shè)置控件是否以3D效果顯示,。 (5) checkboxes屬性:決定在節(jié)點(diǎn)的每一項(xiàng)的旁邊是否顯示一個(gè)復(fù)選框,,類似checkbox控件的作用。 (6) hottracking屬性:當(dāng)鼠標(biāo)指針經(jīng)過(guò)某個(gè)條目時(shí),,這些條目是否突出顯示,,類似網(wǎng)頁(yè)的超鏈接效果。 (7) labeledit屬性:決定用戶是否能編輯控件中列出的項(xiàng)目,,此項(xiàng)如果不想被改變,,可將屬性值設(shè)置為1 (8) linestyle屬性:設(shè)置列出的每項(xiàng)之間的行樣式,即,,如果為1,,則當(dāng)前項(xiàng)下還有子項(xiàng)的時(shí)候,它的前面會(huì)顯示“+”號(hào),,如果值為2,,則不顯示“+” (9) singlesel屬性:設(shè)置在樹中選擇新的條目時(shí),是否展開此條目并收攏前一個(gè)條目,,即設(shè)置為True時(shí),,并且當(dāng)前選中的條目有子項(xiàng)的時(shí)候,會(huì)把子項(xiàng)展開,,并將原來(lái)選中的條目收攏,。 (10) style屬性:設(shè)置Treeview控件的每個(gè)列表的組成方式,比如“圖片”+“文本”方式,,等等,,這樣可以把Treeview設(shè)置得更美觀一些,。 2.2 常用方法 (1) Add方法 在Treeview控件的Nodes集合中添加一個(gè)Node對(duì)象。 [語(yǔ)法] object.Add(relative, relationship, key, text, image, selectedimage) [說(shuō)明] 參數(shù)Object是必需的,,為對(duì)象表達(dá)式,。 參數(shù)Relative是可選的,代表已存在的Node對(duì)象的索引號(hào)或鍵值,。 參數(shù)relationship是可選的,,代表新節(jié)點(diǎn)與已存在的節(jié)點(diǎn)間的關(guān)系,指定的Node對(duì)象的相對(duì)位置,。relationship的設(shè)置值是: 0——tvwFirst首節(jié)點(diǎn),,該Node和在relative中被命名的節(jié)點(diǎn)位于同一層,并位于所有同層節(jié)點(diǎn)之前,。 1——tvwLast最后的節(jié)點(diǎn),,該Node和在relative中被命名的節(jié)點(diǎn)位于同一層,并位于所有同層節(jié)點(diǎn)之后,。任何連續(xù)地添加的節(jié)點(diǎn)可能位于最后添加的節(jié)點(diǎn)之后,。 2——tvwNext(缺省),下一個(gè)節(jié)點(diǎn),,該Node位于在relative中被命名的節(jié)點(diǎn)之后,。 3——tvwPrevious,前一個(gè)節(jié)點(diǎn),,該Node位于在relative中被命名的節(jié)點(diǎn)之前,。 4——tvwChild(缺省),子節(jié)點(diǎn),。該Node 為在relative中被命名的節(jié)點(diǎn)的子節(jié)點(diǎn),。 參數(shù)key是可選的,唯一的字符串,,可用于用Item方法檢索Node,。 參數(shù)text 是必需的,在Node中出現(xiàn)的字符串,。 參數(shù)image是可選的,,代表一個(gè)圖像或在ImageList控件中圖象的索引。 參數(shù)selectedimage是可選的,,代表一個(gè)圖像或在ImageList控件中圖象的索引,,在 Node被選中時(shí)顯示。 注意:如果在relative中沒有被命名的Node對(duì)象,,則新節(jié)點(diǎn)被放在節(jié)點(diǎn)頂層的最后位置,。 (2) GetVisibleCount方法 返回固定在TreeView控件的內(nèi)部區(qū)域的Node對(duì)象的個(gè)數(shù)。 [語(yǔ)法] object.GetVisibleCount object代表一個(gè)對(duì)象表達(dá)式,,Node對(duì)象的個(gè)數(shù)取決于在一個(gè)窗口中能固定多少行,??偟男袛?shù)取決于控件的高度和Font對(duì)象的Size屬性??梢允褂肎etVisibleCount屬性確??梢暤淖钚⌒袛?shù),這樣可以精確地訪問(wèn)一個(gè)層,。如果最小行數(shù)是不可視的,,可以用Height屬性重新設(shè)置TreeView的大小。 2.3 常用事件 NodeClick事件在一個(gè)Node對(duì)象被單擊時(shí)發(fā)生,。 [語(yǔ)法] Private Sub object_NodeClick(ByVal node As Node) Object代表一個(gè)對(duì)象表達(dá)式,,參數(shù)node是對(duì)被點(diǎn)取的Node對(duì)象的引用。 說(shuō)明:在單擊節(jié)點(diǎn)對(duì)象之外的TreeView控件的任何部位,,標(biāo)準(zhǔn)的Click事件發(fā)生。當(dāng)單擊某個(gè)特定的Node對(duì)象時(shí),,NodeClick事件發(fā)生,;NodeClick事件也返回對(duì)特定的Node對(duì)象的引用,在下一步操作之前,,該引用可用來(lái)使這個(gè)Node對(duì)象可用,。NodeClick事件發(fā)生在標(biāo)準(zhǔn)的Click事件之前。
3 TreeView控件的使用 下面通過(guò)示例來(lái)介紹TreeView控件的常用方法,、屬性和事件,。 [示例一] TreeView控件常用方法、屬性和事件示例(1) 在VBE編輯器中插入一個(gè)用戶窗體,,并在該窗體上添加一些控件,,即一個(gè)TreeView控件、一個(gè)ImageList控件,、一些命令按鈕控件,、一些選項(xiàng)按鈕控件和一些標(biāo)簽控件,如圖4所示,。 圖4:用戶窗體界面 在用戶窗體代碼窗口,,輸入下面的代碼: Private Sub UserForm_Initialize() '初始化ImageList控件,添加圖片 Dim img As New ImageList img.ListImages.Add 1, "book1", LoadPicture(ThisWorkbook.Path & "\book1.jpg") img.ListImages.Add 2, "book2", LoadPicture(ThisWorkbook.Path & "\book2.jpg") img.ListImages.Add 3, "book3", LoadPicture(ThisWorkbook.Path & "\book3.jpg") Set TreeView1.ImageList = img '設(shè)置顯示節(jié)點(diǎn)路徑時(shí)的分隔符 TreeView1.PathSeparator = "\" End Sub Private Sub CommandButton1_Click() '添加節(jié)點(diǎn) Dim NodeX As Node TreeView1.Nodes.Clear Set NodeX = TreeView1.Nodes.Add(, , "課程科目", "課程科目", "book3") Set NodeX = TreeView1.Nodes.Add("課程科目", tvwChild, "語(yǔ)文", "語(yǔ)文", "book1") Set NodeX = TreeView1.Nodes.Add("課程科目", tvwChild, "數(shù)學(xué)", "數(shù)學(xué)", "book1") Set NodeX = TreeView1.Nodes.Add("課程科目", tvwChild, "外語(yǔ)", "外語(yǔ)", "book1") Set NodeX = TreeView1.Nodes.Add("課程科目", tvwChild, "政治", "政治", "book1") Set NodeX = TreeView1.Nodes.Add("課程科目", tvwChild, "物理", "物理", "book1") Set NodeX = TreeView1.Nodes.Add("課程科目", tvwChild, "化學(xué)", "化學(xué)", "book1") Set NodeX = TreeView1.Nodes.Add("課程科目", tvwChild, "生物", "生物", "book1") End Sub Private Sub CommandButton2_Click() '設(shè)置為復(fù)選框顯示 TreeView1.CheckBoxes = True End Sub Private Sub CommandButton3_Click() '清除節(jié)點(diǎn) TreeView1.Nodes.Clear End Sub Private Sub CommandButton4_Click() '去掉復(fù)選框顯示 TreeView1.CheckBoxes = False End Sub Private Sub CommandButton5_Click() '開啟熱跟蹤功能 TreeView1.HotTracking = True End Sub Private Sub CommandButton6_Click() '編輯節(jié)點(diǎn) TreeView1.StartLabelEdit End Sub Private Sub CommandButton7_Click() '顯示根節(jié)點(diǎn)連線 TreeView1.LineStyle = tvwRootLines End Sub Private Sub CommandButton8_Click() '隱藏根節(jié)點(diǎn)連線 TreeView1.LineStyle = tvwTreeLines End Sub Private Sub CommandButton9_Click() '移除所選節(jié)點(diǎn) '若為根節(jié)點(diǎn),則將其子節(jié)點(diǎn)一并移除 TreeView1.Nodes.Remove TreeView1.SelectedItem.Index End Sub Private Sub CommandButton10_Click() '統(tǒng)計(jì)節(jié)點(diǎn)個(gè)數(shù) Label1.Caption = "TreeView控件中節(jié)點(diǎn)對(duì)象的個(gè)數(shù)為:" & TreeView1.Nodes.Count & "個(gè)." End Sub Private Sub CommandButton11_Click() '將所選節(jié)點(diǎn)變?yōu)榇煮w TreeView1.SelectedItem.Bold = True End Sub Private Sub CommandButton12_Click() Dim i As Long For i = 1 To TreeView1.Nodes.Count TreeView1.Nodes(i).Expanded = True '展開所有節(jié)點(diǎn) Next i End Sub Private Sub CommandButton13_Click() Dim i As Long For i = 1 To TreeView1.Nodes.Count TreeView1.Nodes(i).Expanded = False '折疊所有節(jié)點(diǎn) Next i End Sub Private Sub OptionButton1_Click() '節(jié)點(diǎn)僅為文本 TreeView1.Style = tvwTextOnly End Sub Private Sub OptionButton2_Click() '節(jié)點(diǎn)為圖像文本 TreeView1.Style = tvwPictureText End Sub Private Sub OptionButton3_Click() '節(jié)點(diǎn)為符號(hào)文本 TreeView1.Style = tvwPlusMinusText End Sub Private Sub OptionButton4_Click() '節(jié)點(diǎn)為直線文本 TreeView1.Style = tvwTreelinesText End Sub Private Sub OptionButton5_Click() '節(jié)點(diǎn)顯示恢復(fù)正常 TreeView1.Style = tvwTreelinesPlusMinusPictureText End Sub Private Sub Treeview1_Nodeclick(ByVal Node As MSComctlLib.Node) '返回對(duì)象路徑 Label3.Caption = Node.FullPath End Sub Private Sub Treeview1_NodeCheck(ByVal Node As MSComctlLib.Node) '復(fù)選框事件 Label5.Caption = "當(dāng)前選擇的節(jié)點(diǎn)是:" & TreeView1.SelectedItem.Text End Sub 下面是該用戶窗體的一些運(yùn)行結(jié)果截圖。 圖5:添加節(jié)點(diǎn)并展開節(jié)點(diǎn),。 圖6:為節(jié)點(diǎn)加上復(fù)選框,。 圖7:選中復(fù)選框后,下面顯示相應(yīng)的信息,。 圖8:選中某節(jié)點(diǎn)后顯示相應(yīng)的節(jié)點(diǎn)位置信息,。 圖9:編輯某節(jié)點(diǎn) 圖10:顯示根節(jié)點(diǎn)連線 圖11:將節(jié)點(diǎn)變?yōu)榇煮w
圖12:選擇節(jié)點(diǎn)僅為文本后(其它選項(xiàng)按鈕的效果用戶可以自已體驗(yàn))
|
RDrmpy7Z.jpg (39.24 KB, 下載次數(shù): 282) [分享]樹形目錄控件——TreeView控件介紹
fM2GzABc.jpg (39.89 KB, 下載次數(shù): 179) [分享]樹形目錄控件——TreeView控件介紹
khiewo7D.jpg (40.75 KB, 下載次數(shù): 203) [分享]樹形目錄控件——TreeView控件介紹
552jC13C.jpg (42.91 KB, 下載次數(shù): 176) [分享]樹形目錄控件——TreeView控件介紹
LJqsoq8y.jpg (41.08 KB, 下載次數(shù): 140) [分享]樹形目錄控件——TreeView控件介紹
KMbHA0w3.jpg (40.95 KB, 下載次數(shù): 165) [分享]樹形目錄控件——TreeView控件介紹
S8CMXT1r.jpg (39.86 KB, 下載次數(shù): 86) [分享]樹形目錄控件——TreeView控件介紹
xyzlBF2H.jpg (40.91 KB, 下載次數(shù): 106) [分享]樹形目錄控件——TreeView控件介紹
iM8U0AJy.jpg (36.07 KB, 下載次數(shù): 160) [分享]樹形目錄控件——TreeView控件介紹
[示例二] TreeView控件常用方法、屬性和事件示例(2) 在VBE編輯器中插入一個(gè)用戶窗體,,并在該窗體上添加一個(gè)TreeView控件,、一個(gè)ImageList控件,、兩個(gè)標(biāo)簽控件、二個(gè)文字框,、六個(gè)命令按鈕,,如下圖13所示。 圖13:設(shè)計(jì)界面 在該窗體的代碼窗口中,,輸入下面的代碼: Option Explicit '定義變量 Dim i As Integer Dim j As Integer Dim nodx As Node Dim b As Boolean Private Sub UserForm_Initialize() Dim img As New ImageList img.ListImages.Add 1, "book1", LoadPicture(ThisWorkbook.Path & "\book1.jpg") img.ListImages.Add 2, "book2", LoadPicture(ThisWorkbook.Path & "\book2.jpg") img.ListImages.Add 3, "book3", LoadPicture(ThisWorkbook.Path & "\book3.jpg") Set TreeView1.ImageList = img '鏈接圖像列 TreeView1.LineStyle = tvwTreeLines '在兄弟節(jié)點(diǎn)和根節(jié)點(diǎn)之間顯示線 '樹狀外觀包含全部元素 TreeView1.Style = tvwTreelinesPlusMinusPictureText '建立名稱為"VBA控件"的父節(jié)點(diǎn),選擇索引為1的圖像 Set nodx = TreeView1.Nodes.Add(, , "VBA控件", "VBA控件", 1) '在"VBA控件"根節(jié)點(diǎn)下建立"第一章"子節(jié)點(diǎn),選擇索引為3的圖像 Set nodx = TreeView1.Nodes.Add("VBA控件", tvwChild, "child01", "第一章", 3) '在"VBA控件"根節(jié)點(diǎn)下建立"第二章"子節(jié)點(diǎn),選擇索引為3的圖像 Set nodx = TreeView1.Nodes.Add("VBA控件", tvwChild, "child02", "第二章", 3) b = False End Sub Private Sub CommandButton1_Click() If TextBox1.Text <> "" And TextBox2.Text <> "" Then '不允許建立零字節(jié)的根節(jié)點(diǎn)和子節(jié)點(diǎn) b = False j = TreeView1.Nodes.Count For i = 1 To TreeView1.Nodes.Count '檢查新輸入的根節(jié)點(diǎn)名稱是否存在 If TreeView1.SelectedItem.Children > 0 Then If TextBox1.Text = TreeView1.Nodes(i).Text Then b = True End If Next i If b = True Then '若存在, 則在根節(jié)點(diǎn)下建立子節(jié)點(diǎn) Set nodx = TreeView1.Nodes.Add(TextBox1.Text, tvwChild, "child" & j, TextBox2.Text, 3) Else '若不存在,則建立根節(jié)點(diǎn)和子節(jié)點(diǎn) Set nodx = TreeView1.Nodes.Add(, , TextBox1.Text, TextBox1.Text, 1) Set nodx = TreeView1.Nodes.Add(TextBox1.Text, tvwChild, "child" & j, TextBox2.Text, 3) End If TreeView1.Refresh ElseIf TextBox1.Text = "" Then MsgBox "請(qǐng)輸入根節(jié)點(diǎn)名稱!", vbInformation, "警告,!" '系統(tǒng)提示 ElseIf TextBox2.Text = "" Then MsgBox "請(qǐng)輸入子節(jié)點(diǎn)名稱!", vbInformation, "警告!" End If End Sub Private Sub CommandButton2_Click() For i = 1 To TreeView1.Nodes.Count TreeView1.Nodes(i).Expanded = True '展開所有節(jié)點(diǎn) Next i End Sub Private Sub CommandButton3_Click() For i = 1 To TreeView1.Nodes.Count TreeView1.Nodes(i).Expanded = False '折疊所有節(jié)點(diǎn) Next i End Sub Private Sub CommandButton4_Click() TreeView1.Sorted = True '排列順序 End Sub Private Sub CommandButton5_Click() If TreeView1.SelectedItem.Index <> 1 Then TreeView1.Nodes.Remove TreeView1.SelectedItem.Index '刪除選定的節(jié)點(diǎn) End If End Sub Private Sub CommandButton6_Click() End '退出程序 End Sub Private Sub TreeView1_Expand(ByVal Node As MSComctlLib.Node) Node.ExpandedImage = 2 '節(jié)點(diǎn)被展開時(shí),選擇索引為2的圖像 End Sub Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node) Dim str As String If TreeView1.SelectedItem.Children = 0 Then '檢查是否有子節(jié)點(diǎn),0為無(wú) For i = 1 To TreeView1.Nodes.Count If TreeView1.Nodes(i).Selected Then str = TreeView1.Nodes(i).FullPath '系統(tǒng)提示 MsgBox "您選擇的是:[" & str & "]子節(jié)點(diǎn),!" End If Next i End If End Sub 運(yùn)行后,,初始化用戶窗體,見UserForm_Initialize()事件代碼,。首先在ImageList控件中添加三個(gè)圖片,,索引值分別為1、2,、3,;然后語(yǔ)句Set TreeView1.ImageList = img將圖片鏈接到TreeView控件中。下面的兩條語(yǔ)句使用LineStyle屬性和Style屬性來(lái)設(shè)置TreeView控件外觀,,再使用Nodes對(duì)象的Add方法來(lái)添加節(jié)點(diǎn),,其語(yǔ)法為: Nodes.Add([relative][,relationship][,key][,text][,image][,selectedimage]) 其中,參數(shù)relationship是通過(guò)關(guān)系節(jié)點(diǎn)參數(shù)與新節(jié)點(diǎn)連接的另一個(gè)節(jié)點(diǎn),;參數(shù)可能是以下情況: 1-tvwlast 該節(jié)點(diǎn)置于所有其他的在relative中被命名的同一級(jí)別的節(jié)點(diǎn)的后面 2-tvwNext 該節(jié)點(diǎn)置于在relative中被命名節(jié)點(diǎn)的后面 3-tvwPrevius 該節(jié)點(diǎn)置于在relative中被命名的節(jié)點(diǎn)的前面 4-tvwChild 該節(jié)點(diǎn)成為在relative中被命名的節(jié)點(diǎn)的的子節(jié)點(diǎn) 本例中,,第一個(gè)Add語(yǔ)句添加名為“VBA控件”的根節(jié)點(diǎn),其它兩個(gè)Add語(yǔ)句添加該根節(jié)點(diǎn)的子節(jié)點(diǎn),。運(yùn)行后的結(jié)果如圖14所示,。 圖14:窗體初步運(yùn)行后的結(jié)果。 界面中的兩個(gè)文字框用來(lái)添加節(jié)點(diǎn),,當(dāng)單擊“添加”按鈕后,,如果文字框中沒有任何輸入,則會(huì)提示輸入根節(jié)點(diǎn)和子節(jié)點(diǎn),。在文字框中輸入根節(jié)點(diǎn)和子節(jié)點(diǎn)后,,單擊“添加”按鈕,如果根節(jié)點(diǎn)已存在,,則在該根節(jié)點(diǎn)下建立子節(jié)點(diǎn),,若不存在,則建立新的根節(jié)點(diǎn)和字節(jié)點(diǎn),。 “展開”和“折疊”按鈕根據(jù)Expanded屬性的值來(lái)確定是否展開和折疊節(jié)點(diǎn),。 將Sorted屬性設(shè)置為True,對(duì)當(dāng)前節(jié)點(diǎn)進(jìn)行排序,使用Remove方法來(lái)刪除當(dāng)前所選中的節(jié)點(diǎn),。 本例還運(yùn)用了兩個(gè)事件:Expand事件和NodeClick事件,。當(dāng)節(jié)點(diǎn)展開時(shí),發(fā)生Expand事件,,更換所展開的節(jié)點(diǎn)圖片,。當(dāng)單擊節(jié)點(diǎn)時(shí),發(fā)生NodeClick事件,,該事件代碼顯示所單擊節(jié)點(diǎn)的路徑,。 本示例運(yùn)行后的結(jié)果如圖15所示。
圖15:運(yùn)行后的結(jié)果
|
yDuDPiqE.jpg (21.28 KB, 下載次數(shù): 152) [分享]樹形目錄控件——TreeView控件介紹
lu04isEi.jpg (20.42 KB, 下載次數(shù): 87) [分享]樹形目錄控件——TreeView控件介紹
G5pQ2MPH.jpg (25.92 KB, 下載次數(shù): 148) [分享]樹形目錄控件——TreeView控件介紹 [示例三] TreeView控件的基本使用(By Ken Puls) 本示例中,,將使用工作表名和工作表中含有公式的單元地址填充TreeView控件,。 先創(chuàng)建一個(gè)新工作,在工作表Sheet1和Sheet2中添加一些公式,。打開VBE編輯器,,添加一個(gè)用戶窗體。在該窗體中添加一個(gè)TreeView控件,、一個(gè)標(biāo)簽控件和一個(gè)命令按鈕控件,。 在該窗體的代碼模塊中輸入下面的代碼: Private Sub UserForm_Initialize() '使用缺省的設(shè)置裝載用戶窗體 '設(shè)置控件的缺省值 With Me .CommandButton1.Caption = "關(guān)閉" .Label1 = vbNullString .TreeView1.LineStyle = tvwRootLines End With '填充Treeview Call TreeView_Populate End Sub Private Sub TreeView_Populate() '填充TreeView控件 Dim ws As Worksheet Dim rngFormula As Range Dim rngFormulas As Range With Me.TreeView1.Nodes .Clear For Each ws In ActiveWorkbook.Worksheets '在節(jié)點(diǎn)中添加工作表名 .Add Key:=ws.Name, Text:=ws.Name '檢查工作表中是否有公式 On Error Resume Next Set rngFormulas = ws.Cells.SpecialCells(xlCellTypeFormulas) On Error GoTo 0 '添加公式單元格 If Not rngFormulas Is Nothing Then For Each rngFormula In rngFormulas .Add relative:=ws.Name, _ relationship:=tvwChild, _ Key:=ws.Name & "," & rngFormula.Address, _ Text:="Range " & rngFormula.Address Next rngFormula End If Set rngFormulas = Nothing Next ws End With End Sub Private Sub Treeview1_NodeClick(ByVal Node As MSComctlLib.Node) '將所選中的節(jié)點(diǎn)關(guān)鍵字寫到標(biāo)簽中 Me.Label1.Caption = Node.Key End Sub Private Sub CommandButton1_Click() '關(guān)閉用戶窗體 Unload Me End Sub 下面對(duì)代碼進(jìn)行說(shuō)明: (1) Private Sub UserForm_Initialize() 這段代碼的功能是在裝載用戶窗體時(shí),進(jìn)行所需要的缺省設(shè)置,,然后調(diào)用Treeview_Populate過(guò)程來(lái)填充TreeView控件。在代碼中,,將Treeview控件的LineStyle屬性設(shè)置為'tvwRootLines',,顯示根節(jié)點(diǎn)連線。 (2) Private Sub TreeView_Populate() 這段代碼使用工作簿中的所有工作表名和包含公式的單元格區(qū)域來(lái)填充所有節(jié)點(diǎn),。 在添加節(jié)點(diǎn)到TreeView控件中時(shí),,需要?jiǎng)?chuàng)建父/子節(jié)點(diǎn)的關(guān)系。在本例中,,每個(gè)工作表是父節(jié)點(diǎn),,單元格地址是其子節(jié)點(diǎn)。要添加根節(jié)點(diǎn),,需要賦給其參數(shù)Key值和參數(shù)Text,。參數(shù)Key必須是唯一的,參數(shù)Text所代表的文本將顯示在節(jié)點(diǎn)中,。示例中,,使用下面的代碼將工作表名稱添加到節(jié)點(diǎn)中: .Add Key:=ws.Name, Text:=ws.Name 即Me.TreeView1.Nodes.Add Key:="Sheet1", Text:="Sheet1" 要添加根節(jié)點(diǎn),就使用上面的代碼結(jié)構(gòu),。 添加子節(jié)點(diǎn)的代碼稍有不同,,仍然使用Add方法且也需要一個(gè)唯一的Key值,也必須提供父節(jié)點(diǎn)的Key值(參數(shù)relative)和參數(shù)relationship值(tvwChild),。在本例中,,添加子節(jié)點(diǎn)的代碼如下: .Add relative:=ws.Name, relationship:=tvwChild, _ Key:=ws.Name & "," & rngFormula.Address, Text:="Range " & rngFormula.Address 即Me.TreeView1.Nodes.Add relative:= "Sheet1", _ relationship:=tvwChild Key:="Sheet1,$C$8", Text:="Rage $C$8" 要將子節(jié)點(diǎn)鏈接到父節(jié)點(diǎn)的下面,,參數(shù)relative必須與父節(jié)點(diǎn)的Key值一致,參數(shù)relationship必須設(shè)置為tvwchild,。要使子節(jié)點(diǎn)有效,,它必須也有自已唯一的Key值。 (3) Private Sub Treeview1_NodeClick(ByVal Node As MSComctlLib.Node) 這段代碼捕獲節(jié)點(diǎn)的Click事件,,并將該節(jié)點(diǎn)的Key值顯示在標(biāo)簽控件中,。當(dāng)窗體加載時(shí),設(shè)置標(biāo)簽label1控件為vbNullstring以確保當(dāng)沒有選擇控件時(shí)標(biāo)簽為空,。 (4) Private Sub CommandButton1_Click() 該命令按鈕卸載用戶窗體,。 下面的代碼進(jìn)一步擴(kuò)展了示例的功能: Private Sub CommandButton2_Click() '定位所選節(jié)點(diǎn) Dim sNodes() As String '檢查是否選擇了節(jié)點(diǎn) If Me.Label1.Caption = vbNullString Then MsgBox "您沒有選擇任何節(jié)點(diǎn)!" & vbNewLine & _ "請(qǐng)選擇后再試.", vbCritical + vbOKOnly, _ "沒有選擇" Exit Sub End If '將標(biāo)簽分解 sNodes = Split(Me.Label1, ",") With Worksheets(sNodes(0)) '激活工作表 .Activate '激活合適的范圍 If UBound(sNodes) + 1 > 1 Then '激活所選區(qū)域范圍 .Range(sNodes(1)).Activate Else '選擇工作表并激活單元格A1 .Range("A1").Activate End If End With '卸載窗體 Unload Me End Sub 在窗體中再放置一個(gè)命令按鈕,并輸入上面的代碼,。該代碼的功能是,,激活所選節(jié)點(diǎn)對(duì)應(yīng)的工作表中的單元格區(qū)域。
[示例四] 自動(dòng)創(chuàng)建樹狀圖形(Add方法示例) 在VBE編輯器中插入一個(gè)用戶窗體,,并放置一個(gè)TreeView控件,。然后在該窗體代碼窗口中輸入下面的代碼: Private Sub UserForm_Initialize() Dim i As Long Dim j As Long Dim k As Long Dim Title As String Dim xNode As Node Dim NodeKey As String Dim NodeKey2 As String With Me.TreeView1 For i = 1 To 5 Set xNode = .Nodes.Add NodeKey = "Node - " & i With xNode .Key = NodeKey .Text = "Node - " & i .Expanded = False End With For j = 1 To 7 Set xNode = .Nodes.Add(NodeKey, tvwChild) NodeKey2 = "Node - Child - " & i & j With xNode .Key = NodeKey2 .Text = "Child - " & j End With For k = 1 To 10 Set xNode = .Nodes.Add(NodeKey2, tvwChild) With xNode .Text = "Child2 - " & k End With Next k Next j Next i End With Set xNode = Nothing End Sub Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node) Me.Caption = Node.Text End Sub 本示例很好地演示了添加節(jié)點(diǎn)的方法。代碼中,,通過(guò)循環(huán)添加了5個(gè)根節(jié)點(diǎn),,在每個(gè)根節(jié)點(diǎn)下又添加了7個(gè)子節(jié)點(diǎn),在每個(gè)子節(jié)點(diǎn)下又添加了10個(gè)子節(jié)點(diǎn),。
[示例五] TreeView控件和復(fù)合框組合使用 在VBE編輯器中插入一個(gè)用戶窗體,,并放置一個(gè)TreeView控件和一個(gè)復(fù)合框控件,然后在該窗體的代碼窗口中輸入下面的代碼: Private Sub UserForm_Initialize() Dim i As Long Dim j As Long Dim k As Long Dim Title As String Dim xNode As Node Dim NodeKey As String Dim NodeKey2 As String With Me.TreeView1 For i = 1 To 5 Set xNode = .Nodes.Add NodeKey = "Node - " & i With xNode .Key = NodeKey .Text = "Node - " & i .Expanded = False End With Me.ComboBox1.AddItem ("Node - " & i) For j = 1 To 7 Set xNode = .Nodes.Add(NodeKey, tvwChild) NodeKey2 = "Node - Child - " & i & j With xNode .Key = NodeKey2 .Text = "Child - " & j End With Me.ComboBox1.AddItem ("Child - " & j) For k = 1 To 10 Set xNode = .Nodes.Add(NodeKey2, tvwChild) With xNode .Text = "Child2 - " & k End With Me.ComboBox1.AddItem ("Child2 - " & k) Next k Next j Next i End With Set xNode = Nothing End Sub Private Sub ComboBox1_Click() On Error Resume Next Me.TreeView1.Nodes(Me.ComboBox1.ListIndex + 1).Parent.Parent.Expanded = True Me.TreeView1.Nodes(Me.ComboBox1.ListIndex + 1).Parent.Expanded = True Me.TreeView1.Nodes(Me.ComboBox1.ListIndex + 1).Expanded = True On Error GoTo 0 End Sub 上面的代碼先建立一個(gè)樹形圖,,并將節(jié)點(diǎn)全部添加到復(fù)合框中,。然后,可以單擊復(fù)合框中的相應(yīng)節(jié)點(diǎn)來(lái)展開樹形圖中的根節(jié)點(diǎn),。
[示例六] 控件綜合使用示例(1) 本例根據(jù)puremis.net中的代碼整理,。 在工作表中選擇菜單“視圖”——“工具欄”——“控件工具箱”,使用“圖像”控件添加10個(gè)圖像控件,,分別命名為Image1至Image9,,還有一個(gè)為None。在這些控件中單擊右鍵,,選擇“屬性”并從picture屬性中選擇合適的圖像,。然后,將對(duì)象名稱放置在C1至C11單元格中,。在B2至B11單元格,,放置名字和相應(yīng)的父親的名字,在D列,放置個(gè)人簡(jiǎn)介,。此時(shí),,工作表Sheet1如圖16所示。 圖16:工作表中的數(shù)據(jù) 在VBE編輯器中插入一個(gè)用戶窗體,,在其上放置一個(gè)TreeView控件和兩個(gè)文字框控件,,并進(jìn)行相應(yīng)的設(shè)置,如圖17所示,。 圖17:設(shè)計(jì)界面,。 TreeView包含TreeNodes的集合,每個(gè)TreeNode對(duì)象都是TreeNode集合的一個(gè)成員,,其編號(hào)按顯示順序從0到Nodes.Count-1,。本例中,沒有使用索引號(hào),,而是關(guān)鍵字,,如: TreeView1.Nodes.Add(Relative:="The key of Parent", Relationship:=tvwChild, Text:="Your Text")。 在VBE編輯器中插入一個(gè)模塊,,并輸入下面的代碼: Option Explicit Sub MakeFamilyTree() Dim arrName As Variant Dim arrParent As Variant Dim arrMatrix() As Variant Dim arrTemp As Variant Dim elm As Variant Dim i As Long, j As Long Dim ret As Variant Dim node As node Dim bExists As Boolean '重置TreeView控件 UserForm1.TreeView1.Nodes.Clear '從工作表中獲取數(shù)據(jù)作為一個(gè)數(shù)組 With Sheets("Sheet1").Range(Sheets("Sheet1").[A2], Sheets("Sheet1").[A65536].End(xlUp)) arrName = .Value arrParent = .Offset(, 1).Value End With '排序 ReDim arrMatrix(1 To UBound(arrName), 1 To 1) For Each elm In arrParent i = i + 1 ret = Application.Match(elm, arrName, 0) If IsError(ret) Then arrMatrix(i, 1) = arrName(i, 1) Else j = 3 ReDim Preserve arrMatrix(1 To UBound(arrMatrix), 1 To j) arrMatrix(i, 1) = arrName(i, 1) arrMatrix(i, 2) = elm arrMatrix(i, 3) = arrParent(ret, 1) Do ret = Application.Match(arrParent(ret, 1), arrName, 0) If IsError(ret) Then Exit Do If arrParent(ret, 1) = "" Then Exit Do j = j + 1 ReDim Preserve arrMatrix(1 To UBound(arrMatrix), 1 To j) arrMatrix(i, j) = arrParent(ret, 1) Loop End If Next arrTemp = CustomTranspose(arrMatrix) '添加數(shù)據(jù)到節(jié)點(diǎn)中 For i = 1 To UBound(arrTemp) For j = 1 To UBound(arrTemp, 2) If Not IsEmpty(arrTemp(i, j)) Then With UserForm1.TreeView1 bExists = False For Each elm In .Nodes If elm = arrTemp(i, j) Then bExists = True Next If Not bExists Then If j = 1 Then Set node = .Nodes.Add(, , arrTemp(i, j), arrTemp(i, j), _ Image:=GetInfo(arrTemp(i, j), True)) Else Set node = .Nodes.Add(arrTemp(i, j - 1), tvwChild, arrTemp(i, j), arrTemp(i, j), _ Image:=GetInfo(arrTemp(i, j), True)) End If node.Expanded = True End If End With End If Next Next End Sub Function CustomTranspose(ByVal buf As Variant) As Variant '轉(zhuǎn)換數(shù)組順序從父節(jié)點(diǎn)到子節(jié)點(diǎn) Dim arrTemp() As Variant Dim i As Long, j As Long, k As Long ReDim arrTemp(LBound(buf) To UBound(buf), LBound(buf, 2) To UBound(buf, 2)) For i = 1 To UBound(buf) k = 0 For j = UBound(buf, 2) To 1 Step -1 If Not IsEmpty(buf(i, j)) Then k = k + 1 arrTemp(i, k) = buf(i, j) End If Next Next CustomTranspose = arrTemp End Function Function GetInfo(sName, bAorD) As String '返回合適的圖像 Dim rFound As Range Set rFound = Sheet1.Columns(1).Find(sName, lookat:=xlWhole) If rFound Is Nothing Then GetInfo = "none" Else GetInfo = IIf(bAorD, rFound.Offset(, 2).Value, rFound.Offset(, 3).Value) End If End Function 在用戶窗體代碼模塊中,,輸入下面的代碼: Private Sub UserForm_Activate() SettingImageList MakeFamilyTree End Sub Private Sub SettingImageList() Dim myImgList As New ImageList Dim bt With myImgList.ListImages .Add Key:="Image1", Picture:=Sheet1.Image1.Picture .Add Key:="Image2", Picture:=Sheet1.Image2.Picture .Add Key:="Image3", Picture:=Sheet1.Image3.Picture .Add Key:="Image4", Picture:=Sheet1.Image4.Picture .Add Key:="Image5", Picture:=Sheet1.Image5.Picture .Add Key:="Image6", Picture:=Sheet1.Image6.Picture .Add Key:="Image7", Picture:=Sheet1.Image7.Picture .Add Key:="Image8", Picture:=Sheet1.Image8.Picture .Add Key:="Image9", Picture:=Sheet1.Image9.Picture .Add Key:="none", Picture:=Sheet1.none.Picture End With With TreeView1 Set .ImageList = myImgList .Indentation = 14 .LabelEdit = tvwManual .HideSelection = False End With End Sub Private Sub TreeView1_NodeClick(ByVal node As MSComctlLib.node) Me.TextBox1.Text = node.Text Me.TextBox2.Text = GetInfo(node.Text, False) End Sub 運(yùn)行后的結(jié)果如圖18所示。
圖18:運(yùn)行后的結(jié)果
|
kLUf9zau.jpg (48.44 KB, 下載次數(shù): 222) [分享]樹形目錄控件——TreeView控件介紹
DGk846kE.jpg (22.22 KB, 下載次數(shù): 163) [分享]樹形目錄控件——TreeView控件介紹
rCGsjLff.jpg (37.98 KB, 下載次數(shù): 143) [分享]樹形目錄控件——TreeView控件介紹
[示例八] 改變背景色 在VBE編輯器中插入一個(gè)用戶窗體,,并在上面放置一個(gè)TreeView控件和一個(gè)命令按鈕,,如圖21所示。 圖21 在用戶窗體代碼模塊中,,輸入下面的代碼: Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long Private Declare Function GetWindowLong Lib "User32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long Private Declare Function SetWindowLong Lib "User32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Const GWL_STYLE = -16& Private Const TVM_SETBKCOLOR = 4381& Private Const TVM_GETBKCOLOR = 4383& Private Const TVS_HASLINES = 2& Private Sub UserForm_Initialize() Dim nodeX As Node Dim i As Long With TreeView1.Nodes Set nodeX = .Add(, , "R", "Root") nodeX.BackColor = RGB(255, 0, 0) For i = 1 To 10 Set nodeX = .Add("R", tvwChild, "C" & i, "Child " & i) nodeX.BackColor = RGB(255, 0, 0) nodeX.EnsureVisible Next End With End Sub Private Sub Command1_Click() Dim lngStyle As Long Dim nodeX As Node Dim i As Long Call SendMessage(TreeView1.hWnd, TVM_SETBKCOLOR, 0, ByVal RGB(255, 0, 0)) '改變背景到紅色 lngStyle = GetWindowLong(TreeView1.hWnd, GWL_STYLE) Call SetWindowLong(TreeView1.hWnd, GWL_STYLE, lngStyle - TVS_HASLINES) Call SetWindowLong(TreeView1.hWnd, GWL_STYLE, lngStyle) End Sub
|
47NchiHT.jpg (10.35 KB, 下載次數(shù): 161) [分享]樹形目錄控件——TreeView控件介紹
[其它示例] 在示例工作簿文件夾中,,附帶有摘自vbaexpress.com論壇組中的幾個(gè)關(guān)于TreeView使用的示例。其中 (1) Structure.xls工作簿:根據(jù)工作表Structure中的數(shù)據(jù)填充TreeView控件,,并將相應(yīng)的信息在文字框中顯示,還可以在復(fù)合框中快速搜索相應(yīng)的節(jié)點(diǎn)并定位,。 (2) TreeviewHitTest.xls工作簿:能夠動(dòng)態(tài)顯示光標(biāo)在窗體中的坐標(biāo)值,。 示例文檔下載: VEquHuSo.rar (127.97 KB, 下載次數(shù): 5806)
|