pb TreeView控件

pb TreeView控件

PowerBuilder中的TreeView 控件为树状游览,类似于WINDOWS的资源管理器,其特点是信息项呈树状层次结构,能更清晰地表现主、细目关系 ,操作非常方便。在应用中可将其与DataWindow 配合使用, 一个提供信息的分类体系,一个提供具体信息,达到珠连碧合的奇妙效果。它特别适用于多级信息的分类检索, 是多级菜单所无法比似的,它的表现形式深受程序设计人员和广大用户的喜爱,在许多应用软件中都能看到她的英姿。在PowerBuilder下,TreeView 控件的应用较其它控件要复杂得多,刚接触它时往往有些不知所措。但如果将它的机理搞清楚,掌握它也不是很难的事。下面我结合长白公司图书分类检索的实例,把TreeView 控件的使用方法和大家探讨一下。
  一、应用TreeView 控件的一般步骤
  1、 建立一个应用,并设好与数据库的接口,这是操作数据库的前提。
  2、 在应用中建一应用窗口W_1,在其上加入二个名为dw_3和dw_4的datawindow控制对象和一个名为TV_1的TreeView对象。
  3、 修改DW_3属性    General:把Datawindow object name填写一个已存在的名为DW_date的datawindow(注意:它与datawindow控制对象是不同的),用于生成 树视图项,将其Visible项设为不可见。
  4、 修改DW_4属性
  General:把Datawindow object name填写一个已存在的名为DW_TS的datawindow对象,用于显示查询出的具体内容。
  5、 编辑TV_1的属性
  TreeView的树视图项不能直接编辑,必须在Script中编写程序。
  Picture:在Picture Name中加入四个不同的图标,用于代表树视图中的两个层次(一、二级)、两种状态(未选、选中)。
  General:可根据具体应用设定是否选中,其中:
  Delete Items:运行中是否允许删除表项。
  Disable PragDrog: 运行中是否允许拖放表项。
  Edit Labels: 运行中是否允许单击表项来改变表项的标题。  

     Show Buttons:是否在表项放显示+-按钮,有示相对的扩展和收缩。
  Hide Selection:当该控件失去焦点时,选中项是否以高亮度显示。
  Show Line:表项间是否加一竖线。
  Lines At Root:所有根层表项是否用竖线连接。
  Indentation:子表项相对于父表项的向右缩进度。
  6、 编写TV_1的Script
  这里是TreeView控件的关键,也是难点。
  二、TreeView 控件的信息构成及创建
  树视图项TreeViewItem是TreeView 控件的基本信息单位,树视图项的生成一般有二种方法,一种是先生成根层视图项,再在应用中动态生成下级视图项,另一种是把全部树视图项一次和成。两种方法各有优点,请根据具体情况选用,本例中采用后一种方法。
  1、 树视图项TreeViewItem的主要属性
  Label:String 型,树视图项的显示信息。
  Data:Any型,树视图项的内部值。
  Level:Integer型,树视图项在树视图中级别。
  Children:Boolean 型,它决定该项是否有下一层(如图中书名)。
  PictureIndex:Integer 型,该项非选中时所用的图标在图标队列中的编号。
  SelectedPictureIndex:Integer型,该项选中时所用的图标在图标队列中的编号。   
      2、 生成TreeViewItem项用到的函数
  InsertItemFirst():将加入项作为第一项
  InsertItemLast():将加入项作为最后一项
  InsertItem():将加入项插入到指定项的后面
  InsertItemSort():按顺序放置。



    四个函数:   
    1.InsertItem()函数:
        Treeviewname.InsertItem(handleparent,handleafter,label,pictureindex)
        Treeviewname.InsertItem(handleparent,handleafter,item)
    InsertItem()函数在handleafter项后面插入一个列表项,并使handleparent项成为当前项的父项,这两个语法的区别是:前一语法格式只须指定当前项的标题:(lable)和使用的图片索引(Pictureindex);
