LabVIEW 树形控件
/*
7月31日更,解决了以下问题:
1、选项卡“报文日志”中的树形控件避免重复添加。方法是判断前一个节点的tag是否是已有节点的tag值(假设是Mote 1)再加上后缀"_1"(即为Mote 1_1),若存在tag为Mote 1_1的节点,调用节点方法删去该节点。
2.选项卡“网络拓扑”中节点接入与否的指示灯亮了之后又灭的问题,这个问题与解析报文显示控件簇的初始化是一个问题,解决方法是在最开始即写入字符串"CLEAR"用于表示清空显示控件簇,这样避免了使用全局变量,也避免了必须使用一个大VI的问题。
3、树形控件重复添加问题,现象是Mote 1~Mote 8没问题,然后Mote 8之后又是Mote 1。。。等等。针对这个问题,使用了“首次调用”这个控件。
*/
LabVIEW的树形控件以树型结构显示信息,每个节点带细节描述列。可以显示该节点的其它信息。如下图所示
控件的常用属性、方法、事件可以很方便的从LabVIEW的帮助或者编写简单的Demo获取,这里就不再赘述。
只是有一点需要注意,控件属性结构上显示的字符是控件的Left Cell String,可以重复,再控件内部管理这些节点是用Tag属性,该属性为字符串类型,不可重复,如果增加节点时不设置该属性,LabVIEW会默认将Left Cell String作为Tag,遇到重复的情况以”下划线加数字”区分。如“张三_1”。在控件的方法、事件中获取到节点值都是控件的Tag。
3、常见操作的实现方法
3.1 增加节点
使用控件的 Add Item 方法,如图所示:
如果只是增加一个节点作为树的最后一个节点,可以使用Add Item To End 方法。
使用控件的delete Item 方法
Delete children 代表删除父节点是否要删除子节点。如果不删除子节点,子节点将往上移动一层替代原父节点的位置。如果该节点没有子节点而要求删除,将会产生错误。所以删除时最好先检测是否有子节点。若tag连接空字符串,则删除树形结构所有节点。
3.3 节点的移动
LabVIEW 的树型结构控件节点的界面拖拽代码不需要设计者编写,只需要设置Allow
Draging ,Allow Draging of Parant Items ,Allow Draging Between Items 属性即可。
如果在运行时需要由程序移动节点,使用方法Move Item 即可
程序中要展开,收合节点使用Open/Close方法
3.4 获取当前用户选中的节点
要获知当前用户选中的节点需要使用该控件的事件(ValueChange)
其中NewVal是当前选中节点的Tag,OldVal 是前一次选中节点的Tag
LabVIEW Tree Control 提供节点的查找方法有
Get Child | 获取父节点的第一个孩子节点 |
Get Next | 获取节点同一层次的下一个节点 |
Get Parent | 获取节点的父节点 |
Get Path | 获取当前节点从上之下的父子节点关系,从顶节点开始,到目标节点的所有父系节点(包括当前节点),结果放于字符串数组中 |
3.6 节点的遍历
看了节点的查找方法后,我们不禁要问,难道我要全面遍历节点需要通过这些方法来编写复杂的遍历代码吗?答案是否定的。Tree Control有个属性是Display Items ,按照先序遍历顺序将所有节点的Tag存储在字符数组中,相当于delphi Tree Control 的Items。可以通过对数组的遍历实现对树节点的全面访问。
前面提到了该控件内部管理树是通过Tag管理,界面显示与Tag无关,Tree Control管理界面显示的内容类似Grid,每一个格子为一个单元,可以设置其属性,也可读出值。
3.7.1 读取left Cell String 或Child Text的值
使用两个属性节点,首先将要读取的格子置为Active(使用Active Item Properties和Active Cell Properties),再读取Active Cell String 即可。
如果修改Item的Tag,可以使用方法节点 Set Tag,如果修改Left Cell String或者Child Text方法有二:
方法一:将该Item删除再添加。
方法二:仿照3.7.1
3.8 控件内容运行时修改
我们不难发现,该控件可以在设计时修改值,再进行增加节点,填入节点内容等等操作,但是当程序运行时却不能由用户修改Cell里的值。也就是不具备输入功能。网站上LabVIEW官方的说法是我们目前使用的包是Base Package 。而要进行这项操作需要Full Package ,或Professional package 支持。如果项目中不需要用户在树型控件中输入就不升级了。