当前位置: 代码迷 >> PB >> 为何SETITEM的数值很快不见了
  详细解决方案

为何SETITEM的数值很快不见了

热度:40   发布时间:2016-04-29 07:01:53.0
为什么SETITEM的数值很快不见了?
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换为前面的代码 即可

------解决方案--------------------
引用:
如果setitem是针对当前行和列做的操作,需要增加用到post函数


因为itemchanged执行完成后,pb才把编辑框中的数据接收到数据窗口的缓冲区中,意思就是执行过temchanged事件后,pb会自动执行一下类似于setitem,就会把你的setitem的值给冲掉了

你可以在itemchanged代码中这么写

this.post function setitem(r……

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后的代码在当前事件的系统消息队列之后执行,所以,这样修改的效果,相同的操作,结果就会不一样,变成李四是最后的执行结果了。