PB数据窗口其他知识

本文详细介绍了在PowerBuilder中标识数据窗口当前行的各种方法,包括使用SelectRow函数、SetRowFocusIndicator、CurrentRow和GetRow函数。此外,还讨论了如何在数据窗口中显示指定条件的数据、用回车键替代Tab键的功能、数据拷贝技术以及数据操作的安全性措施,如用户确认、数据恢复和窗口关闭处理。最后,探讨了数据窗口作为下拉列表框和列表框的使用,以及处理多表数据修改的脚本实现。
摘要由CSDN通过智能技术生成


标识当前行
〓标识当前行也就是给当前行加上醒目的标记,以便用户更清楚当前要对哪一行数据进行操作,尤其当用户的操作中间有停顿时,继续进行操作就特别需要知道哪个是当前行。这里的当前行不要狭隘地理解成仅仅是光标所在行。当翻页时如果光标所在行不在当前页中,这时应该将当前页中的第一行置为当前行,否则容易造成错觉;当删除数据时,不能自动改变当前行,此时应该使用脚本设置当前行。
标识当前行的函数和方法很多,比较常用的有SelectRow,SetRowFocusIndicaTor,数据窗口对象中的函数CurrentRow和GetRow等,还有很多可以在数据窗口对象中实现的方法。


〓使用SelectRow函数
这是最常用的一种方法。函数SelectRow的语法比较简单,重点要掌握需要在哪些事件中编写脚本。函数SelectRow的语法是:
dw_1.SelectRow(row,boolean)
其中,dw_1是数据窗口控件名称;row是要操作的行号,如果取值为0则表示对数据窗口dw_1中的所有数据进行操作;boolean表示是否选中数据,如果为True则表示选中row指定的行,如果为False则表示取消选中row指定的行。函数正确执行返回1,否则返回-1,如果有参数为NULL则返回NULL。
当选中数据窗口中的一行数据时,数据行以蓝底白字显示。当用户在数据窗口中使用上下光标键、或者Tab键、或者鼠标点击时,如果改变了光标所在行号则这些操作都会触发数据窗口控件的RowFocusChanged事件。所以,在数据窗口控件的RowFocusChanged事件中编写脚本来标识当前行,比仅在数据窗口的Clicked事件中编写脚本要全面得多。脚本如下:
if currentrow > 0 then
dw_1.selectrow(0,false)
dw_1.selectrow(currentrow,true)
end if
另外,由于滚动垂直滚动条操作不能触发RowFocusChanged事件,如果翻页后当前行不在当前页中,这样容易造成错觉,应该将当前页中的第一行设置为当前行。在数据窗口控件的ScrollVertical事件中编写如下脚本:
long ll_row
ll_row = long(describe("datawindow.firstrowonpage")) //当前页中第一行的行号
if ll_row < 1 then return
setrow(ll_row)
通过上面两个事件(RowFocusChanged,ScrollVertical)中编写的脚本,就可以较为全面地修改数据窗口控件的当前行标识。
*对“插入”按键编写脚本时,应该使用可以自动触发数据窗口RowFocusChanged事件的语句,例如使用dw_1.scrolltorow(dw_1.insertrow(0))语句可以自动修改当前行标识,而仅使用dw_1.insertrow(0)语句就不能自动修改行标识。
long ll_row
ll_row = dw_1.insertrow(0) //插入新行
dw_1.scrolltorow(ll_row) //滚动到新行
dw_1.setrow(ll_row) //设置新行为当前行
dw_1.setcolumn(2) //设置第2列为当前列
dw_1.setfocus( ) //dw_1获得焦点


〓使用函数SetRowFocusIndicaTor
函数SetRowFocusIndicaTor可以给当前行指定的位置上设置指定的标志,函数的语法格式如下:
dw_1.SetRowFocusIndicaTor(focusindiacaTor{,xlocation{,ylocation}})
其中,dw_1为数据窗口控件名称;focusindicaTor是枚举型或者特定的图片的名字,可以是以下取值:
Off!:取消行标识
FocusRect!:在当前行的周围放置一个虚线构成的矩形边框
Hand!:使用PB提供的手形指示器
图片的名字:使用图片的名字可以选择用户喜欢的行标识符号
该函数正确执行则返回1,否则返回-1,如果有参数为NULL则返回NULL。该函数正确执行后,当数据窗口控件中的RowFocusChanged事件触发时将自动给当前行设置行标。
使用该函数时,只需要在适当的时候个数据窗口控件设置行标识即可,一般可以在检索之后马上设置。例如,在窗口的open事件中可以如下编写脚本:
dw_1.settransobject(sqlca)
if dw_1.retrieve() > 0 then
dw_1.setrowfocusindicator(hand!)
dw_1.setrow(1)
end if
在ScrolVertical事件中编写的脚本和上面的“使用SelectRow函数”中介绍的完全相同。


