Office中国论坛/Access中国论坛

标题: 【VB.NET小品】TreeView控件设计方法详解(一) [打印本页]

作者: todaynew    时间: 2012-4-1 17:24
标题: 【VB.NET小品】TreeView控件设计方法详解(一)
本帖最后由 todaynew 于 2012-4-2 13:12 编辑

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

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

[attach]48844[/attach]

第一课示例文件:[attach]48826[/attach]

下一课
作者: todaynew    时间: 2012-4-1 17:24
本帖最后由 todaynew 于 2012-4-1 17:27 编辑

第一节:

1、创建一个Windows项目;

2、在Windows窗体上,拖入一个SplitContainer控件。SplitContainer控件是一个容器控件,该控件分为左右两个区域,每个区域可放置一个其他控件。VS中有许多种容器控件,这些控件简化了窗体的排版。

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

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

[attach]48827[/attach]
作者: todaynew    时间: 2012-4-1 17:24
本帖最后由 todaynew 于 2012-4-1 17:31 编辑

第二节:

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

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

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

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

[attach]48828[/attach]
作者: todaynew    时间: 2012-4-1 17:25
本帖最后由 todaynew 于 2012-4-1 17:33 编辑

第三节:

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、测试代码效果。

[attach]48829[/attach]
作者: todaynew    时间: 2012-4-1 17:25
本帖最后由 todaynew 于 2012-4-1 17:36 编辑

第四节:

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

[attach]48830[/attach]
作者: todaynew    时间: 2012-4-1 17:25
本帖最后由 todaynew 于 2012-4-1 17:39 编辑

第五节:

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

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

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

[attach]48831[/attach]

[attach]48832[/attach]
作者: todaynew    时间: 2012-4-1 17:25
本帖最后由 todaynew 于 2012-4-1 17:40 编辑

第六节:
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、测试效果。

[attach]48833[/attach]
作者: 风中漫步    时间: 2012-4-1 17:27
木有图啊,斑竹.NET太大,偶的机器跑不动,给个图看看吧
作者: todaynew    时间: 2012-4-1 17:37
风中漫步 发表于 2012-4-1 17:27
木有图啊,斑竹.NET太大,偶的机器跑不动,给个图看看吧

忒着急了吧?
作者: ycxchen    时间: 2012-4-2 10:25
老汉版主是个实实在在的多产编程高手!
作者: jc2016    时间: 2013-8-21 15:37
学习再学习
作者: 软件下载    时间: 2013-11-1 20:07
对了,用函数倒也是个办法,我的数据库里有十多个表,现在想实现treeview自动加载各表名称后,再根据用户选择动态加载第一、二、三子节点,就是说第二子节点可以是“姓名”,也可以随时改成“性别”,最大的问题就是3个子节点之间的关系很难弄,需要环环嵌套,目前用了最笨的办法,就是rs.open 第一级后,再rs1.open第二级...,感觉很繁琐,打算换成函数试试
作者: leonshi    时间: 2013-11-3 11:17
学习下




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3