假设我们的订单系统,有"新增"、"待定"、"提交"、"取消"四种状态,新增的定单只能修改为“取消”和“待定”状态,“待定”的订单只能改变为"取消"和"提交"的状态。“取消”和“提交”状态的订单得订单状态不能被改变。
现在我们假设数据窗口把所有的订单都显示了出来,显示的列有“订单号”“订单状态”,订单状态列是可以被更新的,而且订单状态被实现为一下拉数据窗口,下拉数据窗口的显示列为(取消,提交,新增,待定)对应的数据列的(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