当我们对数据的表现有以下要求时,我们可首先考虑使用树形视图控件:
* 显示层次结构中元素之间的关系;
* 元素在层次结构之间漫游(元素间的拷贝、移动等);
* 描述每个元素相关信息;
* 将大量数据检索的过程划分为若干步骤,只表现其中需要的部分。
在Powerbuilder中,对树形视图的编程是窗口中较为复杂的部分,它无法像数据窗口那样使用一条Retrieve()函数就可以将数据表现出来。下面我们结合树的数据结构及其存储和遍历,探讨一下树形视图的构建和应用。
1. 树的数据结构及其存储结构
树是一种常见的非线性的数据结构,使用非常广泛。一般人们用孩子表示法、孩子兄弟表示法(二叉树表示法)和双亲表示法来存贮一棵树。其中前两种表示法或因各结点不同构或冗余度太大,或因存贮量太大而不适合在PowerBuilder中应用,而数据库中表的结构和特性正与树的双亲结点表示法的要求相符合,因而最好是采用双亲节点表示法。
树的双亲节点表示法利用了每个节点(除根节点外)只有唯一的双亲的性质,每个结点的结构分为两个域,即Data域和Link域。Data域用以存储本节点的有关信息,Link域为指向双亲节点的指针。
2.数据库中表的设置
为了便于说明问题,我们以商品传销网为例,传销网中每个人都对应到树中的一个节点。我们把有关数据存储在表Persons中。
根据树的双亲节点表示法的特点,同时考虑到便于查询,将Data域分成本人代号(code)和本人姓名(name)两个字段,而Link域对应到上线代号字段(pcode)。虽然在关系型数据库中,数据的操作是以集合为基础的,而集合中的元素是没有顺序的,但在构建树形视图时必须一个一个地将节点添加进去,且PowerBuilder不支持指针型变量,因而我们在表Persons中增加一字段Handno,记录每个结点的句柄,配合Pcode字段,以实现"指针"的功能,其原理是:通过查找本结点的上线代号来查找其双亲结点的句柄号。由于树形视图等级结构非常明显,我们采用按层次遍历树,所以我们在Persons表中再增加一个字段Grade,便于按层次顺序构建树形视图。表Persons的结构如下表,主键为code列。当然可在表中设置一个或多个字段,以存储各结点的其他信息,但本文旨在说明问题,故不予考虑。
表Persons的结构如表1所示。
表1 Persons表的结构
| Column Name | Data Type | Width | Null | Dec | Default | 字段含义 |
| Code | Char | 8 | No | 代号 | ||
| Name | Char | 8 | No | 姓名 | ||
| Pcode | Char | 8 | Yes | 上线代号 | ||
| Grade | Integer | No | 1 | 层次 | ||
| Handno | Numeric |
20 | 0 | Yes | 1 | 句柄号 |
3.树形视图结构分析
在PowerBuilder中树形视图控件包括了树形视图(TreeView)和树形视图项(TreeViewItem)两个对象。其中树形视图对象可以在窗口画笔中通过点击鼠标的方式创建,而树形视图项则必须通过编程来声明及定义它们的属性。
在窗口画笔中用鼠标在窗口上放置了一个树形视图的控件后,可以认可将在窗口的这个位置采用树形视图来表现的一些信息;还可以通过设置这个控件的属性确定它是否可见、是否显示连线等基本属性。而这时运行这个窗口,看到的只是这个树型控件的空架子,其中没有任何数据。 树型控件的每一个数据项都是一个TreeViewItem,而这些树形视图项只能在程序中逐项加入。
将树形视图项加入到树形视图中的方法是使用InsertItem()系列函数中的一种,其中:
·InsertItemFirst()将加入项作为第一个子项;
·InsertItemLast()将加入项作为最后一个子项;
·InsertItem()将加入项放在指定的子项后面;
·InsertItemSort()按排序的顺序放置加入项。
4.树形视图(TreeView)和树形视图项(TreeViewItem)对象的常用属性
(1)树形视图项(TreeViewItem)对象的常用属性






