PB 数据窗口高级( DataWindow) 37个技巧1. 使DataWindow列只能追加不能修改如何使DataWindow中的数据只能追加新记录而不能修改,利用Column 的Protect 属性可以很方便的做到这一点,方法如下:将每一列的Protect 属性设置为:If( IsRowNew(), 0, 1) )在PowerScript 中可以动态修改Protect 属性:dw_1.Modify("column_name_here.Protect='1~tIf(IsRowNew(),0,1)'")这样,DataWindow 中只有新追加的记录可修改,而其他记录是只读的。
2 .如何在DataWindow中实现列的自动折行我们在PowerBuilder应用程序的开发过程中, 使用DataWindow时, 经常会遇到某列的数据太长, 不能同时全部显示的情况. 若采用自动水平滚动, 操作起来又不够简便. 下面介绍一种方法, 实现列数据多行显示, 即实现列数据的自动折行.具体步骤如下:1) 在DataWindow Painter中打开此DataWindow.2) 在需设定自动折行的列上双击鼠标, 弹开此列的属性窗口.3) 选择Position标签, 选中Autosize Height 多选框.4) 选择Edit标签, 不选中Auto Horz Scroll多选框.5) 单击OK按钮, 保存所做的修改.6) 点中Detail Band (即写有Detail的灰色长带), 单击鼠标右键, 选择Properties... 菜单项.7) 选中Autosize Height多选框.8) 单击OK按钮, 保存所做的修改.9) 保存此DataWindow.注意:连在一起的汉字(中间没有标点或空格分隔), 系统将认为是一个单词, 不会自动进行折行.3. 在数据窗口中实现动画要实现动画,必须要有定时器,在数据窗口中已经有了一个定时器,双击数据窗口将弹出的对话框,在Timer Interval中定义大于零的值就有定时器(可以精确到毫秒),有了这个定时器就可以实现动画了。
比如要改变某字段的背景颜色,可设ackgound.color=RGB(Integer(Right(string(now(),'hhmmssf'),1))*256/10,In teger(Right(string(now(),'hhmmssf'),1))*256/10,0)当然,您不仅可以改变背景颜色,而且可以改变字体等等任何属性,使他可以动起来!4. 使数据窗口中的被选中行具有更好的外观大家都知道,在选择数据窗口中的某一行时,如果使用pb提供的选择函数SelectRow(),那么的外观真是不能恭维,单调而古板的蓝色背景,可能和您的漂亮而生动的应用程序格格不入。
有没有办法改变呢?当然有啰,请听我慢慢道来。
改变某一行的背景比较简单,改变每一列的背景属性(backgroundcolor)即可,可要根据鼠标选择情况自动改变,并可以返回被选中的行可能还需要一定的技巧。
下面分单行选择和多行选择分辨说明。
单行选择单行选择比较简单,我们只要将所有字段的背景色的表达式改为:if(GetRow()=CurrentRow(),RGB(255,126,0),RGB(0,0,0))其中第一个颜色为被选中的颜色,第二个颜色未被选中的颜色。
然后用GetRow()代替GetSelectedRow()函数来得到被选中的行。
多行选择多行选择比较复杂,如果单纯依靠改变数据窗口的属性没法实现,我们必须使用数据窗口属性和代码结合起来才能实现首先,改变数据窗口的SQL语句,增加一个计算字段:0 as flag,Select 语句改为:Select col1,col2 ,1 as flag from tablename where .....,当返回数据窗口painter时,您就会发现多了一个字段flag,我们就是利用这个字段保存行被选中的信息。
其次,修改各个字段的背景颜色属性,设置为:if(flag=1,RGB(255,126,0),RGB(255,255,255))第三:在数据窗口控件中,增加对clicked 事件的处理,代码如下:if row<1 then return // setredraw(false)if this.o b j e c t.flag[row]=1 then //如果该行被选中,撤销选择,否则选中该行this.Object.flag[row]=0elsethis.Object.flag[row]=1end ifsetredraw(true)您还可以定制本选中行的字体,文本属性等等。
原理相同,不再赘述。
5 .将日期型字段初始化为当天的日期使用Column Specifications 对话框来设置数据的初始值是一个比较好又比较通用的方法。
为了将日期型字段初始化为当天的日期,只要设置初始化值为today,而不是today()即可。
同样设置初始值为NUll,可以使用null,而不是null()。
6. 在DataWindow中调整列顺序在Gird 风格的DataWindow 中,列的排列顺序是按照你选择Column 的顺序排列的,并且不能改变.要改变列的顺序则必须重新制作DataWindow.最近我发现一个办法可以改变列的顺序: 在DataWindow 画板中打开要修改的DataWindow,然后按'Preview' 按钮切换到预览模式下,选择要移动的列标题并拖动到预定位置,然后返回DataWindow 画板,存盘即可.7 .Retrieve时不清除原有Datawindow数据当你调用Retrieve函数,PowerBuilder自动清除原有DataWindow然后Retrieve数据。
在Datawindow RetrieveStart事件中,使用Return 2,这样PowerBuilder不会清除原有数据而是追加新数据。
8 .美化DataWindow的显示效果使DataWindow 的单双行显示颜色不同,不仅仅可以使你的应用程序更显专业性,并使数据的可读性增强。
先调出你需要改动的DataWindow,在Detail band按下右键选择Properties,选择Tab页中的Expressions,在color属性中输入下面内容:(注意是在Detail明细显示段按右键,而不是在Column上) IF(MOD(GETROW(),2)=0,RGB(192,192, 192), RGB(255, 255, 255)) 马上Preview一下,看一看效果如何。
9 .用Line建立漂亮的Grid DataWindow的技巧虽然PowerBuilder有Grid风格的DataWindow,但不够灵活,如果想打印一张边框粗线条或双线,内框为细线条的表格直接使用Grid风格的DataWindow就不能实现。
因此许多人都用Tabular风格的DataWindow,然后自己用Line来实现Grid。
在调整线条位置是一个即伤脑筋又伤眼睛的事件,而一旦需要调整行高,所有工作都得重来,试一试用下面方法,会大大减轻你的工作量:在vertical lines,改变它的属性,在Expressions Tab上,y1行上输入0,y2行上输入rowheight() - 1 在horizontal lines, 设置y1 和y2 = rowheight() - 5 这样PowerBuilder会自动调整线的坐标,你只需要设置横线的长度和x1,x2的坐标即可。
马上Preview一下,看一看效果!你再也不需要因为行的高度发生改变而重新调整线条位置。
10 .如何创建一个报表,如下形式Quantity Running Total5,000 5,0002,500 7,5003,000 10,50012,000 22,500对于Running Total列,我们可使用计算列:CumulativeSum(Quantity for all),即可达到逐渐递增求和的功能。
11. 数据窗口的数据送缓冲区之前确认的四个步骤判断数据类型是否正确。
如不正确则触发ItemError事件。
判断数据是否符合有效性规则。
如不符合有效性规则,同样触发ItemError事件。
判断是否有数据被改动。
判断数据是否通过ItemChanged事件,如果数据和ItemChanged相斥,将触发ItemError事件。
12 .如何在DataWindow中用数据类型为Datetime的列为条件进行查找1.当要查找的日期条件是一常数时使用如下表达式:ls_Find = "datetime_col= DateTime ('1/1/1999')"2.当要查找的日期条件是一个变量时使用如下的表达式:ls_Find = "datetime_col = DateTime ('" + ls_Date + "')"3.当要查找的日期条件是一个DateTime数据类型时使用如下表达式:ls_Find = "datetime_col = DateTime ('" + String (ldt_DateTime) + "')"13 .设置数据窗口Boolean型属性的三种方法PowerBuilder提供了三种方法设置数据窗口的布尔型属性,分别是True/False, 1/0, 'Yes'/'No'。
例如:dw_1.Object.address.Visible = 0 dw_1.Object.address.Visible = False dw_1.Object.address.Visible = 'No'PowerBuilder在处理上以字符串的形式保存属性,而不考虑属性值是布尔型、长整型或是字符型。
为了进一步理解,可以导出一个数据窗口并查看它的原码,可以发现即使是列的颜色属性它也是使用带双引号的数字来表达。
14 .如何在DataWindow中快速删除多行在开发过程中可能经常有要进行多行删除的操作,一般都使用循环语句进行操作:FOR ll_RowOn = 1 TO dw_1.RowCount() dw_1.DeleteRow(ll_RowOn) NEXT一个快速的删除方法是把要删除的行从主缓冲区中移到删除缓冲区中。
例如,删除缓冲区中所有的行:dw_1.RowsMove(dw_1, 1, dw_1.RowCount, Primary!, dw_1, 1, Delete!) 不过不要忘了过滤的行在不同的缓冲区中。