后一种语法格式要求定义当前项的完整数据(在Item变量中).比较而言,前一种格式要求较少的信息,因此功能也弱些.
    各参数的意义为
    Treeviewname:树形视图控件的名称
    Handleparent :该项父节点项的句柄(一个长整数,每个节点都有一个唯一代表该节点的句柄),对第一层节点,该项的值为0.
    Handleafter:在同一层中句柄为Handleafter的项后面插入新项.
    Lable:当前项的标题,即显示在树形视图控件中的文字.
    Pictureindex:当前项标题前显示图片的索引号.
    Item: 一个完整的列表项,是个TreeViewItem对象.
    2.InsertItemfirst()
    InsertItemFirst()函数在指定父节点的层中第一个位置插入列表项,有两种语法格式 :   
     Treeviewname.InsertItemFirst(handleparent,label,pictureindex)       
     Treeviewname.InsertItemFirst(handleparent,item)
    父节点相同的项位于同一层中.InsertItemFirst()函数在指定层中插入一个新的列表项,并把它放在列表的第一个位置上.前一种语法格式只须指定当前项的标题(Lable)和使用的图片索引(Pictureindex),后一种语法格式要求定义当前项的完整数据(在Item变量中).函数中参数意义参见InsertItem()函数.
    3.InsertItemLast()
    InsertItemLast()函数在指定父节点的层中的最后位置插入列表项,有两种语法格式:
    a. Treeviewname.InsertItemLast(handleparnet,label,pictureindex)
    b.Treeviewname.InsertItemLast(handleparnet,item)
    该函数与InsertItemFirst()函数相似,只是在指定层的末尾插入列表项.
     各参数的意义参见InsertItem()函数
     4.InsertItemSort()
    该函数以排序方式在指定父节点的层中插入列表项, 有两种语法格式:
    1.Treeviewname.InsertItemSort(handleparent,label,Pictureindex)
    2.Treeviewname.InsertItemSort(handleparent,item)

    5.DeleteItem() 函数删除树形视图控件中指定的列表项,该函数的语法格式为 Treeviewname.DeleteItem(itemhandle)   
       如果有子项:则一同被删除.当Itemhandle值为0进,DeleteItem()函数删除树形视图控件中所有列表项.

    6.FindItem()函数,其语法格式为:
    Treeviewname.FindItem(navigationcode,itemhandle)




  3、 TreeView的常用事件
  Constructor: 该事件在控件创建时触发,可在这里构造TreeViewItem。
  Click:单击TreeViewItem项时,执行查询程序。
  Double Click: 双击TreeViewItem项时,执行查询程序。
  ItemPopulate 事件: 该事件在某TreeViewItem项首次展开时触发,触发的同时系统会将该TreeViewItem项的句柄通过参数handle 传递过来。它主要用来生成对应项的下层信息项。主要用于第一种方法。
  三、 事件代码
  1、树视图控件TV_1的constructor事件代码

integer li_rowcount,li_row
string li_current_dn,li_last_dn,li_current_ei,li_last_ei
//声明二个树视图的实例变量
treeviewitem itvi_level_one,itvi_level_two
//long ii_h_l_one
//long ii_h_l_two
dw_3.settransobject(sqlca)//dw_3
为隐含的数据窗口,存有生成树的数据
li_rowcount=dw_3.retrieve()//行数
dw_3.setsort("lb,pm")
dw_3.sort()
//生成树视图的各级树视图项
for li_row=1 to li_rowcount
li_current_dn=dw_3.object.lb[li_row]
//DW_3对象中"LB类别"
li_current_ei=dw_3.object.pm[li_row]
//DW_3对象中"PM品名"
if isnull (li_current_ei) then
li_current_ei=""
end if
if li_current_dn< >li_last_dn then
//IF LB不与一级视图项重复
//设置一级树视图项
itvi_level_one.label=dw_3.object.LB[li_row]
//视图项的显示信息
itvi_level_one.level=1 //级别
itvi_level_one.data=li_current_dn
//视图项的内部信息
itvi_level_one.pictureindex=1
//没选中时所用的图标序号
itvi_level_one.selectedpictureindex=3
//选中时使用的图标序号
itvi_level_one.children=(li_current_ei< >' ')
//树视图是否有下一级
ii_h_l_one=this.insertitemlast(0,itvi_level_one)
//将项加入到一级树的最后一项
end if
//设置二级树视图项
if li_current_dn< >li_last_ei then
if li_current_ei<>' ' then
itvi_level_two.label=dw_3.object.pm[li_row]
itvi_level_two.level=2
itvi_level_two.data=li_current_dn
itvi_level_two.pictureindex=2
itvi_level_two.selectedpictureindex=4
itvi_level_two.data=li_current_ei
itvi_level_two.children=false
ii_h_l_two=this.insertitemlast (ii_h_l_one,itvi_level_two)
//将项加入到二级树的最后一项
end if
end if
li_last_dn=li_current_dn//设比较项
li_last_ei=li_current_ei
next
  2、tv_1控件的clicked事件代码
string s1
treeviewitem ii
this.getitem(handle,ii)
s1=string(ii.label)
choose case ii.level
case 1
//过滤类别
dw_4.setfilter("lb='"+s1+"'")
dw_4.filter()
case 2
dw_4.setfilter("pm='"+s1+"'")
dw_4.filter()
//过滤书名
end choose

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值