假設我們的訂單系統,有"新增"、"待定"、"提交"、"取消"四種狀態,新增的定單只能修改為“取消”和“待定”狀態,“待定”的訂單只能改變為"取消"和"提交"的狀態。“取消”和“提交”狀態的訂單得訂單狀態不能被改變。
現在我們假設數據窗口把所有的訂單都顯示了出來,顯示的列有“訂單號”“訂單狀態”,訂單狀態列是可以被更新的,而且訂單狀態被實現為一下拉數據窗口,下拉數據窗口的顯示列為(取消,提交,新增,待定)對應的數據列的(1,2,3,4).
如何在顯示正確的訂單狀態的同時又過濾出下來數據窗口呢?
一開始的解決方法是,通過捕捉pbm_dropdown事件,使用GetChild的SetFilter和Filter methods,但是會導致其它列的狀態顯示不正確。假設有兩個訂單,一個是“新增”狀態,一個是“提交”狀態,我們通過Filter子數據窗口的方法把子數據窗口過濾的方法把”新增"狀態的那個訂單的下來數據窗口中的只顯示“取消”,“新增”和“待定”狀態,這樣對於新增狀態的訂單顯示是正確的,但是在同時因為將下拉數據窗口中的“提交”這一行給過濾掉了會導致“提交”狀態的那個訂單只會顯示不正確,顯示2。
我們需要尋找到一種方法,在下拉數據窗口下拉以后重繪。
下邊是一種改動最小的實現方法。我們建議把這個方法封裝成數據窗口的服務,有關細節放面的東西可以聯系作者。實際上,就是建議其中的 of_Filter 方法能夠結合使用of_Register方法將datawindows,column以及過filter strings都結合起來使of_Filter 不用再每個數據窗口里邊都寫一次。
Step 1 - declare instance variables
boolean ib_dropdowndropped = False boolean ib_dropdownredrawn = True
Step 2 - extend the pbm_dropdown event
ib_dropdowndropped = True ib_dropdownredrawn = False of_Filter(True) ib_dropdownredrawn = True
Step 3 - extend the pbm_ncpaint event
If (ib_dropdowndropped And ib_dropdownredrawn) Then ib_dropdowndropped = False ib_dropdownredrawn = False of_Filter(False) ib_dropdownredrawn = True End If
Step 4 - write the of_Filter (boolean ab_switch) subroutine
datawindowchild ldwc long ll_getitemnumber string ls_setfilter = "" If (ab_switch) Then ll_getitemnumber = GetItemNumber(GetRow(), "order_status_id") If (ll_getitemnumber = 1) Then // cancelled -> cancelled ls_setfilter = "(order_status_id = 1)" ElseIf (ll_getitemnumber = 2) Then // confirmed -> confirmed ls_setfilter = "(order_status_id = 2)" ElseIf (ll_getitemnumber = 3) Then // new -> cancelled, new, pending ls_setfilter = "(order_status_id = 1) or (order_status_id = 3) or (order_status_id = 4)" ElseIf (ll_getitemnumber = 4) Then // pending -> cancelled, confirmed, pending ls_setfilter = "(order_status_id = 1) or (order_status_id = 2) or (order_status_id = 4)" End If End If GetChild("order_status_id", ldwc) ldwc.SetFilter(ls_setfilter) ldwc.Filter()
原文地址:http://www.pbdr.com/pbtips/dw/fltrdddw.htm
