荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: huanghm (东方不败), 信区: Program
标  题: 实现多层次关系数据和主/细目型树状浏览器
发信站: BBS 荔园晨风站 (Tue Jun  2 05:34:09 1998), 转信

  本文以一个多媒体档案管理的应用系统为例,介绍了
利用PowerBuilder 5.0的Tree—View、DataStore和DragD
rop等高技术手段进行信息系统中常见的多层次关系的主/
细目数据快速浏览检索的实现方法。该例中的对象设计及
其相应事件脚本均已调试运行通过,在其他类似应用项目
的数据检索中具有一定的通用性。

  1.使用数据存储的树状浏览器的实现

  定义一个主窗口,在其上设置一个TreeView控件tv—
1,利用两个后端数据存储(DataStore)对象ds—1、ds
—2分别连接两个数据窗口对象dw—ajml和dw—wjml,用来
提取具有层次关系的两个数据库表(案卷目录表和文件目
录表)中的纲要数据。给该窗口打开事件编写脚本程序,
使树状浏览控件tv—1具有“案卷年度”、“案卷题名”
、“文件题名”三层树状显示结构,如图1左半部所示。程
序如下:



  Window:W—main(主窗口,注:脚本中所有未定义变
量均为全局变量,下同。)

  //Script for: open event

  datastore ds—1,ds—2

  ds—1=create datastore ds—1.dataobject=
″dw—ajml″

  ds—1.settransobject(sqlca) ds—1.retrieve()


  ds—2=create datastore ds—2.dataobject=
″dw—wjml″

  ds—2.settransobject(sqlca) ds—2.retrieve()


  long xtn,xtnn int row1,row2

  treeviewitem xtt int i,k

  string ajhm,lnd tv—1.setredraw(fal
se)

  tv—1.deleteitem(xt) xtt.label=″案卷
年度″

  xtt.pictureindex=1 xtt.selectedpicture
index=1

  xt=tv—1.insertitemlast(0,xtt)

  row1=ds—1.rowcount() row2=ds—2.rowcount(
)

  for k=1 to row1 step 1

  nd=ds—1.getitemstring(k,″nd″)

  if nd<>lnd then

  xtt.label=nd xtt.pictureindex=4

  xtt.selectedpictureindex=4

  xtn=tv—1.insertitemlast(xt,xtt)

  for i=1 to row1 step 1

  ajhm=ds—1.getitemstring(i,″zjbh″)

  if nd=ds—1.getitemstring(i,″nd″)     t
hen

  xtt.label=string(i,″000″)+ds—1.getitemstri
ng(i,″ajtm″)

  xtt.pictureindex=2

  xtt.selectedpictureindex=2

  xtnn=tv—1.insertitemlast(xtn,xtt)

  for j=1 to row2 step 1

  if ajhm=ds—2.getitemstring(j,″zjbh″)
then

  xtt.label=string(j,″000″)+ds—2.getitemstri
ng(j,″wjbt″)

  xtt.pictureindex=3

  xtt.selectedpictureindex=3

  tv—1.insertitemlast(xtnn,xtt) end if


  next end if

  next lnd=nd else lnd=nd end if

  next tu—1.stredraw(true)

  在窗口中再设立一个“展开”命令按钮(cb—1),用
于对TreeView中的层次型纲要数据一次性全面展开,只需
对其clicked事件写一句脚本:

  tv—1.expandall(xt)

  2.利用拖放技术进行细目数据显示

  在主窗口TreeView右边并列设置一个数据窗口控件dw
—1,该控件用来显示两个分级数据表中某条记录的详细
信息,根据用户拖动的是TreeView中的“案卷题名”还是
“文件题名”决定提取哪个表中数据,为此需在TreeView
的拖动开始事件中对所选数据进行判断。若是选中了“案
卷年度”,则禁止拖动;若选中了“案卷题名”,则使数
据窗口控件dw—1连接案卷信息数据窗口对象(dw—ajml),
并且共享数据存储对象已提取出的数据信息,根据选中的
纲要数据将数据窗口控件中的数据行滚动到所选行号并显
示其详细信息;若选中的是“文件题名”,则使dw—1连
接文件信息数据窗口对象(dw—wjml),同样以共享数据存
储的办法显示相应的文件详细信息,程序最终运行界面如
图1所示。这个过程需要分别对tv—1控件的拖动开始(beg
indrag)和dw—1控件的拖动释放(dragdrop)事件编制脚
本程序。

  TreeView:tv—1(树状浏览控件)

  //Script for: begindrag event

  this.dragauto=true

  treeviewitem tree

  getitem(handle,tree)

  if tree.level=4 then yky=3 i—s=handl
e

  else if tree.level=3 then yky=2 i—s1=han
dle

  else this.drag(cancel!) end if

  end if

  在数据窗口控件dw—1“拖动释放”事件的脚本程序
中进行数据窗口对象的选择和数据行的滚动,程序如下:

  DataWindow:dw—1(细目显示数据窗口控件)

  //Script for: dragdrop event

  treeview treeview—object treeviewite
m tree

  treeview—object=draggedobject() choose case
yky

  case 3

  treeview—object.getitem(i—s,tree)

  dw—1.dataobject="dw—wjml" dw—1.title="文
书文件信息"

  dw—1.settrans(sqlca) ds—2.sharedata
(dw—1)

  long i,t

  i=long(left(tree.label,3))

  dw—1.scrolltorow(i)

  case 2

  treeview—object.getitem(i—s1,tree)

  dw—1.dataobject="dw—ajml"

  dw—1.title="文书案卷信息"

  dw—1.settrans(sqlca)

  ds—1.sharedata(dw—1)

  t=long(left(tree.label,3))

  dw—1.scrolltorow(t)

  end choose


--

※ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 192.168.0.25]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店