PB11为了不致使在客户端浏览器上修改DW的数据时产生过多的服务器端的回调请求(PostBack,现象是屏幕闪烁厉害,特别是慢机器),提供了客户端事件脚本JavaScript语言来解决,一般是这样的方式调用:
1. 首先使用任何文本工具编写自己的js脚本,假设命名为:myscripts.js
2. 在含有DW的窗口OPEN事件中书写如下形式的代码:
#IF DEFINED PBWEBFORM THEN
dw_1.JavaScriptFile = "myscripts.js"
dw_1.OnClientItemChanged = "bmbh_ItemChanged"
#END IF
dw_1.JavaScriptFile = "myscripts.js"
dw_1.OnClientItemChanged = "bmbh_ItemChanged"
#END IF
上面的意思是说:如果是发布为WebForm应用,则给DW_1设置一个脚本处理函数,当client端的项目值发生改变时,调用JS文件中的“bmbh_ItemChanged”函数(来处理有关检查、计算等需求)
如下是JS中该函数的具体代码:
function requ_bmbh_ItemChanged(sender, rowNumber, columnName, newValue)
{
if(columnName == "bmbh")
{
// The default function is invoked
return PBDataWindow_ItemChangedReject(sender, rowNumber, columnName, newValue);
}
else
{
if(columnName == "bmbh")
{
// The default function is invoked
return PBDataWindow_ItemChangedReject(sender, rowNumber, columnName, newValue);
}
else
{
//do nothing
//do nothing
}
}
}
意思是:当字段“bmbh”的值改变时会自动执行 PBDataWindow_ItemChangedReject(会产生回调),因此当你在DW中编写了PB的PowerScript脚本时,实际上就会 执行你的代码,你可以在ItemChanged事件中编写你的处理BMBH改变的代码,例如处理一个DDDW来筛选指定部门的职工。
同时,当DW上其他的字段发生改变时,浏览器上不会产生服务器回调,否则如果没有这个JS和其中的函数,则任何字段值的改变都会引起POSTBACK,这样看屏幕就会难受。
上面这些在SYBASE的手册文件pbman110.chm中均有介绍。 但是,关于更深的介绍只字未提,例如我不想在ItemChanged事件中编写PB脚本,我想在JS中实现,当然目的也很直接,就是不产生任何POSTBACK,
诸如此类,怎么实现呢?
本人在NEWSGROUP上看到,很多人都提出过类似问题,但好象都没有明确和直接的回答,所以,本人经过近2个星期的摸索,解决了此类问题,如下是我发 表在NEWSGROUP上的一段话,为了省却输入问题,我不再进行详细解释了,看官仔细理会吧(sorry for poor english )。
I have realized this function at last spent two weeks
please look my code for example :
function dw_ERec_ItemChanged(sender, rowNumber, columnName, newValue)
{
if(columnName == "bmbh")
{
// The default function is invoked
return PBDataWindow_ItemChangedReject(sender, rowNumber,
columnName, newValue);
}
else
{
var dept, doctor ;
if ( columnName == "dept" )
dept = newValue;
else
dept = sender.GetItem ( rowNumber,"dept" );
if ( columnName == "doctor")
doctor = newValue;
else
doctor = sender.GetItem(rowNumber,"doctor");
sender.SetItem(rowNumber, "comp" ,dept + "---" + doctor);
}
}
{
if(columnName == "bmbh")
{
// The default function is invoked
return PBDataWindow_ItemChangedReject(sender, rowNumber,
columnName, newValue);
}
else
{
var dept, doctor ;
if ( columnName == "dept" )
dept = newValue;
else
dept = sender.GetItem ( rowNumber,"dept" );
if ( columnName == "doctor")
doctor = newValue;
else
doctor = sender.GetItem(rowNumber,"doctor");
sender.SetItem(rowNumber, "comp" ,dept + "---" + doctor);
}
}
!!!!!!! Note: HTDW_SetItem and HTDW_GetItem function in dwcommon.js
are function of the matching type, "HTDW" string must be replaced by
yourself datawindow name !!!!!!!!!!!!!!!!!
are function of the matching type, "HTDW" string must be replaced by
yourself datawindow name !!!!!!!!!!!!!!!!!
so, replacing it with "sender" .
Here, I have walked in a lot of detours.
Here, I have walked in a lot of detours.
关键是GetItem / SetItem 函数的应用,注意这2个函数不是PB的哦,是JS的哦,但遍查dwcommon.js文件,找不到他们,只有 HTDW_SetItem / HTDW_GetItem , 后来查看了其他很多函数后才恍然大悟,原来这里的HTDW是一种通配描述,不是实际的函数名称,必须被对象属主来执行。
期间按newsgroup的提示一直在DW所谓的对应了一个二唯数组rows上找问题,所以一直被之蒙骗。
得来感慨很多!!!!