PowerBuilder中的TreeView生成目录树详解

目录:

1.TreeView的事件,函数,属性

2.TreeView的主要应用

3.TreeView生成目录树(动态)

一.TreeView的事件,函数,属性

TreeView控件可以以树型方式来组织项目,不仅显示直观、界面友好,而且项目的管理和操作更为方便,是当前比较流行的一个控件。
该控件的特点是在较小的空间可以分层次显示大量的数据,并且可以按照用户的要求检索数据。该控件具有以下功能:
通过可以展开或者折叠的节点遍历数据。
图形化和文本化的节点显示。
拖放操作。
包括剪切、复制和粘贴的节点操作。

■典型编程
通常TreeView控件用来让用户选择数据,或者进行数据的管理。比如,在一个人事管理软件中,使用部门、姓和名这样的三层结构查找数据就比较容易,而且可以通过拖拉来进行人事单位的变动。
首先,在窗口打开时创建该控件。下面的脚本向TreeView控件中首先添加(句柄值为0)最高级别的项目:

long tv_handle
//定义treeviewitem对象
TreeViewItem tvitem_department
tvitem_department.label="用户类型"//显示的内容
//tvitem_department.Data=dw_department2//内部数值
tvitem_department.children=true   	//拥有子项目
tv_handle=tv_department.insertitemlast(0,tvitem_department)  //在第一层插入此对象,返回句柄

long i
//在父级上添加子项
TreeViewItem tvitem_s1
tvitem_s1.label="会员"
tvitem_s1.children=false
i=tv_department.insertitemlast( tv_handle,tvitem_s1)

long j
TreeViewItem tvitem_s2
tvitem_s2.label="普通用户"
tvitem_s2.children=false
j=tv_department.insertitemlast( tv_handle,tvitem_s2)


