pb dw中checkbox控件在點選後馬上取消勾選的方法

需求: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則不會勾選成功。

執行代碼,成功達到要求。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章