需求:pb dw中的checkbox列在点击选择时,判断之前某列的值,如不满足条件,则取消勾选。
使用过的方法及解释:
1、在itemchanged事件中写 dw.objext.cbx[row] = 0. 不能达到要求。虽然itemchanged事件中的data变成了0.但是dw行中的checkbox的勾选状态并未被取消。
2、在itemchanged事件中写dw.setitme(row, "cbx", 0)结果与上同。
3、在itemchanged事件中写dw.event itemchanged(row, dwo, '0')。结果同上。但该代码会使函数进入死循环。相当于itemchanged事件不停的迭代自身事件函数。checkbox上的勾让人不能去掉。
4、在某一个button下写 dw.objext.cbx[row] = 0或dw.setitme(row, "cbx", 0)。能达到要求。勾选被取消。
5、在itemchanged事件中写
dw_1.event losefocus( )
dw_1.setitem(row, "xz", 0)或dw.objext.cbx[row] = 0
无法达到要求。这么写的初衷是想通过losefocus()事件使dw失去焦点,而后再执行dw_1.setitem(row, "xz", 0)或dw.objext.cbx[row] = 0的操作,达到一种与在外部按钮中点击执行的时机相同的时机效果。但是不能达到预期目的。原因是执行losefocus()并不能达到使本次itemchanged事件函数执行完毕的效果。而在一次itemchanged()事件中不能修改勾选状态两次。原因是如果在itemchanged()事件中再去修改checkbox的状态就相当于再次触发了itemchanged()事件,这就相当于在itemchanged事件中写了dw.event itemchanged(row, dwo, '0'),会使程序陷入死循环,因此pb事件机制应该不允许通过在itemchanged()事件函数内通过dw_1.setitem(row, "xz", 0)或dw.objext.cbx[row] = 0修改状态值来再次触发并修改checkbox的勾选状态。
在itemchanged事件中使用各种代码不能达到要求,原因是:dw.event itemchanged(row, dwo, '0')这种方法虽然修改了data的值,但是在此事件本身的函数内data值的改变并不能反过来改变外部checkbox控件的勾选的的状态。虽然checkbox的勾选状态直接决定data值。
dw.objext.cbx[row] = 0和dw.setitme(row, "cbx", 0)这两种方法虽然能改变checkbox的勾选状态。但是在itemchanged事件内部使用却无效。原因同5。
解决方案:以上种种方法不能达到要求,究其原因是因为没有找到一个合适的时机。再次修改checkbox勾选状态的时机必须在itemchanged事件之中,而不能在itemchanged()之后的任何一个事件中。而在itemchanged事件中又不能通过用代码修改状态值的方法来改变勾选状态。那么就只剩下一个思路——终止itemchange()的执行。那么如何终止呢,事件执行成功与失败一般都会通过返回值的形式告诉编译器,执行成功和失败都会有不同的返回值,编译器也会根据事件函数的返回值来决定下一步的应该执行动作。因此想到从返回值下手。通过查看pb的帮助文档( help——contents——查询return关键字)发现itemchanged事件执行失败时返回值为2,因此在判断条件不满足时使itemchanged()事件的返回值为2。如图:
告诉编译器事件执行失败。则checkbox则不会勾选成功。
执行代码,成功达到要求。
原文链接:https://blog.csdn.net/wolfalcon/article/details/102534503