zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    [leetcode-604-Design Compressed String Iterator]
    [leetcode-617-Merge Two Binary Trees]
    OpenCV学习1-----打开摄像头并在画面上添加水印
    cvCvtColor与cvtColor区别
    [leetcode-547-Friend Circles]
    [leetcode-260-Single Number III]
    复位电路
    单片机特殊功能寄存器
    单片机的定时器与计数器
    单片机定时/计数工作方式
  • 原文地址:https://www.cnblogs.com/szxiaofei14/p/6186232.html
Copyright © 2011-2022 走看看