摘 要:基于VS2008中Windows窗體應用程序中TreeView控件,并結合ListViewr控件和SplitContainer容器控件的使用,建立TreeView樹形結構視圖為主體的資源管理器,帶給用戶一個清晰簡明的界面,提高了人機交互的友好性。
關鍵詞:TreeView控件;應用;開發
TreeView是以樹形列表顯示數據的控件,能分層展開和收縮各節點子目錄。TreeView控件的應用非常廣泛,幾乎所有的應用程序中都會存在。
本文主要是基于VS2008中Windows窗體應用程序中TreeView控件,并結合ListViewr控件和SplitContainer容器控件的使用,建立TreeView樹形結構視圖為主體的資源管理器,它帶給用戶一個清晰簡明的界面,提高了人機交互的友好性。
1 項目創建與窗體的排版
運行VS2008,創建一個VB的Windows窗體應用程序,在Windows窗體上,拖入SplitContainer容器控件,該控件分為左右兩個區域,每個區域可放置一個其他控件。在左邊區域里拖入TreeView控件,在其屬性窗口里把DOCK屬性改為Fill。在右邊區域拖入一個ListView控件,在基屬性窗口里把DOCK屬性改為Fill,Columns集合編輯器里添加3個成員(ColumnHeader),分別將其名稱改為:名稱、大小、類型、修改時間。
2 TreeView控件的樹形視圖實現
2.1 在窗體代碼類里上方,引用Imports System.IO命名空間,引用的目的是為了簡寫窗體類中關于驅動器、文件夾和文件的代碼。
2.2 在窗體加載事件中建立一個節點“我的電腦”,并利用節點node的Tag屬性來存放文件的完整地址,便于后面查詢。遍歷所有驅動器,并將驅動器的名稱添加到TreeView中,形成一個驅動器的樹形結構圖。
Dim mynode As New TreeNode
mynode = TreeView1.Nodes.Add(\"我的電腦\")
mynode.Tag = \"mycomputer\"
Dim drives As DriveInfo()= DriveInfo.GetDrives
Dim submynode As New TreeNode
For Each drive As DriveInfo In drives
submynode = mynode.Nodes.Add(drive.Name)
submynode.Tag = drive.Name
CreateTree(submynode,submynode.Tag.ToString)
Next
2.3 建立一個子程序來添加驅動器下的各個文件夾在TreeView上的節點。
Private Sub CreateTree(ByVal mynode As TreeNode,ByVal path As String)
Dim dir As DirectoryInfo = New DirectoryInfo(path)
Dim submynode As New TreeNode
If dir.Name.Substring(1,2)= \":\\\" Or dir.Attributes = FileAttributes.Directory Then
Try
For Each subdir As DirectoryInfo In dir.GetDirectories
If subdir.Attributes = FileAttributes.Directory Then
Try
submynode = mynode.Nodes.Add(subdir.Name)
submynode.Tag = subdir.FullName
CreateTree(submynode,submynode.Tag.ToString)
Catch ex As Exception
End Try
End If
Next
Catch ex As Exception
End Try
End If
End Sub
3 建立一個子程序用于在點擊TreeView節點時,在ListView中顯現該節點對應文件夾下的子文件夾和文件
Private Sub FilterListView(ByVal mynode As TreeNode)
ListView1.Items.Clear()''清空ListView
If mynode.Tag.ToString = \"mycomputer\" Then Return
Dim dir As DirectoryInfo = New DirectoryInfo(mynode.Tag.ToString)
If dir.Name.Substring(1,2)= \":\\\" Or dir.Attributes = FileAttributes.Directory Then
Try
Dim item As ListViewItem = Nothing
Dim subitem As ListViewItem.ListViewSubItem()= Nothing
For Each subdir As DirectoryInfo In dir.GetDirectories
‘定義顯現節點對應文件夾下的子文件
If subdir.Attributes = FileAttributes.Directory Then
Try
item = New ListViewItem(subdir.Name,0)
subitem = New ListViewItem.ListViewSubItem()_
{New ListViewItem.ListViewSubItem(item,\"文件夾\"),_
New ListViewItem.ListViewSubItem(item,subdir.LastWriteTime.ToString)}
item.SubItems.AddRange(subitem)
ListView1.Items.Add(item)
Catch ex As Exception
End Try
End If
Next
For Each subdir As DirectoryInfo In dir.GetDirectories
‘定義顯現節點對應文件夾下的文件(同上)
…
End Sub
4 建立TreeView的NodeMouseClick事件,在該事件中處理圖標狀態
Private Sub TreeView1_NodeMouseClick(ByVal sender As Object,ByVal e As System.Windows.Forms.TreeNodeMouseClickEventArgs)Handles TreeView1.NodeMouseClick
Dim mynode As TreeNode = e.Node
If mynode.IsExpanded = False Then
mynode.SelectedImageIndex = 0
Else
mynode.SelectedImageIndex = 1
End If
FilterListView(e.Node)
End Sub
5 測試效果如下
參考文獻:
[1] Microsoft公司的MSND Online.
[2] Windows 程序設計(第5版).方敏,張勝,趙勇,等譯.北京:清華大學出版社,2010.
[3] 盧鎮波,李清.Visual Basic.net 實用編程百例[M].北京:清華大學出版社,2005.
[4] Thearon Willis,Bryan Newsome.Visual Basic 2010入門經典(第6版)[M].吳偉敏,李周芳,譯.北京:清華大學出版