1 DropDownListBox的建立
PowerBuiler提供了非常便捷的DropDownListBox的设计方法,其中提示信息可通过几种途径获得:
. 在建立DropDownListBox时直接输入。当DropDownListBox中提供的提示信息固定且数量较少时一般采用该方法。
. 利用DataWindow构造 UserObject。当DropDownListBox中所要给出的提示信息内容较多且为某数据表(Table)的部分或全部内容时可采用该方法。设计时将提供信息的数据窗口(DataWindow)嵌入在DropDownListBox之后生成为User Object,并在应用程序的任意窗口内调用这个User Object,可达到提供相同提示信息的目的,具有较好的通用性。
. 利用DropDownListBox的构造事件。在DropDownListBox脚本(Script)的构造事件中通过DropDownListBox的添加函数AddItem(),既可在列表中填入固定的提示信息,亦可从数据表中根据条件获得提示信息。从数据表中获得提示信息的方法如下:
首先定义一个Cursor。该Cursor的定义可在脚本中进行,也可以在窗口的Instance Variables中进行;
在DropDownListBox脚本的选择构造事件(constructor)调用已定义的Cursor从数据表中取出数据并利用AddItem()函数将数据填入列表中。
利用该方法获得的DropDownListBox中的提示信息不仅可包含数据表中的某一项信息,而且还可以是表中若干项内容的组合,甚至在必要时通过几个Cursor的调用可从多个表中提取信息放入列表中,使其提供的提示信息更为丰富。
2 DropDownListBox中信息的动态更新
通过以上几种方法建立的DropDownListBox为应用程序的使用带来了极大的方便,在一般情况下可以满足信息辅助输入的需要。但是,在有些情况下,DropDownListBox中所提供的信息不仅仅作为输入的辅助信息,而且还会随所在窗口进行的不同操作而发生改变,这时应将变化的情况及时反映出来,作为用户进行下一步操作的正确依据,即应对DropDownListBox中的信息进行动态更新。为了达到这一目的,使用第三种方法更为有效。可按以下步骤进行:
(1) Cursor 的定义。如:
DECLARE c—getdbdbh CURSOR FOR
SELECT ckqkk.bianhao, ckqkk.sjsl, ckqkk.jss
FROM ckqkk
WHERE (ckqkk.cwbz is null or ckqkk.cwbz <> ′D′)
ORDER BY ckqkk.bianhao;
(2) 建立数组变量与DropDownListBox的对应关系。在Instance Variables中定义数组变量,利用Cursor从数据表中获得信息的同时将其写入数组中,数组元素的下标与信息在DropDownListBox的顺序一一对应。如:
Long nCount
String sNumber
Dec nTemp1, nTemp2
Long nRow
Open c—getdbdbh;
FETCH c—getdbdbh
INTO :sNumber ,:nTemp1, :nTemp2;
Do While sqlca.sqlcode = 0
nCount += 1
aDBDH[ nCount ] = sNumber
//材料编码
aSJSL[ nCount ] = nTemp1
//总入库数量
aJSSL[ nCount ] = nTemp2
//已结算数量
ddlb—4.Additem(sNumber + Space( 1 ) + String(nTemp1a - nTemp2 ) )
FETCH c—getdbdbh
INTO :sNumber , :nTemp1, :nTemp2;
Loop
Close c—getdbdbh;
通过上述程序段构造的DropDownListBox的提示信息是某种材料的编码和未结算数量(等于入库总数量-已结算数量),如在材料出库的窗口中使用该DropDownListBox,其中材料编码不会改变,而未结算数量则会随出库操作而发生变化,该项为更新的对象。为此,在完成材料出库操作的事件发生时应触发更新DropDownListBox的操作。
(3) 信息的动态更新。在PowerBuilder中未提供对DropDownListBox数据项进行修改的函数,但提供了插入与删除函数,为此,我们可借助这两个函数来实现动态更新的操作。当已结算数量的数组元素的值已修改完毕,以下程序段即可实现DropDownListBox信息动态更新的功能:
String sText
Long nItem
sText = ddlb—4.Text
nItem = ddlb—4.FindItem( sText, 0 )
ddlb—4.DeleteItem( nItem )
ddlb—4.InsertItem(aDBDH[ nItem ]+ String
( aSJSL[ nItem ] - aJSSL[ nItem ] ), nItem)