有没有办法处理基于网格的数据窗口中单个行的下拉列表的动态更改?

时间:2010-03-31 03:28:24

标签: powerbuilder datawindow

有没有办法处理基于网格的数据窗口中单行下拉列表的动态更改?

示例:

NAME    LIKABILITY         PURCHASED IN  COLOUR
(Text)  (DropDown*)        (Text)        (Text)
Bananas [Good]             Hands         Yellow
        [Bad]
        [Bananas are good]

Apples  [Good]             Bags          Red
        [Bad]

鉴于以上是基于网格的数据窗口,其中字段NAMEPURCHASED INCOLOUR是文本字段,其中LIKABILITY字段是下拉列表*

我说dropdown *因为可以使用DropDownList(在设计时在datawindow元素中硬编码)或DropDownDW(或DDDW,可以基于数据窗口中的其他元素的select语句)创建相同的可视化表示)。

然而,我无法让Bananas获得3个下拉菜单,而苹果只有2个。

如果我输入多行Bananas,则所有行都有3个下拉列表,但只要我添加一个Apples行,所有下拉列表都会恢复为2个选项。

为了尝试实现此功能,我尝试了以下选项:

  1. dw_1.Object.likability.values("Good~tG/Bad~tB/Bananas are good~tDRWHO") 在编辑NAME时在ue_itemchange上。

    失败:编辑LIKABILITY的所有实例而不是当前行。

  2. 重复下拉列表,每行有一个已过滤的,一个未过滤的选择列表,基于NAME选择可见。

    失败:无法在基于网格的数据窗口上设置可见性/重叠列。 (Source)

  3. 硬编码显示值为数据库值,或反之亦然。将GOODBADBANANASAREGOOD作为显示和数据库值,并将选项从G,B,DRWHO更改为这些新值。

    FAILS:所有行都显示第3个选项,仍可在Apple行上选择,这是错误的。

  4. DDDW检索下拉列表的选项列表。创建一个使用NAME值的DDDW来确定它应该为下拉列表选择哪些选项。

    失败:编辑下拉列表的所有实例,而不仅仅是当前行。

  5. DDDW检索可用选项的计数器(如果B然后是3,则为其他2),然后有重复的下拉列保护/取消保护基于DDDW计数器。

    失败:无法自动选择dddw值来填充列以引起其他两列的保护,无论如何都是丑陋的解决方案。

  6. 对于能够为我提供解决方案的人来说,这个问题现在有赏金,这使我能够在PB 10.5中基于网格的数据窗口编辑单行的下拉列

3 个答案:

答案 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不会使其显示代码。新行和更新将自行处理。