上面的脚本添加所有一级项目,可以反复使用上面的脚本,直到添加完所有的一级项目。因为这些一级项目在程序运行之前就可以确定,所以可以直接添加。对于数据可能要发生变动的,应该从数据库中提取数据,通过循环来添加项目
【属性】
**TreeView属性
▲Visible
布尔类型,表示该控件是否可见。该属性的缺省值为True。
▲Enabled
布尔类型,表示控件是否可用。该属性的缺省值为True。
▲EditLabels
布尔类型,表示用户是否可以编辑控件中项目的标签。缺省值为False,不允许用户编辑标签。
▲HasButtons
布尔类型,表示是否在父项目的左边显示“+”和“-”按钮来表示是展开还是折叠状态。该属性的缺省值为True。
▲HasLines
布尔类型,表示在项目之间和父子项目之间是否有线相连。该属性的缺省取值为True。
▲LinesAtRoot
布尔类型,表示是否显示连接所有根项目的线条,该属性的缺省值为False。
▲DeleteItems
布尔类型,表示是否也许用户在控件中使用Delete按钮来删除项目。该属性的缺省取值为False。
▲DisableDragAndDrop
布尔类型,表示是否禁止用户进行拖拉操作。该属性的缺省值为True,不允许用户进行拖拉操作。
▲HideSelection
布尔类型,表示当TreeView控件失去焦点时选中的内容是否不保持高亮显示。该属性缺省值为True,表示当TreeView控件失去焦点时不高亮显示其中的选中项目。
▲ToolTips
布尔类型,表示是否显示工具栏气泡帮助。该属性的缺省取值为True。
▲CheckBoxes
布尔类型,表示项目左面是否显示复选框。缺省为False。
▲TrackSelect
布尔类型,表示项目是否进行选择跟踪,也就是当该属性取值为True,鼠标位于某个项目之上时,这项目改变颜色并且在项目下面显示下划线,表示当前项目正准备接收鼠标的操作。该属性的缺省取值为False。
▲FullRowSelect
布尔类型,表示当选中项目时是否整行显示。该属性的缺省值为False。
▲SingleExpand
布尔类型,表示是否只有一个项目可以展开。当该属性取值为True时,当前选中的项目展开,前面选中的项目自动折叠;当该属性取值为False时,可以有多个项目同时处于展开状态。该属性的缺省取值为False。
▲Border
布尔类型,表示该控件是否显示边框。该属性的缺省取值为True。该属性选中时,边框显示的样式还取决于BorderStyle属性的取值。
▲BorderStyle
枚举类型,表示边框的显示样式。该属性可用的取值有StyleBox!(矩形边框),StyleLowered!(嵌入边框),StyleRaised!(高抬边框)和StyleShadowBox!(阴影矩形边框)。
▲SortType
枚举类型,该属性用来规定控件中项目的排序规则。可用的取值有Ascending!(按字典顺序升序排列),Descending!(按字典顺序降序排列),UserDefinedSort!(根据用户在sort事件中的脚本进行排序)和Unsorted!(不排序)。
▲Indent
Integer类型,表示以PowerBuilderUnit为单位的子项目的缩进数。该属性的取值可以为负数,但是这样有可能便子项目左移出控件的边界。缺省取值为0。
▲Accelerator
Integer类型,取值为控件快捷链的ASCII码值。该属性保存了控件快捷键对应的ASCII码值。
**TreeViewItem属性
▲Bold
Boolean
项目标签上的文字以粗体显示
▲Childen
Boolean
项目是否拥有子项目,可以使用该属性拥有子项目,以便在以后触发ItemPopulate和ItemExpanding事件
▲CutHighLighted
Boolean
确定项目是否是要剪切的对象
▲Data
Any
用户想和项目关联的数据值
▲DropHighLighted
Boolean
确定项目是不是当前要拖拉的对象
▲Expanded
Boolean
确定项目是否展开
▲ExpandedOnce
Boolean
确定项目是否至少被展开过一次。当在控件的ItemPopulate事件中添加子项目时该属性很有用,可以用来判断是否已经添加了子项目
▲HasFocus
Boolean
判断项目是否获得当前焦点
▲ItemHandle
Long
项目的句柄。一个项目的句柄是惟一的,并且不同项目的句柄也不会有重复
▲Label
Label
项目的文本标签
▲Level
Integer
确定TreeView控件中的项目的层次。根层次的取值为1
▲OverlayPictureIndex
Integer
覆盖图像列表中的图像索引号
▲PictureIndex
Integer
和项目相连的图像在图标列表中的索引号
▲SelectedPictureIndex
Integer
当项目选中时与项目相连的图像在图标列表中的索引号
▲Selected
Boolean
确定项目是否被选中
▲StatePictureIndex
Integer
项目状态图标的索引号
【事件】
◆BeginDrag
handle
当用户在控件上单击鼠标并开始拖动时触发该事件
◆BeginLabelEdit
handle
当文本标签处于编辑状态并开始进行编辑时触发该事件
◆BeginRightDrag
handle
当用户在控件上单击鼠标右键并开始拖动控件时触发该事件
◆Clicked
handle
当用户点击控件时触发
◆Constructor
没有
当控件创建时触发。触发时机应该是包含控件的窗口打开之前
◆DeleteItem
handle
当删除项目时触发
◆Destructor
没有
当控件删除时触发。触发时机应该是在包含控件的窗口关闭时
◆DoubleClicked
handle
当用户双击控件时触发
◆DragDrop
source ,handle
当用户拖动一个对象到控件上并且松开鼠标时触发
◆DragEnter
source
当用户拖动一个其他对象进入控件时触发
◆DragLeave
source
当用户拖动一个其他对象离开控件时触发
◆DragWithin
source,handle
当用户拖动一个其他对象在控件中移动时触发
◆EndLabelEdit
handle,newtext
当用户结束标签的文本编辑时触发
◆GetFocus      
没有
控件获得焦点时触发。触发该事件时控件还没有激活
◆Help   
Xpos、Ypos
当用户点击F1按钮或者其他方式要获取帮助时触发
◆ItemCollapsed
handle
当控件的项目折叠后触发
◆ItemCollapsing
handle
当控件中的项目正在折叠时触发
◆ItemExpanded
handle
当控件的项目展开后触发
◆ItemExpanding
handle
当控件的项目正在展开时触发
◆ItemPopulate
handle
当控件中的项目正在打开其子项目时触发
◆Key
key,keyflag
当用户点击一个按钮时触发
◆LoseFocus
没有
控件失去焦点时触发。该事件触发时控件还是可用的
◆Other
wparm,lparm
当出现其他没有映射到PB消息上的消息时触发该事件
◆RightClicked
handle
当用户在控件上点击鼠标右键时触发该事件
◆RightDoubleClicked
handle
当用户在控件上双击鼠标右键时触发该事件
◆SelectionChanged
oldhandle,newhandle
某项目被选中时触发
◆SelectionChanging
oldhandle,newhandle
某项目被选中之前触发
◆Sort
handle1,handle2
当控件被排序时每次比较都触发该事件
【函数】
★AddPicture
向TreeView控件中添加图标或者位图。该函数的语法格式为controlname.AddPicture ( picturename )。
★AddStatePicture
向TreeView控件的状态图标列表中添加指定的位图或者图标。该函数的语法是controlname.AddStatePicture ( picturename )。
★DeleteItem
将TreeView控件中指定的项目及其子项目(如果有的话)都删除。函数的语法是treeviewname.DeleteItem ( itemhandle ),其中itemhandle保存的是项目的惟一句柄,在该控件的很多事件中都有handle这个参数,可以直接使用,也可以使用其他函数首先读取句柄。
★DeletePicture(s)
删除控件中指定索引号的图片,函数格式为controlname.DeletePicture ( index )。函数controlname.DeletePictures( )用来删除控件中所有的图片。
★DeleteStatePicture(s)
删除控件中指定索引号的状态图标,函数的格式是controlname.DeleteStatePicture ( index )。函数controlname.DeleteStatePictures ( )用来删除控件中所有的状态图标。
★EditLabel
该函数的语法是treeviewname.EditLabel ( itemhandle ),作用是将句柄为itemhandle的项目的标签置为编辑状态。
★ExpandAll
该函数的语法是treeviewname.ExpandAll ( itemhandle ),作用是将句柄为itemhandle的项目下的所有子项目展开。展开控件中的所有项目,可以对根级项目使用该函数。
★ExpandItem
函数的语法是treeviewname.ExpandItem ( itemhandle ),作用是展开句柄为itemhandle的项目。该函数ExpandItem仅展开指定的项目,而不像ExpandAll那样展开指定项目的所有子项目。
★FindItem
语法是treeviewname.FindItem(navigationcode,itemhandle),作用是查找和Itemhandle项目的相对位置为navigationcode指定模式的项目。参数navigationcode是一个枚举型变量,可用的取值如下所示。
取    值   含    义
RootTreeItem!   查找第一个根级项目,如果控件中还没有添加任何项目则返回-1
NextTreeItem!   查找处于同一级别的下一个项目,如果没有下一个项目则返回-1
PreviousTreeItem! 查找处于同一个级别的前一个项目,如果没有前一个项目则返回-1
ParentTreeItem!   查找父项目的句柄,如果是根项目则返回-1
ChildTreeItem!   查找第一个子项目,如果项目是折叠的,则将项目置为打开状态。
    如果没有子项目则返回-1
