8

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

例子:

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

Apples  [Good]             Bags          Red
        [Bad]

鉴于上面是一个基于网格的数据窗口,其中 fieldsNAME和是文本字段,其中 asPURCHASED IN字段是下拉列表*。COLOURLIKABILITY

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

但是,我无法获得Bananas3 个下拉菜单,而 Apples 只有 2 个。

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

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

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

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

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

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

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

    失败:所有行都出现第三个选项,在 Apple 行上仍然可以选择,这是错误的。

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

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

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

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

对于任何可以给我一个解决方案的人来说,现在有一个赏金,这将使我能够在 PB 10.5 中基于网格的数据窗口上编辑单行的下拉列

4

3 回答 3

4

因此,您的问题的答案是否定的,您不能逐行在 DropDownListBoxes (或 DropDownDataWindows )中拥有唯一的内容。

您的问题的解决方案更复杂。您可以更改 RowFocusChanged 上下拉列表的内容,但是如果代码值不再位于值列表中,那么行的显示会发生什么情况?仅显示代码值。如果显示的是 R 而不是 Red,那么当您不在特定行上时,这并不是很好。因此,一个常见的解决方案是有两个控件,直接在另一个之上,以表示该数据:一个在行具有焦点时可见(下拉任何) 以及当其他行具有焦点时可见的行,它显示代码的显示值。过去,我使用静态文本或虚拟编辑样式列作为第二个控件来完成此操作,并在第一列的 ItemChanged 上设置值。但是,今天早上我推测,如果第二个控件是一个下拉列,指向数据集中的同一列,并且始终包含完整的值集,那么您可以在不编写脚本的情况下执行此操作。我将把实验(以及完成这项工作所需的其他几部分,例如当用户单击另一行的第二个控件时发生的情况)留给你。

祝你好运,

特里。


附录

你问事情是如何逐行完成的。这对你来说就像圣诞节(或其他一些文化上合适的大型收礼节)。在 DataWindow 画家的“属性”窗格中看到所有右侧有一个按钮的元素吗?这使您可以输入一个表达式,该表达式将逐行计算以确定属性的值。要输入表达式以使字段仅在当前行时可见?

if (getrow() = currentrow(), 1, 0)

您还可以在运行时 Modify() 这些表达式。我会让你帮忙挖掘它。该帮助还为您提供了每个 DataWindow 控件元素的属性列表,其中包括表中每个属性是否采用表达式。(等号按钮不是 100% 的故事;并非所有可表达的属性都可以通过 IDE 表达。)

旁注:如果您获得表达式并学习如何掌握它们,您将获得 DataWindow 的强大功能。

至于网格,我的第二个关于 column over column 的建议显然在网格中不起作用。是时候回退到使用列和静态文本了,例如,使用 ItemChanged 脚本。

T。

于 2010-03-31T16:46:18.037 回答
3

您可以在 rowfocuschanged 事件上编辑代码表的内容。由于您一次只能展开一个下拉菜单,这应该可以提供您需要的用户体验。

不幸的是,您不能像使用字体大小那样根据表达式更改代码表。

如果您需要对下拉菜单进行更多控制,可以将其设为 DropDownDW。您可以在 RowFocusChanged 上重新检索它,传递第二列中的值。

于 2010-03-31T15:27:58.347 回答
0

在选择中创建一个足够大以容纳显示值的虚拟列。在此列上使用 DropDownDataWindow,同时将显示值列用于显示值和数据值。当您检索 DataWindow 时,通过查找正确的值填充此列(提示:在真实的隐藏列上使用 DDDW 并调用 LookUpDisplay(),确保在执行此操作时清除过滤器);然后调用 ResetUpdate()。根据当前行的值,根据需要过滤下拉列表中的值。在 ItemChanged 事件中,当虚拟列值发生变化时,从 DDDW 中获取代码(当列有焦点时,DDDW 将在正确的行上)并更改隐藏列中的值,然后将虚拟列状态更改为 NotModified . 因为 dummy 列包含显示值,过滤 DDDW 不会' t 使其显示代码。新行和更新将自行处理。

于 2010-04-08T13:49:31.877 回答