〓使用CurrentRow和GetRow两个函数
在数据窗口对象中实现标识当前数据行的方法和在窗口中编程类似,也是通过数据窗口控件的RowfocusChanged事件来触发函数,只是触发的是数据窗口对象中的函数。所以,在数据窗口对象中放置函数后,还得在窗口的ScrollVertical事件中编写脚本,事件和上面介绍的完全相同。程序运行时的效果和在数据窗口对象中编程效果完全相同。
GetRow()函数返回的是表达式触发的行号,CurrentRow函数返回的是当前行的行号,他们都没有参数,返回值都是long类型的行号。使用这两个函数并配合其他的部件可以标识当前行。
通过修改当前行上text控件的可视性实现标识当前行,给用户的感觉好象当前行的边框发生了改变。首先,在Detail band中放置一个Text控件,删除该控件中的“text”,设置其外观为 3d Rasied,将其背景修改为和字段中的数据不同的颜色,将Text控件的sent to back选中,在该Text控件的属性视窗中为visible属性输入如下表达式:
if(currentrow() = getrow(),1,0)
该表达式的作用是在当前行获得焦点时显示Text控件,否则禁止显示Text控件,加宽该Text控件使其正好能够覆盖所有的字段,最好Text的边框能够显示出来,不被字段覆盖;设置所有字段的边框类型以增强显示效果,设置为无边框。注意,如果字段边框和Text边框设置不当,则显示效果不一定明显。
这种显示风格可以使用户很清楚当前要处理的是哪一行,尤其在处理工作中间有停顿的情况下特别有用。当然,要观看这种效果,数据窗口中至少应该有一个字段的Tab Order值不为0,否则不能改变当前行,也就无法获得运行效果了。
对上面的方法稍微变通一下,可以直接为所有要显示的字段的Border属性定义表达式。当前行获得焦点时所有字段是一种边框风格,当失去焦点时又是另外一种风格。这样也可以实现标识当前行,但是如果字段较多,设置起来就比较烦琐。比如,可以为所有字段定义如下表达式:
if(currentrow()=getrow(),1,0)
该表达式的含义是当前行字段的边框类型为1(即Shadowbox类型),非当前行则为0(即无边框)。


〓改变背景或者前景
和上面的方法类似,也是利用GetRow和CurrentRow两个函数在数据窗口对象中实现改变背景或前景颜色。需要为每个字段都规定前景和背景颜色,在每个字段的Background.color属性中都输入表达式:
if(getrow()=currentrow(),rgb(255,0,0),rgb(255,255,255))
然后,在数据窗口控件的ScrollVertical事件中编写和上述作用SelectRow函数中介绍的完全相同的代码即可。


显示指定条件的数据
将符合特定条件的数据全部显示在数据窗口中,在大多数情况下是可以的,这不需要做什么工作。但是要同时将符合特定条件的和不符合这些条件的数据显示在数据窗口中,以便比较分析,这就需要一定的编程。关键是使用一定的方法来标识符合条件的数据。

※通过修改前景、背景颜色
要以特殊背景(或前景)颜色显示符合固定条件的数据行时,这种情况比较简单。可以在数据窗口创建时在字段的属性中把前景和背景颜色赋予固定的表达式。比如某数据窗口要醒目显示女职工信息,正常显示为黑色前景、灰色背景,醒目显示为红色前景、灰色背景,可输入如下表达式:
BackGroundColor:If(sex="女",RGB(255,0,0),RGB(0,255,0))
当需要特殊显示背景(或前景)颜色的数据行的条件是由用户动态指定时,就需要做一些编程工作。在用户改变查询条件的操作中,同时动

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值