FirstVisibleTreeItem! 查找控件中第一个可视项目,注意滚动条距顶可视项目的位置
NextVisibleTreeItem! 查找下一个展开项目,如果下一个展开项目在控件的 可视项目的位置
PreviousVisibleTreeItem!查找前一个展开的项目
CurrentTreeItem! 查找当前选中的项目。如果当前没有选中的任何项目则返回-1
DropHighLightTreeItem! 查找最近被设置了DropHightLighted属性的项目
灵活运用如上所列的取值,可以很轻松地遍历TreeView中的所有项目。
★GetItem
函数语法是treeviewname.GetItem ( itemhandle, item),作用是将句柄由参数itemhandle指定的项目的数据检索到TreeViewItem结构的参数item中。
★InsertItem
函数语法是treeviewname.InsertItem(handleparent,handleafter,label, pictureindex ),作用是将标签为label的项目插入到控件中,插入位置在handleparent指定句柄的项目之下作为它的子项目,句柄为handleafter同级项目的后面。该函数还有另外一种语法格式是treeviewname.InsertItem ( handleparent, handleafter, item ),作用是将TreeViewitem类型的变量item指定的项目插入到控件的指定位置,另外两个参数的含义和前面完全相同。
★InsertItemFirst
treeviewname.InsertItemFirst (handleparent,label,pictureindex )或者treeviewname.InsertItemFirst ( handleparent, item )都可以。前面一种语法中,插入的项目标签内容由label指定,图标由pictureindex指定。在后面一种语法中,插入项目的属性可以更详细地设定,插入的位置也是由handleparent参数指定。
★InsertItemLast
treeviewname.InsertItemLast(handleparent,label,pictureindex)或者treeviewname.InsertItemLast ( handleparent, item )两种语法格式,都可以将指定的项目插入到由参数handleparent指定的项目下并作为它的最后一个子项目。插入项目的属性或者由TreeViewItem类型的参数item详细设定,或者由label指定标签、pictureindex指定项目的图标。
★InsertItemSort
treeviewname.InsertItemSort ( handleparent, label, pictureindex )或者treeviewname.InsertItemSort ( handleparent, item )两种语法格式,都可以将指定的项目按一定的排序方式插入到控件中。参数的含义和前面函数中参数的含义相同。
★SelectItem
函数语法treeviewname.SelectItem ( itemhandle ),作用是选中由句柄itemhandle指定的项目。
★SetItem
函数语法treeviewname.SetItem ( itemhandle, item ),作用是用TreeViewItem结构类型的参数item来修改itemhandle句柄指定的项目。

