第一小时:学习直接用代码将数据填充到树控件中。
为什么要先学习直接用代码将数据填充到树控件中?因为这种方法是最简单的,代码也最容易理解,学习树控件,先将这个学会,已经掌握了一半,所以先不要急着想怎么将表中的数据填充到树控件中,在第一小时里,树控件和表完全没有关系。
目的:我们要在树控件中建立如下的一个3层级关系
水果
|
|__苹果
| |__红富士
| |__国光
|
|__葡萄
|__红提子
|__青提子
解释:水果包含2种,一种是苹果,一种是葡萄,苹果又包含2种,一种是红富士,一种是国光,葡萄也如此。
在这里:“爷”是水果,“父”是苹果,葡萄,“子”是红富士,国光,红提子,青提子。概括如下:
爷(只能有一个):水果
父(这里有2个):父1:苹果;父2:葡萄
子(这里有4个):子1:红富士(父1苹果的子);子2:国光(父1苹果的子);子3:红提子(父2葡萄的子);子4:青提子(父2葡萄的子)
1、新建一个窗体,在窗体上放置两个控件,一个是Treeview,一个是Imagelist
如何找到这两个控件?
Treeview控件在“工具箱”的榔头加扳手图标(其他控件)中选“Microsoft Treeview Control,Version 6.0"
Imagelist控件在“工具箱”的榔头加扳手图标(其他控件)中选“Microsoft Imagelist Control,Version 6.0"
Treeview控件大家都明白干什么用的,Imagelist控件是干什么用呢?原来这个控件是放图标用的,如果你想在树控件中显示图标的,这个图标都将储存在ImageList控件中。
2、设置这两个控件的属性
首先要讲清楚控件的属性设置有2种,一种是设置这个控件在ACCESS中的属性,比如名称等。一种是设置这个控件本身的属性。要设置这个控件在ACCESS中的属性,选中控件后按鼠标右键选“属性”就可以了。跟我们平时设置文本框什么的一样。要设置这个控件本身的属性,只要双击这个控件就可以了。
1)设置Treeview控件在ACCESS中的名称属性,将名称设置为“Treeview"
2)设置Imagelist控件在ACCESS中的名称属性,将名称设置为“Image"
2)设置Imagelist控件本身的属性,双击控件后,在弹出来的设置框中选“Images",单击“Insert Picture"按钮,在你电脑中选择你需要的图标。在“Key:”栏中填入“K1”。其他默认设置不用改。
3)设置Treeview控件本身的属性,双击控件后,在弹出来的设置框中选“General”,在这个选项面版中有很多项设置,大多数是设置树控件的显示格式,你自己慢慢研究。这里我们将第一项“Style"选7,在第五项“Imagelist"选项中将我们放置的Imagelist控件“Image"选上。这项设置就将图标和树控件联系了起来。
3、写代码将数据填充到树控件中
代码写在哪里?我们希望窗体一打开,数据就自动填充在树控件中,所以这个代码就写在窗体的加载事件中,代码及解释如下:
VBScript code复制代码
Private Sub Form_Load()
'* -----------------------------------------------------------------
'*用代码将数据填充到树控件中
'* -----------------------------------------------------------------
Dim Nodeindex As Node
'*------------------------------------------------------------------
'*解释:定义Node
'*Node是树控件的对象
'*每个Node都有三个东西,图标,文本,索引值
'*图标和文本都是实际显示出来的,索引值是隐含的
'*------------------------------------------------------------------
'设置最顶级的“爷”:
'* ---------------------------
Set Nodeindex = TreeView.Nodes.Add(, , "爷", "水果", "K1")
Nodeindex.Sorted = True
'*------------------------------------------------------------------
'*树控件填充数据的方法是Nodes.Add
'*括号内是Add方法的参数
'*在这里“爷”是索引值,“水果”是将显示的文本,“K1”是图标的索引值
'*Sorted是指Node的排序,True就是指采用排序,默认是按拼音
'*第一,二个参数是空的
'*具体的参数设置以后你可以慢慢详细研究
'*------------------------------------------------------------------
'设置第二级“父”
'* ---------------------------
Set Nodeindex = TreeView.Nodes.Add("爷", tvwChild, "父1", "苹果", "K1")
Nodeindex.Sorted = True
Set Nodeindex = TreeView.Nodes.Add("爷", tvwChild, "父2", "葡萄", "K1")
Nodeindex.Sorted = True
'*------------------------------------------------------------------
'*第一个参数“爷”是指这一层对应上层“爷”的
'*tvwChild参数是规定格式,指相对来说,这一层是爷的子层
'*“父1”是索引值,因为“父”有2个,而索引值是唯一的,所以要编号,用“父1”“父2”分开
'*“苹果”“葡萄”是要显示的文本,K1是显示图标的索引值
'*现在知道为什么在“爷”层设置时,第一,第二个参数是空的,因为这是最顶层
'*------------------------------------------------------------------
'设置第三级“子”
'* ---------------------------
Set Nodeindex = TreeView.Nodes.Add("父1", tvwChild, "子1", "红富士", "K1")
Nodeindex.Sorted = True
Set Nodeindex = TreeView.Nodes.Add("父1", tvwChild, "子2", "国光", "K1")
Nodeindex.Sorted = True
Set Nodeindex = TreeView.Nodes.Add("父2", tvwChild, "子3", "红提子", "K1")
Nodeindex.Sorted = True
Set Nodeindex = TreeView.Nodes.Add("父2", tvwChild, "子4", "青提子", "K1")
Nodeindex.Sorted = True
'*------------------------------------------------------------------
'*第一个参数“父1,2”是指这一层对应上层“父”的,但要注意对应的是“父1”还是“父2”
'*tvwChild参数是规定格式,指相对来说,这一层是父的子层
'*“子1”是索引值,因为“子”有4个,而索引值是唯一的,所以要编号,用“1,2,3,4”分开
'*“红富士”等是要显示的文本,K1是显示图标的索引值
'*------------------------------------------------------------------
End Sub
就这么多代码,总共十几行,就可以在树控件中显示数据了,很简单吧。第一小时结束。
第二小时:学习怎样将树控件和数据库中的数据绑起来
在第一小时里,我们学习了怎样直接用代码填充树控件,但在实际使用中,这种方法的应用性不大,只有将树控件与数据库中的数据结合起来,才能有真正的应用。其实绑定数据库的方法和直接用代码填充是大同小异的,我们要做的只是将Add的参数里,原来我们手工输入的变换一下,让程序知道去数据库中找数据。
目的:将数据库中的数据与树控件绑定
背景:我们想在树控件中显示销售客户的层级列表,这个销售客户的分层是这样的,先按“大区”,再按“省份”,最后到“客户”我们在数据库中建立了三个表,字段如下:
大区表:大区ID,大区名称
省份表:省份ID,省份名称,所属大区
客户表:客户ID,客户名称,所属省份
这三个表互相建立了关系
1、新建一个窗体,在窗体上放置两个控件,一个是Treeview,一个是Imagelist
2、设置这两个控件的属性在这里和第一小时唯一的区别是我们在Imagelist控件的设置时,导入了两个图标,一个KEY为K1,一个为K2,原来树控件的Node图标是可以变化的,我们准备某个项没有选中时的图标是一个没有打开的文件夹,选中时是一个打开的文件夹,以区别。
3、编写代码,如下:
VBScript code复制代码
Private Sub Form_Load()
'* -----------------------------------------------------------------
'* 用数据库表(查询也一样)中数据填充树控件
'* -----------------------------------------------------------------
Dim Rec As New ADODB.Recordset
Dim stRecQL As String
Dim Item As Integer
Dim i As Integer
Dim nodindex As Node
'* -----------------------------------------------------------------
'* 定义各类
'* -----------------------------------------------------------------
'设置最顶级的"爷"
'* ---------------------------
Set nodindex = TreeView.Nodes.Add(, , "爷", "销售客户", "K1", "K2")
nodindex.Sorted = True
'* -----------------------------------------------------------------
'*这里的设置跟第一小时里基本是一样的
'*但最后多了一个"K2"的参数,"K1"代表的是未被选中时的图标,"K2"代表是被选中后的图标
'*仔细观察一下,你会发现选中和没选中的图标是不一样的,一个是一个文件夹,一个是一个打开的文件夹
'* -----------------------------------------------------------------
'设置第二级"父"
'* ---------------------------
Rec.Open "大区表", CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdTableDirect
For i = 0 To Rec.RecordCount - 1
Set nodindex = TreeView.Nodes.Add("爷", tvwChild, "父" & Rec.Fields("大区ID"), Rec.Fields("大区名称"), "K1", "K2")
nodindex.Sorted = True
Rec.MoveNext
Next
Rec.Close
'* -----------------------------------------------------------------
'*第一行意思是打开一个表去寻找数据(查询也是可以的)
'*关键在与Add参数的变化
'*大家看第三个参数,在第一小时里,这里是"父1",这里用Rec.Fields("大区ID")来代替"1",意思是用表的编号来代替手工编号
'*第四个参数也是一样,直接用表中的名称字段来取代原来我们手工的命名
'* -----------------------------------------------------------------
'设置第三级"子"
'* ---------------------------
Rec.Open "省份表", CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdTableDirect
For i = 0 To Rec.RecordCount - 1
Set nodindex = TreeView.Nodes.Add("父" & Rec.Fields("所属大区"), tvwChild, "子" & Rec.Fields("省份ID"), Rec.Fields("省份名称"), "K1", "K2")
nodindex.Sorted = True
Rec.MoveNext
Next
Rec.Close
'* -----------------------------------------------------------------
'*不用再解释了吧
'*要注意的是,定义第一个参数的时候,不是用"父" & Rec.Fields("大区ID"),而是用"父" & Rec.Fields("所属大区")
'*这个意思是:用省份表中关联大区表的字段,而不是直接用大区表的ID
'* -----------------------------------------------------------------
'设置第四级"孙"
'* ---------------------------
Rec.Open "客户表", CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdTableDirect
For i = 0 To Rec.RecordCount - 1
Set nodindex = TreeView.Nodes.Add("子" & Rec.Fields("所属省份"), tvwChild, "孙" & Rec.Fields("客户ID"), Rec.Fields("客户名称"), "K1", "K2")
nodindex.Sorted = True
Rec.MoveNext
Next
Rec.Close
'* -----------------------------------------------------------------
'*到此你应该完全明白了
'* -----------------------------------------------------------------
End Sub
第二小时结束
第三小时:将树控件与窗体结合
我们做树控件,当然不可能单单为了显示层级数据,我们希望跟窗体结合,当我们单击树控件中的某个客户时,窗体上能相应的转到这个客户的资料。
目的:将树控件与窗体结合
1、我们还是沿用第二个小时里的例子,但在建立窗体时,将窗体的数据来源设为“客户表”,并在窗体中放置好客户表的字段。
2、写入如下代码:
VBScript code复制代码
Private Sub Treeview_NodeClick(ByVal Node As Object)
'* -----------------------------------------------------------------
'*树控件的鼠标点击事件为NodeClick
'* -----------------------------------------------------------------
Dim str As String
'* -----------------------------------------------------------------
'*定义一个筛选
'* -----------------------------------------------------------------
If Node.Text = "销售客户" Or Node.Key Like "父*" Or Node.Key Like "子*" Then
str = ""
'* -----------------------------------------------------------------
'*在第一小时里,我们说了Node有三个东西,图标,文本,索引值
'*文本就是text,索引值就是Key
'这里将就是说当我们点击"爷","父"或"子"层的时候,不筛选窗体
'*这个条件也可写成:If Node.key = "爷" Or Node.Key Like "父*" Or Node.Key Like "子*" Then
'* -----------------------------------------------------------------
Else
str = "[客户名称]='" & Node.Text & "'"
End If
Me.Form.FilterOn = True
Me.Form.Filter = str
'*按指定的条件进行窗体筛选
End Sub
明白了吧,所谓结合窗体,实际不过是进行窗体筛选而已。第三小时结束(5分钟也够了,哈哈)
学习很有乐趣,但写文章却很无聊,如果你通过这篇文章学会了树控件的基本使用,跟个贴吧,也好让我有点成就感。
这里有个源码实例,大家可以参考下。
http://www.newxing.com/Code/VB/Controls/TreeView_228.html
- VB TreeView控件使用详解
来源:http://www.newxing.com/Tech/Program/VisualBasic/TreeView_587.html 三小时快速掌握TreeView树状控件的使用.能不能掌握控件的 ...
- WebBrowser控件使用详解
原文:WebBrowser控件使用详解 方法 说明 GoBack 相当于IE的“后退”按钮,使你在当前历史列表中后退一项 GoForward 相当于IE的“前进”按钮,使你在当前历史列表中前进一项 G ...
- 串口通信-MSComm控件使用详解
串口通信-MSComm控件使用详解 2012年11月13日 09:35:45 他山之石可以攻玉 阅读数:37952更多 个人分类: 控件编程Delphi编程 MSComm 控件通过串行端口传输和接 ...
- Flash播放控件属性详解
Flash 播放控件属性详解 一.属性篇 1.AlignMode(读写) 语法:AlignMode As Long 说明:对齐方式(与SAlign 属性联动).当控件的长宽比例与影片不一致且WMo ...
- Android UI组件----AppWidget控件入门详解
Widget引入 我们可以把Widget理解成放置在桌面上的小组件(挂件),有了Widget,我们可以很方便地直接在桌面上进行各种操作,例如播放音乐. 当我们长按桌面时,可以看到Widget选项,如下 ...
- VC/MFC中的CComboBox控件使用详解
CComboBox控件详解 CComboBox控件又称作组合框控件,其有三种形态可供选择,1.简单组合框(Simple)2.下拉组合框(Drop-down)3.下拉列表式组合框(Drop-down l ...
- C#串口通信:MSComm控件使用详解
目 次MSComm控件两种处理通讯的方式CommPort属性RThreshold 属性CTSHolding 属性SThreshold 属性CDHolding 属性DSRHolding 属性Setti ...
- Android开发之基本控件和详解四种布局方式
Android中的控件的使用方式和iOS中控件的使用方式基本相同,都是事件驱动.给控件添加事件也有接口回调和委托代理的方式.今天这篇博客就总结一下Android中常用的基本控件以及布局方式.说到布局方 ...
- Android列表控件ListView详解
ListView绝对可以称得上是Android中最常用的控件之一,几乎所有应用程序都会用到它. 由于手机屏幕空间都比较有限,能够一次性在屏幕上显示的内容并不多,当我们的程序中有大量的数据需要展示的时候 ...
随机推荐
- 《Effective Java》读书笔记 - 8.通用编程
Chapter 8 General Programming Item 45: Minimize the scope of local variables local variables应该在他们要被用 ...
- ros the public key is not available
W: An error occurred during the signature verification. The repository is not updated and the previo ...
- md5值校验
使用哈希的md5给文件加指纹,如果文件被更改,指纹信息就会不匹配,从而确定文件的原值是否被改动. [root@b test]# md5sum a.txt > zhiwen.txt[root@b ...
- 四十三、jenkins启动时报错:consider increasing the maximum size of the cache. After eviction approximately [10,239] KB of data
jenkins启动时报错: consider increasing the maximum size of the cache. After eviction approximately [10,23 ...
- 阶段3 1.Mybatis_09.Mybatis的多表操作_5 完成user的一对多查询操作
定义List<Account> accounts,生成getter和setter 复制AccountTest类改名UserTest类 修改测试类 还没封装所以Account的list都是n ...
- RobotFramework 用例出错后继续操作
出错后退出 在默认情况下,当一个测试用例中的某个关键字返回错误时,这个测试用例就停止执行剩余的关键字.RF会继续执行下一个用例.这么做的好处是节省时间--反正这里出问题要返回来看了,再继续执行剩下的关 ...
- c# 匿名委托递归
Func<List<int>, int> GetVirtualCode = null; // 递归不能直接=,要赋初值.微软得优化啊,这语法糖不够甜 GetVirtualCod ...
- 解决 WordPress 后台加载非常缓慢/打不开问题
在新版的 WordPress 中,为了后台的美观度,开发者在页面上加入了 Google Web 字体,这本来会让英文显示更加精美.我们只要移除 Google 在线字体即可恢复原来的速度.在你的主题的 ...
- TCP中SYN洪水攻击
在查看TCP标识位SYN时,顺便关注了一下SYN Flood,从网上查阅一些资料加以整理,SYN洪水攻击利用TCP三次握手. 1.SYN洪水介绍 当一个系统(客户端C)尝试和一个提供了服务的系统(服务 ...
- (已实践)PLSQL本地还原Oracle数据库dmp文件
这个方法很烂,导致重装Oracle时候处处出现问题,不建议使用这个方法,除非你以后不再用Oracle这个软件了,这个方法很烂,再评论一下. 第一,启动服务,(如果数据库处于启动状态,那么略过这一步) ...