我有一个包含x行数的数据窗口。第一列(我称为“员工”)是一个下拉数据窗口,其中的数据列指向员工ID字段,显示列指向员工姓名字段。添加行时,将根据用户的下拉选择来填充此列。另外,将过滤器应用于employee列的DatawindowChild,以便用户不能选择与当前过滤器不匹配的雇员。
问题:
当过滤器表达式更改为不再与现有行匹配时,employee列将不再引用当前雇员ID的显示值,因为相应的行位于下拉数据窗口的过滤器缓冲区中。结果是改为显示数据值。
什么是聪明的解决方法?
另外,要考虑的另一件事是,我不能将匹配的筛选器应用于主数据窗口,因为其中一项要求是所有行始终保持可见。
谢谢。
编辑:Powerbuilder 2017 R2。
答案 0 :(得分:0)
首先尝试执行此操作。取消过滤“子”数据窗口,并每次都应用新的过滤器。
答案 1 :(得分:0)
因此,在尝试了所有技巧之后,我想到可以使用过滤器,但最终我选择了一个混乱的解决方案,该解决方案部分地破坏了数据窗口的行为,但是可以工作。
我认为解决由下拉数据窗口中的可选值与输入到该列中的实际值之间的不匹配引起的显示问题的唯一方法是确保绝对不会发生不匹配。
我创建了一个新的雇员下拉数据窗口列,其中显示列和数据列均指向雇员姓名字段。用户选择一个雇员名称,然后在必要时使用Find和GetItemString从数据窗口子项中手动获取该雇员ID。结果是下拉数据窗口不再能够操作数据-现在必须在代码中手动完成-但在修改过滤器表达式时,现有行没有任何可视变化。
之前:
ls_employee = dw_1.GetItemString(row, "employee") //Returns employee ID
之后:
ls_employee = dw_1.GetItemString(row, "employee") //Returns employee name
ls_employee = ldwc_employee.GetItemString(ldwc_employee.Find("employee_name = '" + ls_employee + "'", 1, ldwc_employee.RowCount()), "employee_id") //Find row number and fetch ID
然后,由于用户实际上不再在表中插入PK / FK值,因此必须在调用更新之前在旧的(隐藏的)员工ID列上手动设置员工ID。
dw_1.SetItem(row, "employee_id", ls_employee)
我对此解决方案并不完全满意,因为它最终使使用下拉数据窗口毫无意义。如果两个雇员的名字和姓氏相同,发现也可能返回错误的行号,但这在我的情况下是可以接受的,因为这种情况极不可能发生。
所以我不为此感到骄傲,但是无论如何,它还是存在。