二.主要应用

生成一个非动态的目录树已经在上面介绍过了;

一、TreeView控件的信息构成及创建
    TreeView控件的基本信息单位是TreeViewItem项,它们按树状层次结构进行组织,每个TreeViewItem项一般具有下列主要属性:
    Data:Any类型数据,该项对应的内部值。
    Label:String型数据,该项对应的显示文字。
    Children:Boolean型数据,为Ture时表示该项还有下一层,为False时表示该项没有下层,不能被展开。
    PictureIndex:Integer型数值,该项对应的正常图标在图标队列中的编号。
    SelectedPictureIndex:Integer型数值,该项对应的选中图标在图标队列中的编号。
    通过TreeView控件查阅信息,首先要将信息转化成相应的TreeViewItem项,插入到TreeView控件中。这个工作可借助PB提供的函数来完成。
二、TreeView控件实现多级分类检索涉及的主要事件
    让TreeView控件和DataWindow配合,完成信息的多级分类检索,开发过程主要涉及下列三个TreeView事件:
    Constructor事件:该事件在控件创建时触发
    选中该事件主要用来插入第一层TreeViewItem项,这样用户一进入检索界面,第一层信息项就会出现在控件中。
    ItemPopulate事件:该事件在某TreeViewItem项第一次展开时触发,触发的同时系统会将该TreeViewItem项的句柄通过参数handle传递过来。
    选中该事件主要用来插入当前TreeViewItem项对应的下层信息项。选择这个事件插入下层信息项,开发时只需考虑插入本项的直属下层,不必去管下层的下层,可大大简化开发工作;另外,由于用户在执行查询时一般只涉及一些个别类,那些没有涉及的信息类没有展开,因而没有必要建立下层信息项,在这里做到了,因此改善了应用的执行效率。
    SelectionChanged事件:该事件在每次变更选择项后触发,触发的同时系统会将变更前后选择项的句柄通过参数oldhandle、newhandle传递过来。
    选中该事件主要用来控制DataWindow显示当前信息类的内容。这样每次在TreeView控件中选中一个信息项,DataWindow即刻将其详细信息显示出来。

三.创建目录树实例

 1.目录树需要一个数据窗口来实现,第一个根据根目录的treeviewitem的data值检索的一个目录

