久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

樹形目錄控件——TreeView控件介紹

 yuxinrong 2018-12-23

樹形目錄控件——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控件介紹

[分享]樹形目錄控件——TreeView控件介紹

P34Qhiht.jpg (34.65 KB, 下載次數(shù): 183)

[分享]樹形目錄控件——TreeView控件介紹

[分享]樹形目錄控件——TreeView控件介紹

Tr1whO9o.jpg (10.62 KB, 下載次數(shù): 175)

[分享]樹形目錄控件——TreeView控件介紹

[分享]樹形目錄控件——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控件介紹

[分享]樹形目錄控件——TreeView控件介紹

fM2GzABc.jpg (39.89 KB, 下載次數(shù): 179)

[分享]樹形目錄控件——TreeView控件介紹

[分享]樹形目錄控件——TreeView控件介紹

khiewo7D.jpg (40.75 KB, 下載次數(shù): 203)

[分享]樹形目錄控件——TreeView控件介紹

[分享]樹形目錄控件——TreeView控件介紹

552jC13C.jpg (42.91 KB, 下載次數(shù): 176)

[分享]樹形目錄控件——TreeView控件介紹

[分享]樹形目錄控件——TreeView控件介紹

LJqsoq8y.jpg (41.08 KB, 下載次數(shù): 140)

[分享]樹形目錄控件——TreeView控件介紹

[分享]樹形目錄控件——TreeView控件介紹

KMbHA0w3.jpg (40.95 KB, 下載次數(shù): 165)

[分享]樹形目錄控件——TreeView控件介紹

[分享]樹形目錄控件——TreeView控件介紹

S8CMXT1r.jpg (39.86 KB, 下載次數(shù): 86)

[分享]樹形目錄控件——TreeView控件介紹

[分享]樹形目錄控件——TreeView控件介紹

xyzlBF2H.jpg (40.91 KB, 下載次數(shù): 106)

[分享]樹形目錄控件——TreeView控件介紹

[分享]樹形目錄控件——TreeView控件介紹

iM8U0AJy.jpg (36.07 KB, 下載次數(shù): 160)

[分享]樹形目錄控件——TreeView控件介紹

[分享]樹形目錄控件——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控件介紹

[分享]樹形目錄控件——TreeView控件介紹

lu04isEi.jpg (20.42 KB, 下載次數(shù): 87)

[分享]樹形目錄控件——TreeView控件介紹

[分享]樹形目錄控件——TreeView控件介紹

G5pQ2MPH.jpg (25.92 KB, 下載次數(shù): 148)

[分享]樹形目錄控件——TreeView控件介紹

[分享]樹形目錄控件——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控件介紹

[分享]樹形目錄控件——TreeView控件介紹

DGk846kE.jpg (22.22 KB, 下載次數(shù): 163)

[分享]樹形目錄控件——TreeView控件介紹

[分享]樹形目錄控件——TreeView控件介紹

rCGsjLff.jpg (37.98 KB, 下載次數(shù): 143)

[分享]樹形目錄控件——TreeView控件介紹

[分享]樹形目錄控件——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控件介紹

[分享]樹形目錄控件——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)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多