在vfp5.0中使用 treeview控件
黄明 当数据库中保存的数据之间具有层次隶属关系时(如表示各种社会组织结构的数据),就要用到能以树型结构显示并操作这类数据的控件: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 某公司的组织结构 |
|