Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > Access数据库-教程

【VB.NET小品】TreeView控件设计方法详解

时 间:2012-04-02 12:35:49
作 者:煮江品茶   ID:10802  城市:武汉
摘 要:TreeView控件设计方法详解
正 文:

  TreeView控件几乎在所有的应用程序中都会存在,相对其他控件来说TreeView的处理要复杂一些。不过熟能生巧,练习一两遍也还是比较容易掌握其规律。在VS2010中Windows窗体应用程序和WEB窗体应用程序中也都存在的TreeView控件,不过WEB窗体应用程序做了比较多的封装,使用起来更为简单一些。有时候封装的太多也有个缺陷,就是很难搞明白来龙去脉,搞不懂来龙去脉的话,改造起来就麻烦许多。

本例主要讲解VS2010中Windows窗体应用程序中的TreeView控件的使用方法,以文件夹的遍历来建立TreeView视图。并结合ImageList组件、ListView控件和SplitContainer容器控件的使用,集中展示一个以TreeView树形结构视图为主体的窗体设计方法。

第一节:

1、创建一个Windows项目;

2、在Windows窗体上,拖入一个SplitContainer控件。SplitContainer控件是一个容器控件,该控件分为左右两个区域,每个区域可放置一个其他控件。

VS中有许多种容器控件,这些控件简化了窗体的排版。

3、拖入一个TreeView控件到SplitContainer控件的左侧区域,在属性窗口设置Dock属性为Fill。也可通过右上角小三角按钮打开设置窗口,点击其中的

“在父容器中停靠”进行该项设置。

4、通过右上角小三角按钮打开设置窗口,点击编辑节点,打开TreeNode编辑器窗口,可在其中对TreeView的节点进行增删等设置。

tree-1.gif

第二节:

1、删除TreeView中的节点。后面我们将用代码动态设置TreeView的节点。

2、拖入一个ImageList组件。vs中有许多组件,这些组件都是一些类的封装,提供了很多的属性和方法。组件和控件的不同在于组件不可见,也可以说

控件是可见的组件。ImageList组件可以用来存放图标。

3、通过ImageList组件的Images属性,添加三个图标,分别表示文件夹关闭、文件夹打开和文件。

4、设置TreeView控件引用ImageList组件。

tree2.gif

第三节:

1、双击窗体的空白处(注意不要在控件中双击,可双击窗体标题栏),打开VB编辑窗口,此时自动建立了一个窗体类,并建立了窗体的加载事件。

2、在窗体类代码的上方,引用System.IO命名空间,这个引用的目的是为了简写窗体类中关于驱动器、文件夹和文件的代码。

3、先在窗体的加载事件中写如下代码:
Dim mynode As New TreeNode
mynode = TreeView1.Nodes.Add("我的计算机")
mynode.Tag = "mycomputer"
这段代码在TreeView中建立了一个节点--“我的计算机”
利用节点node的Tag属性来存放文件夹的完整地址,便于后面在ListView中查询该文件夹下的文件。

4、测试一下代码效果。

5、接着在以上代码下写:
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
Next
这段代码的作用是遍历所有驱动器,并将驱动器的名称添加到TreeView中,形成一个驱动器的树形结构图。

6、测试代码效果。

tree3.gif
昨天 17:33 上传
下载附件 (3.05 MB)

第四节:

1、写一个子程序或者函数用来添加驱动器下的各个文件夹在TreeView上的节点。该子程序如下:
Private Sub CreateTree(mynode As TreeNode, path As String)
Dim dir As DirectoryInfo = New DirectoryInfo(path)
Dim submynode As New TreeNode
For Each subdir As DirectoryInfo In dir.GetDirectories
submynode = mynode.Nodes.Add(subdir.Name)
submynode.Tag = subdir.FullName
Next
End Sub

2、在窗体加载事件中引用该子程序。

3、测试效果。该树形结构视图在驱动器下展开一层文件夹。要完成对所有文件夹的遍历还需要在该子程序中加入递归处理语句。

tree4.gif

 第五节:

1、在 CreateTree子程序的循环体中加一句递归调用语句:
CreateTree(submynode, submynode.Tag.ToString)
其作用是遍历所有文件夹,并增加相应的TreeView节点。

2、由于某些系统文件夹需要打开的权限,因此要排除这类文件夹。子程序中用if语句和try语句来完成这样的功能。

3、编写完毕后进行首次测试时,打开窗体的时间可能会比较漫长,一般第二次及以后的打开时间要短很多。由此可以得出一个结论,一次性的建立完整的文件夹系统的树形结构视图并非一个好的处理办法。正确的处理应该是先建立文件夹下的一到二层子文件夹的树形结构视图,其他向下的子文件夹,在点击节点的时候向下建立一到二层。这样就把建立的过程分散到点击查看的过程中了。不过本例不打算这样处理,因为除了文件夹系统外,其他的树形结构图的建立皆可用本例的处理思路采用递归的方法一次性处理完成。

tree_5.gif

tree5_2.gif

第六节:
1、建立TreeView的NodeMouseClick事件,在该事件中处理图标状态。在NodeMouseClick事件中写如下代码:
Dim mynode As TreeNode = e.Node
If mynode.IsExpanded = False Then
mynode.SelectedImageIndex = 0
Else
mynode.SelectedImageIndex = 1
End If

代码的作用是在点击节点时,判断该节点以下的节点是否展开,并据此动态设置不同的图标。

2、测试效果。

tree6.gif
第七节:

1、拖一个ListView控件到SplitContainer控件的右侧区域中,对ListView控件的属性进行一些设置。

2、测试效果。

tree7.gif


第八节:

1、写一个子程序用于在点击TreeView节点时,在ListView中呈现该节点对应文件夹下的子文件夹和文件。
Private Sub FilterListView(mynode As TreeNode)
....
End Sub

2、先写一段呈现子文件夹的代码:
Private Sub FilterListView(mynode As TreeNode)
ListView1.Items.Clear() '清空ListView
Dim dir As DirectoryInfo = New DirectoryInfo(mynode.Tag.ToString)
Dim item As ListViewItem = Nothing
Dim subitem As ListViewItem.ListViewSubItem() = Nothing
For Each subdir As DirectoryInfo In dir.GetDirectories
item = New ListViewItem(subdir.Name, 0)
Dim subitem As ListViewItem.ListViewSubItem() = Nothing
For Each subdir As DirectoryInfo In dir.GetDirectories
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)
Next
Next
End Sub

3、接着写一段呈现文件的代码:
Private Sub FilterListView(mynode As TreeNode)
ListView1.Items.Clear() '清空ListView
Dim dir As DirectoryInfo = New DirectoryInfo(mynode.Tag.ToString)
Dim item As ListViewItem = Nothing
Dim subitem As ListViewItem.ListViewSubItem() = Nothing
For Each subdir As DirectoryInfo In dir.GetDirectories
item = New ListViewItem(subdir.Name, 0)
Dim subitem As ListViewItem.ListViewSubItem() = Nothing
For Each subdir As DirectoryInfo In dir.GetDirectories
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)
Next

For Each File As FileInfo In dir.GetFiles
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)
Next
Next
End Sub

4、在TreeView1_NodeMouseClick中调用FilterListView。上述代码测试时会报错,原因是有些系统文件夹和文件需要权限,因此需要加上If和Try语句排除错误。

5、测试效果。

tree8.gif

示例文件:TreeView控件.rar(78.36 KB, 下载次数: 0)
昨天 17:27 上传
下载附件 (1.38 MB)

 

 

昨天 17:38 上传
下载附件 (529.02 KB)


Access软件网QQ交流群 (群号:483923997)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助