娄七明,杨波,李颖芳
(红河学院工学院,云南蒙自661100)
数据窗口显示栏目通用定制窗口的设计及应用
娄七明,杨波,李颖芳
(红河学院工学院,云南蒙自661100)
首先讨论了PowerBuilder中如何根据用户需求实现数据窗口中显示列的动态控制方法,然后结合实例设计了一个界面友好、通用的数据窗口显示栏目定制窗口。
PowerBuilder;数据窗口;数据存储;信息系统
通常一个信息系统的用户来自不同的工作岗位和工作部门,这些用户在查询信息或制作报表时的需求也不尽相同。这就要求开发人员必须为信息系统提供一些可定制的功能,比如可以任意设置窗口中要显示的栏目,任意调整这些栏目的显示顺序。
PowerBuilder是一个非常优秀的基于数据库的应用程序开发工具,其数据的编辑、查询等都可以使用数据窗口来完成。本文首先就如何控制数据窗口中列显示与否的相关技术进行了探讨,然后设计了一个通用的数据窗口显示栏目定制窗口,很好的解决了上面的问题。
通常,控制数据窗口中的列是否显示,有以下三种方法。
方法一:修改数据窗口对象SQL语句的SELECT子句,把要显示的列加入,不显示的列删除,以建立新的查询语句,重新从数据库检索数据,从而实现列的显示定制。采用这种方法分如下三个步骤:
①获得数据窗口对象的SQL代码,可以使用GetSQLSelect方法来实现,语法如下:
strsql=dwcontrol.GetSQLSelect()
②对获得的SQL代码(变量strsql中)进行相应的修改,修改后和相应数据窗口对象进行绑定,可以使用SetSQLSelect方法实现,语法如下:
dwcontrol.SetSQLSelect(strsql)
③使用Retrieve方法重新检索数据。
这种方法一方面必须从数据库重新检索数据,效率较低;另一方面要保证数据窗口中各列的显示属性相同,需要编写大量的代码,且代码的通用性较差。
方法二:通过设置数据窗口对象的列及其标题的visible属性来实现[3]。需显示的列及其标题的visible属性设置为true,不需显示的列及其标题的visible属性设置为false。可以使用modify方法实现,语法格式如下:
dwcontrol.modify(c_name+’_t.visible=true’)//设置列标题可见
dwcontrol.modify(c_name+’.visible=true’)//设置列可见
dwcontrol.modify(c_name+’_t.visible=false’)//设置列标题不可见
dwcontrol.modify(c_name+’.visible=true’)//设置列不可见
采用这种方法不需要从数据库重新检索数据,效率较高,但是会打乱数据窗口对象中列的显示顺序,尤其是当设置数据窗口对象中包含第一列在内的数列不可见时,将会出现一些空位,很难控制。
方法三:通过设置数据窗口对象列的width属性来实现。修改不需要显示列的width属性值为0,其他字段的width属性不变,可以使用modify方法实现,语法格式如下:
dwcontrol.modify(c_name+’.width=’+string (wid))//设置列的宽度为wid
使用这种方法不需要从数据库重新检索数据,效率较高,因而在应用程序中经常被使用。下面将结合这种方法,设计一个通用的数据窗口显示栏目定制窗口。
图1 数据窗口d_itemselect
2.1 数据窗口对象的设计
设计基于外部数据源的Grid风格的数据窗口d_ itemselect,如图1所示。其中check列用于让用户选择要显示的字段,设置其显示风格为checkbox,属性为3D look;c_name列是字段名,设置其visible属性为false。
2.2 显示栏目定制窗口界面设计
设计Response类型的窗口w_itemset,在窗口上放置一个数据窗口控件(dw_1)和两个命令按钮(cb_ok和cb_cancel),然后设置dw_1的dataobject属性为d_ itemselect。如图2所示。
图2 显示栏目设置窗口w_itemset
2.3 窗口编码实现
(1)w_itemset的open事件的主要功能是接收从父窗口传来的待排序的数据窗口对象,并取出该数据窗口对象的所有列的列名、列标题及其宽度,把它们插入到dw_1中,以供用户选择要显示的栏目,代码如下:datawindow dw//定义数据窗口对象
dw=message.powerobjectpar m//取得从父窗口传来的数据窗口对象
int i,row
string c_name,c_head,wid,sel
dw_1.settransobject(sqlca)
for i=1 to integer(dw.object.datawindow.column. count)
c_name=dw.describe(’#’+string(i)+’.name’)//取列名
c_head=dw.describe(c_name+’_t.text’)//取列标题
wid=dw.describe(c_name+’.width’)//取列宽
ifwid=’0’then sel=’0’else sel=’1’//宽度为0不选择,否则选中
row=dw_1.insertrow(0)//插入新行
dw_1.setitem(row,’c_name’,c_name)
dw_1.setitem(row,’c_head’,c_head)
dw_1.setitem(row,’check’,sel)
next
(2)cb_ok的clicked事件的主要功能是根据用户设置生成不显示栏目对应的字符串,然后返回给父窗口,以便在父窗口中实现显示栏目的动态控制,代码如下:
string ret,c_name,sel
int i
for i=1 to dw_1.rowcount()
c_name=dw_1.getitemstring(i,’c_name’)
sel=dw_1.getitemstring(i,’check’)
if sel=’0’then ret+=c_name+’.width=0’+’~t’
next
closewithreturn(parent,ret)
(3)cb_cancel的clicked事件是关闭窗口并返回-1,代码如下:
closewithreturn(parent,’-1’)
至此,一个界面友好、通用的数据窗口显示栏目定制窗口设计完毕。
这里以一个进销存系统为例,介绍上面设计的数据窗口显示栏目定制窗口在产品信息查询中的应用。第一步,设计基于产品信息表(products)的grid风格的数据窗口对象d_products,如图3所示。
第二步,设计popup风格的窗口w_query,在窗口上放置一个数据窗口控件(dw_1),设置其dataobject属性为d_products;一个命令按钮(cb_setitem),设置其text属性为"栏目设置"。该窗口运行时效果如图4中箭头1所指窗口所示。
第三步:分别为窗口w_query的open、close事件及按钮cb_setitem的clicked事件编写如下代码。
(1)w_query的open事件的功能是检索数据,并把数据窗口对象的列名和列宽存入数据存储对象,以便改变显示栏目时使用。其中ds是一个实例变量,定义为:datastore ds。代码如下:
dw_1.settransobject(sqlca)dw_1.retrieve()
图3 数据窗口对象d_products
ds=create datastore
ds.dataobject=’d_cnamewidth’//设计数据存储的数据对象
ds.settransobject(sqlca)
string c_name
int i,row
dec wid
for i=1 to integer(dw_1.object.datawindow.column.count)
c_name=dw_1.describe(’#’+string(i)+’.name’)//取列名
wid=dec(dw_1.describe(c_name+’.width’))//取列宽
row=ds.insertrow(0)
ds.setitem(row,’c_name’,c_name)
ds.setitem(row,’width’,wid)
next
(2)w_query的close事件的功能是释放数据存储ds,代码如下:
destroy ds
图4 产品信息查询窗口w_query
(3)cb_setitem的clicked事件的主要功能是打开显示栏目设置窗口,并把要设置显示栏目的数据窗口传给w_itemset。用户设置完显示栏目后,接收传回的显示栏目定制信息,并根据该信息修改相应栏目的列宽,然后重画数据窗口对象,实现显示栏目的动态控制。代码如下:
openwithpar m(w_itemset,dw_1)//打开栏目设置窗口,进行设置
string ret,c_name
dec wid
int i
ret=message.stringpar m//返回显示栏目定制信息
if ret<>’-1’then
dw_1.setredraw(false)//关闭数据窗口对象的重画功能
for i=1 to ds.rowcount()
c_name=ds.getitemstring(i,’c_name’)
wid=ds.getitemdecimal(i,’width’)
dw_1.modify(c_name+’.width=’+string(wid))//修改相应栏目的宽度
next
dw_1.modify(ret)
dw_1.setredraw(true)//打开数据窗口对象的重画功能,重画数据窗口
end if
openwithparm(w_itemset,dw_1)//打开栏目设置窗口,进行设置
string ret,c_name
dec wid
int i
ret=message.stringparm//返回显示栏目定制信息
if ret<>’-1’then
dw_1.setredraw(false)//关闭数据窗口对象的重画功能
for i=1 to ds.rowcount()
c_name=ds.getitemstring(i,’c_name’)
wid=ds.getitemdecimal(i,’width’)
dw_1.modify(c_name+’.width=’+string(wid))//修改相应栏目的宽度
next
dw_1.modify(ret)
dw_1.setredraw(true)//打开数据窗口对象的重画功能,重画数据窗口
end if
至此,代码设计完毕。运行时单击"栏目设置"按钮,弹出显示栏目设置窗口,效果如图4中箭头2指示所示。若按图4进行设置,不显示品种、型号、产地,则单击"确定"按钮后,运行结果如图5所示。
图5 运行结果
该工作完成后,可以将d_itemwidth、d_itemselect、w_itemset、w_query放入一个PBL库中。使用PB开发应用程序时,只需要包含该PBL库,然后创建继承于w _query的窗口,修改数据窗口控件dw_1的dataobject属性,不需要额外编写代码,就可以实现相关数据窗口对象显示栏目的定制,实现了代码的重用,提高了应用程序的开发效率。
[1]李群先.一种在Power Builder数据窗口中实现字段名称动态显示的方法[J]现代计算机,2005(04):98-100.
[2]杨昭.PowerBuilder9.0数据窗口技术[M]北京:中国水利水电出版社,2004.
[3]柯建勋,张涛,邵亮.PowerBuilder9.0进阶开发篇[M]北京:清华大学出版社,2003.
[责任编辑 张灿邦]
Design and Application of a GeneralD isplayColumn Custom ization W indow for DataW indow
LOU Q i-m ing,YANG Bo,LI Ying-fang
(Department of Engineering,Honghe University,Mengzi 661100,China)
First discussed the methods of control display columns ofDataW indow dynamically in PowerBuilder to user requirements,then designed a generalwindow to customize display columns of DataW indow with user-friendly interface.
Power Builder;DataW indow;DataStore;Infor mation System
book=8,ebook=190
TP31
A
1008-9128(2010)04-0063-04
2010-06-17
娄七明(1976-),男,云南石林人,讲师,主要从事M IS系统应用研究.