浅谈PowerBuilder中TreeView的实现

.... PowerBuilder作为数据库的前端开发工具,以其全面的功能和优异的性能受到广大开发者的青昧。利用PowerBuilder不仅可以快速方便地与数据库交互,而且它提供了丰富的控制对象,能够设计出清晰美观的用户窗口界面,TreeView控制就是其中一例。TreeView控制项是以树型结构的方式显示有层次关系的数据。  
....添加并设置TreeView项 在PowerBuilder中新建或打开一个窗口,在Controls中选择TreeView控制项放置到窗口中。双击该控制打开属性对话框,主要设置以下几个属性页:
.... General:用来设置TreeView控制项的一些基本信息,如控制名、指定是否显示用以指示体系结构的线、是否包含按钮、指定边框类型等。  
.... Pictures:用来指定TreeView控制项各级的指示图片,如图1中的各委办、计委系统等单位类别为TreeView控制的第一层,它们下面所属的具体单位是第二层,它们分别标以不同的图片。在这里,可以在Picture Name框中键入图片文件名或从Stock Picture框中选择PowerBuilder提供的图片。  
.... State:TreeView控制项的状态图片,它显示在TreeView控制项的左侧,指示其所处的状态。
.....编写TreeView项处理程序 建立好TreeView控制项,希望它能按要求显示数据,就必须为它编写程序。要作到这一点,首先需要从数据库中查询出所需数据,然后在将这些数据生成TreeView控制项的树型结构。在PowerBuilder中与数据库交互的方式主要有以下三种:  
.... 使用Datawindow  
.... 使用DataStore  
.... 使用数据库游标
.... 由于从数据库中查询出的数据要用TreeView控制显示,所以利用后两种交互方式比较合适。下面我们就以图1所示的TreeView控制项为例,说明为TreeView控制项编写程序的步骤:  
.... 创建一个窗口,并在其上创建TreeView控制,控制名为tv_dw。  
.... 在窗口的Open事件中编写如下程序: //定义从数据库中查询数据的SQL语句
.... string ls_sql
.... ls_sql1="select bh,dwmc from p_dw where substr(bh,3,3)='000'"
.... string ls_lbbh,ls_dwlbmc
.... TreeViewItem ltvi_item
.... long ll_newitem
.... //利用游标查询数据
.... declare c1 dynamic cursor for sqlsa;
.... prepare sqlsa from :ls_sql;
.... open dynamic c1;
.... fetch c1 into :ls_lbbh,:ls_dwlbmc;
... //生成单位类别树根
.... do while sqlca.sqlcode = 0
.... ltvi_item.label = ls_dwlbmc
.... ltvi_item.data = ls_lbbh
.... ltvi_item.pictureindex = 1
.... ltvi_item.selectedpictureindex = 1
.... ltvi_item.children = True
.... ll_newitem=tv_dw.insertitemlast(0,ltvi_item)
.... fetch c1 into :ls_lbbh,:ls_dwlbmc;
.... loop
.... close c1;
.... 由于用TreeView控制浏览数据需要把查询结果生成TreeView的树型结构,这其中要经历查询和生成树型结构两个过程,因此如果要在一个事件中查询出所有数据并生成树型结构势必会影响程序执行效率,这在数据量较大的情况下尤为突出。为了降低这种影响,我们可以在打开带有TreeView控制的窗口时只生成并显示部分数据,然后在选中某项时生成并显示此项下的具体数据。例如在图1的例子中,在打开窗口时只生成并显示单位类别数据,当选中某一单位类别后再生成并显示此类别下的所有单位,这就需要用到TreeView控制的itempopulate事件。
.... 在tv_dw控制对象的itempopulate事件中编写如下程序:
.... //获得选中单位类别项的句柄
.... treeviewitem ltvi_rootitem
.... getitem(handle, ltvi_rootitem)
.... //定义Datastore对象 Datastore lds_dw
.... lds_dw = Create ds_dw
.... SetTransObject(lds_dw,SQLCA)
.... //查询选中单位类别下的所有单位
.... String
.... ls_dwlbbh ls_dwlbbh = left(ltvi_rootitem.data,2)
.... lds_dw.SetFilter("left(bh,2)='"+ls_dwlbbh+"' and mid(bh,3,3)<>'000'")
.... lds_dw.Retrieve()
.... //生成选中单位类别下的所有单位
.... Integer i
.... String ls_dwbh,ls_dwmc
.... treeviewitem ltvi_child
.... if not ltvi_rootitem.expandedonce then
.... for i=1 to lds_dw.RowCount()
.... ls_dwbh = lds_dw.GetItemString(i,"bh")
.... ls_dwmc = lds_dw.GetItemString(i,"dwmc")
.... ltvi_child.label = ls_dwmc
.... ltvi_child.level = 2
.... ltvi_child.data = ls_dwbh
.... ltvi_child.pictureindex = 2
.... ltvi_child.selectedpictureindex = 2
.... this.insertitemlast(handle, ltvi_child) next
.... //展开选中单位类别下的数
.... ltvi_rootitem.expandedonce = True
.... end if

....以上给出了PowerBuilder中TreeView的实现方法,它是最普遍、最常用的一种实现方法,其实,TreeView控制及其编程相对PowerBuilder中的其他控制项来说较为复杂,在生成的树型结构上的所有维护工作,如增加、删除、修改等都需要编程来完成,这就需要编写大量的程序代码,不过树型结构的简明直观的风格的确为程序增色不少,有兴趣的读者不妨试一试TreeView,相信一定不会令您失望的。

作者:不详