DW内除了ITEMCHANGE外没其它事件,我做了一个SETITEM,完了以后很快这个数值消失了,求解
ls_zyps_bm=cur_object.no
this.object.zyps_bm[row]=ls_zyps_bm
ls_temp=this.object.zyps_bm[row]
messagebox("Dd",ls_temp)
弹出MESSAGEBOX时还正常显示,按完确定以后就不见了,DW只有ITEMCHANGE事件,没有其它事件
具体程序如下
sel_cli_sup_prod cur_Object
string ls_prodno,ls_temp
CHOOSE CASE dwo.name
CASE 'zypj_bz'
if data='1' then
dw_1.setitem(row,'zypj_ex_bz','1')
else
dw_1.setitem(row,'zypj_ex_bz','0')
end if
case 'zyps_bm'
dw_1.AcceptText()
string ls_zyps_bm
ls_zyps_bm=data
if ls_zyps_bm='' or isnull(ls_zyps_bm) then return
if asc(data) <= 127 then
cur_object.send_object = "d_zy_prod"
cur_object.no = trim(data)
else
cur_object.send_object = "d_zy_prod_name"
cur_object.no = "%" + trim(data) + "%"
end if
openwithparm(w_sel_cli_sup , cur_object )
cur_object = message.powerobjectparm
ls_zyps_bm=cur_object.no
messagebox("row",string(row))
messagebox("zyps_bm",ls_zyps_bm)
this.object.zyps_bm[row]=ls_zyps_bm
ls_temp=this.object.zyps_bm[row]
messagebox("Dd",ls_temp)
end CHOOSE
------解决方案--------------------
setitem后,还要dw_1.accepttext()一下。
------解决方案--------------------
setitem后(如果SETITEM的这个列是更改的这个列的话)
return 2
不要MESSAGEBOX.如果必须MESSAGEBOX的话
改为
setitem(...)
post messagebox('','')
return 2
--------------------
或者,如果你必须有一个reponse的窗口要在RETURN 2之前打开(比如上述的MESSAGEBOX)
则,新建一个窗口函数
wf_1(long row,long column,string value)//由这个函数去SETITEM
post wf_1(...)//留意是post
RETURN 2
------解决方案--------------------
如果setitem是针对当前行和列做的操作,需要增加用到post函数
因为itemchanged执行完成后,pb才把编辑框中的数据接收到数据窗口的缓冲区中,意思就是执行过temchanged事件后,pb会自动执行一下类似于setitem,就会把你的setitem的值给冲掉了
你可以在itemchanged代码中这么写
this.post function setitem(row, "zyps_bm", ls_zyps_bm) //把你的this.object.zyps_bm[row]=ls_zyps_bm换为前面的代码 即可
------解决方案--------------------
lzp_lrp的回复很专业,简而言之就是消息队列导致的问题。假如你的数据窗口里有一个列,叫c_name,你现在修改他的值,比如,把张三,改成王五。当你敲回车或者移开光标到其它列时,就会触发你写的itemchanged事件。这个事件触发后,其实还会做一件事,就是调用dw.accepttext()。也就是说,一般在itemchanged里写accepttext()的代码,是没有必要的。因为itemchanged执行完,人家会自己执行一次accepttext。那么,现在,你在itemchanged里写一个代码,this.setitem(row,"c_name","李四"),那么,你认为,按现有的情况,等待程序执行完毕,你觉得,c_name列上的值到底会是什么呢?是王五还是李四?呵呵,一定是王五,为什么呢?数据窗口对用户操作的数据有个层的概念,用户录入的数据,在调用accepttext之前,该数据存放在我称之为浮动层上,这时候的数据,你可以用dw.gettext()取到。当accepttext执行后,会触发数据校验,如果,数据不能被数据窗口接受,还会激活事件itemerror。如果数据通过校验,就会进入到数据窗口的主缓冲区,等待update。你通过函数setitem指定的值,是直接向主缓冲去设置值,不会在浮动层。这样说来,你在itemchanged中指定的值一定会预先进入主缓冲区,但随后,你刚输入的王五,在itemchanged事件结束后,通过校验,也被数据窗口接收,从而产生的覆盖写入,这样,最后剩下的值就是王五,而不是代码中指定的李四。因为,代码中的setitem先执行了写入,你敲在浮动层的数据,是在itemchanged事件结束(就是所有itemchanged代码执行完毕)后,才通过默认的accepttext写入的主缓冲区,所以,结果才变成这样,留下的值是王五。但是,如果你在setitem里将原来的代码变一下,结果就会不同dw.post setitem(row,"c_name",李四),这句话的意思是post后的代码在当前事件的系统消息队列之后执行,所以,这样修改的效果,相同的操作,结果就会不一样,变成李四是最后的执行结果了。