首页 > 代码库 > pb数据窗口如何按当前列的值过滤下拉数据窗口(翻译)

pb数据窗口如何按当前列的值过滤下拉数据窗口(翻译)

   假设我们的订单系统,有"新增"、"待定"、"提交"、"取消"四种状态,新增的定单只能修改为“取消”和“待定”状态,“待定”的订单只能改变为"取消"和"提交"的状态。“取消”和“提交”状态的订单得订单状态不能被改变。

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

pb数据窗口如何按当前列的值过滤下拉数据窗口(翻译)