以部门表为例,我的两个数据窗口为dw_catalogdept

这两个数据窗口的data值和label值均为deptname

2.在treeview的constructor()中编写代码


long handle //定义插入节点的层级句柄,句柄是插入的第几条Long型数字

//如果要动态添加目录树,那么需要将数据窗口和数据存储相关联
treeviewitem ltvi_data  //定义一个树形视图变量
datastore lds_place   //定义第一个数据存储
int i,li_num_place  //定义循环的次数,就是数据的条数


lds_place=create datastore   //将数据存储与数据窗口对象关联
lds_place.dataobject="dw_catalogdept"
lds_place.settransobject(sqlca)

li_num_place=lds_place.retrieve("0") //检索数据  在此处赋值动态where索引参数
Messagebox("此parentid下的条数",li_num_place)

for i=1 to li_num_place      //循环插入第一层节点数据

 ltvi_data.label=lds_place.getitemstring(i,"DeptName")   //为树形视图标签赋值
 ltvi_data.data=lds_place.getitemstring(i,"DeptName")  //为树形视图DATA变量(ANY类型)定义一个想保存的数据
 //ltvi_data.pictureindex=1   //定义图片索引
 //ltvi_data.selectedpictureindex=2  //定义选中图标
 ltvi_data.children=true  //指定该节点仍有下级孩子节点
 handle=tv_department.insertitemlast(0, ltvi_data)  //插入节点 

 next

destroy lds_place   //释放定义的数据存储

3.在treeview的itempopulate(long handle)中编写代码


Messagebox("此行的句柄值",handle)
TreeViewItem tv_Current, tv_Parent
//由句柄获得TreeViewItem项,存入变量tv_Parent
GetItem(handle, tv_Parent)
string tvdata //父节点中存储的data值
tvdata=tv_Parent.Data
//然后根据该data值从数据库中查找该行的isunite的值,确定是否有添加项
//此事件中需要设置是否有展开项,通过数据库中的isunite字段来判断,O的话就是最后一层,无法添加展开;N的话就是可以添加展开
string _isunite,_deptcode
Select IsUnite,deptcode
Into :_isunite,:_deptcode
From HR_Department
WHERE deptname=:tvdata;

//进行层级判断,等于N,则可以添加,说明有子层
IF _isunite="N" THEN
	//从数据库中查询父id为此deptcode的行	

	//将数据窗口和数据存储相关联
	treeviewitem ltvi_data  //定义一个树形视图变量
	datastore lds_place   //定义第一个数据存储
	int i,li_num_place  //定义循环的次数,就是数据的条数
	
	
	lds_place=create datastore   //将数据存储与数据窗口对象关联
	lds_place.dataobject="dw_catalogdept"
	lds_place.settransobject(sqlca)
	
	li_num_place=lds_place.retrieve(_deptcode) //检索数据  在此处赋值动态where索引参数
	Messagebox("此parentid下的数据量",li_num_place)
	
	for i=1 to li_num_place      //循环插入第一层节点数据
	
	 ltvi_data.label=lds_place.getitemstring(i,"DeptName")   //为树形视图标签赋值
	 ltvi_data.data=lds_place.getitemstring(i,"DeptName")  //为树形视图DATA变量(ANY类型)定义一个想保存的数据
	 //ltvi_data.pictureindex=1   //定义图片索引
	 //ltvi_data.selectedpictureindex=2  //定义选中图标
	 ltvi_data.children=true  //指定该节点仍有下级孩子节点
	  tv_department.insertitemlast(handle, ltvi_data)  //插入节点 
	
	 next
	 destroy lds_place   //释放定义的数据存储
END IF

4.数据库中对应的表需要有一个字段来判断是否是最后一层,我的字段为isunite

5.核心步骤:通过itempopulate事件中,参数为选中节点的handle值,

然后通过GetItem,获得此handle对应的treeviewitem,进而获得相应的data和label,

然后将data作为查询的条件,查询数据库;

猜你喜欢

转载自blog.csdn.net/ClearLoveQ/article/details/81510209