在vfp5.0中使用 treeview控件

来源:百度文库 编辑:神马文学网 时间:2024/04/27 19:05:47
黄明
当数据库中保存的数据之间具有层次隶属关系时(如表示各种社会组织结构的数据),就要用到能以树型结构显示并操作这类数据的控件:treeview。
treeview是windows95/98下的activex控件,包含在comctl32.ocx中,当安装了vfp5.0或vb5.0专业版中的activex后,可以在windows的system子目录下找到。
下面通过一个简单的例子介绍如何在vfp中方便地使用treeview。
先建立一个表,用来表示图1所示的结构。表结构及数据如表1。
单位代码字段按路径代码法编码,其中包含着数据库中各记录对应节点在树中的位置信息(也即保存着各记录之间的层次隶属关系)。这种代码能表示出从根节点到指定节点的整个路径。图1所示为一个三层结构,图中的数字即是相应单位的路径代码。
现在创建一个新表单,把tree.dbf添加到表单的数据环境中。添加treeview控件,添加方法:在表单控件工具栏中选择ole容器控件,添加到表单中,出现insert object对话框后,选insert control,在列表框里选microsoft treeview control。
给表单添加一个新方法:myparentnode用于获得树中某节点父节点的键值。
parameters nodecode
if right(nodecode,1)=′0′
return ′000′
else
return left(nodecode,2)+′0′
endif
在treeview的init事件里加入下面的程序,用tree.dbf中的记录填充treeview:
select tree
go top
this.nodes.add(,,′k′+tree.单位代码,rtrim(tree.单位名称))
skip
do while .not. eof()
this.nodes.add(′k′+thisform.myparentnode(tree.单位代码),4,′k′+tree.单位代码,rtrim(tree.单位名称))
skip
endd
go top
程序中add是nodes的方法,与列表框的additem方法类似,用于向treeview中添加节点。
为了实现treeview控件的导航功能(操纵数据库),需要在treeview的nodeclick事件中加入下面的程序:
lparameters node
select tree
go top
locate for tree.单位代码==substr(node.key,2)
thisform.refresh
在表单中添加一个编辑框,设置controlsource=′tree.概况′
现在运行表单,展开所有非叶节点,可以看到treeview已经按图1所示的层次关系显示出了表tree.dbf中的记录。单击treeview各节点,编辑框中的内容随着不同的节点而改变,说明上面的程序已使treeview具备了导航功能。
为了让读者能更好地在vfp中使用treeview控件,这里再介绍几点使用技巧和注意事项。
在vfp中使用treeview时,应充分利用node的key属性。可以为节点指定有意义的字符串作为它的key值,这正是存放路径代码的好地方。但要注意,不能用纯数字字符串作为node的key属性的值。否则treeview将产生无效键值错误。因此,上面的程序中在引用key属性的地方都合并了一个字符“k”。
当树中的节点比较多时,应对各节点排序,以方便用户检索。方法是设置各节点的sorted属性为真。
编程时,还可以利用treeview的imagelist属性和node的image属性为性质不同的节点指定不同的图标,美化用户界面。如在上面的例子中,向表单里添加一个imagelist控件(方法同添加treeview),在其属性对话框里插入四个图标,设置各图标的key属性分别为:root、open、close、leaf。在上述treeview的init事件里追加下面的代码:
this.imagelist=thisform.oleimage.object
this.nodes(1).image=′root′
for imagelist=2 to this.nodes.count
if this.nodes(imagelist).children>0
this.nodes(imagelist).image=′close′
this.nodes(imagelist).expandedimage=′open′
else
this.nodes(imagelist).image=′leaf′
endi
endf
与在vb中使用imagelist不同,当向vfp表单加入一个imagelist后,在设计状态下,并不能直接设置treeview的imagelist属性。解决的办法是在程序中指定treeview的imagelist属性,并应设置为包容imagelist的ole容器控件的object。
表1 表名为tree.dbf 单位名称
(字符型,长度20) 单位代码
(字符型,长度3) 概况
(备注型)
总公司 000 memo
分公司1 010 memo
人事部 011 memo
开发部 012 memo
生产部 013 memo
分公司2 020 memo
人事部 021 memo
经营部 022 memo

图1 某公司的组织结构