有没有办法处理基于网格的数据窗口中单行下拉列表的动态更改?
示例:
NAME LIKABILITY PURCHASED IN COLOUR
(Text) (DropDown*) (Text) (Text)
Bananas [Good] Hands Yellow
[Bad]
[Bananas are good]
Apples [Good] Bags Red
[Bad]
鉴于以上是基于网格的数据窗口,其中字段NAME
,PURCHASED IN
和COLOUR
是文本字段,其中LIKABILITY
字段是下拉列表*
我说dropdown *因为可以使用DropDownList(在设计时在datawindow元素中硬编码)或DropDownDW(或DDDW,可以基于数据窗口中的其他元素的select语句)创建相同的可视化表示)。
然而,我无法让Bananas
获得3个下拉菜单,而苹果只有2个。
如果我输入多行Bananas
,则所有行都有3个下拉列表,但只要我添加一个Apples行,所有下拉列表都会恢复为2个选项。
为了尝试实现此功能,我尝试了以下选项:
dw_1.Object.likability.values("Good~tG/Bad~tB/Bananas are good~tDRWHO")
在编辑NAME时在ue_itemchange上。
失败:编辑LIKABILITY的所有实例而不是当前行。
重复下拉列表,每行有一个已过滤的,一个未过滤的选择列表,基于NAME选择可见。
失败:无法在基于网格的数据窗口上设置可见性/重叠列。 (Source)
硬编码显示值为数据库值,或反之亦然。将GOOD
,BAD
,BANANASAREGOOD
作为显示和数据库值,并将选项从G,B,DRWHO更改为这些新值。
FAILS:所有行都显示第3个选项,仍可在Apple行上选择,这是错误的。
DDDW检索下拉列表的选项列表。创建一个使用NAME值的DDDW来确定它应该为下拉列表选择哪些选项。
失败:编辑下拉列表的所有实例,而不仅仅是当前行。
DDDW检索可用选项的计数器(如果B然后是3,则为其他2),然后有重复的下拉列保护/取消保护基于DDDW计数器。
失败:无法自动选择dddw值来填充列以引起其他两列的保护,无论如何都是丑陋的解决方案。
对于能够为我提供解决方案的人来说,这个问题现在有赏金,这使我能够在PB 10.5中基于网格的数据窗口编辑单行的下拉列
答案 0 :(得分:4)
所以,你的问题的答案是否定的,你不能逐行地在DropDownListBoxes(或者DropDownDataWindows)中拥有唯一的内容。
您的问题的解决方案更复杂。您可以在RowFocusChanged上更改下拉列表的内容,但是对于代码值不再位于值列表中的行上的演示文稿会发生什么?仅显示代码值。如果显示的是R而不是红色,那么当你不在特定的行上时,这并不是很好。因此,一个常见的解决方案是让两个控件直接在另一个上面来表示数据:一个在行具有焦点时可见(下拉无论)和一个当其他一些行具有焦点时可见,它显示代码的显示值。在过去,我使用静态文本或虚拟编辑样式列作为第二个控件,并在第一列的ItemChanged上设置值。但是,今天早上我推测如果第二个控件是一个下拉列,指向数据集中的同一列,它始终包含完整的值集,则可以在没有脚本的情况下执行此操作。我将离开实验(以及其他一些需要完成此工作的工作,就像用户点击另一行中的第二个控件时所发生的那样)。
祝你好运,特里。
附录
你问过一些事情是如何逐行完成的。这对你来说就像圣诞节(或其他一些文化上适合的大规模礼物接待假期)。在DataWindow画家的“属性”窗格中,可以看到右侧带有等号的按钮的所有元素?这使您可以输入一个表达式,该表达式将逐行评估以确定属性的值。要输入表达式,以便只有在当前行时才能看到该字段?
if (getrow() = currentrow(), 1, 0)
您还可以在运行时修改()这些表达式。我会帮你解决这个问题。该帮助还为您提供了每个DataWindow控件元素的属性列表,其中包括表中是否每个属性都使用表达式。 (等于按钮不是故事的100%;并非所有可表达的属性都可以通过IDE表达。)
旁注:如果您获得表达式并学习如何掌握它们,您将获得DataWindow的强大功能。
至于网格,我对柱子列的第二个建议在网格中不起作用,显然已经足够了。现在是时候回到使用列和静态文本,例如,使用ItemChanged脚本。
吨。
答案 1 :(得分:3)
您可以在rowfocuschanged事件上编辑代码表的内容。由于您一次只能扩展一个下拉列表,因此应该提供您所需的用户体验。
您不能像使用表达式那样根据表达式更改代码表。不幸的是字体大小。
如果您需要更多控制下拉列表,可以将其设为DropDownDW。您可以在RowFocusChanged上重新检索它,从第二列传递值。
答案 2 :(得分:0)
在选择中创建一个足以容纳显示值的虚拟列。使用显示值和数据值的显示值列在此列上使用DropDownDataWindow。当您检索DataWindow时,通过查找正确的值来填充此列(提示:在真实的隐藏列上使用DDDW并调用LookUpDisplay(),确保在执行此操作时清除过滤器);然后调用ResetUpdate()。根据需要根据当前行的值过滤下拉列表中的值。在ItemChanged事件中,当虚拟列值更改时,从DDDW获取代码(当列具有焦点时,DDDW将位于正确的行上)并更改隐藏列中的值,然后将虚拟列状态更改为NotModified 。由于虚拟列包含显示值,因此过滤DDDW不会使其显示代码。新行和更新将自行处理。