3

我正在开发旧版 PowerBuilder 应用程序,我们已升级到 PowerBuilder 12,但继续使用“经典”IDE。

我有一个网格 DataWindow 与一个自由格式 DataWindow 共享数据,它们都继承祖先,确保当网格中的当前行发生变化时,自由格式滚动到同一行。

我已经开始在自由格式的列控件的 Protect 和 Background.Color 属性上使用表达式来模拟启用/禁用,作为在 rowfocuschanged 上使用 DataWindow.Modify 的替代方法。

到目前为止,我很喜欢这种方法,它看起来更干净,并且没有明显的性能损失,因为我没有在任何表达式中访问数据库。

问题是,由于我很难确定的原因,这些表达式有时会导致上述行同步功能失败。

在我的测试场景中,网格中有两行。选择第 2 行不会导致自由格式滚动到第 2 行,尽管调试表明 ScrollToRow 确实被正常调用。然后我再次选择第 1 行,不能确定这是否有效,因为自由形式从未离开第 1 行。然后我第二次选择第 2 行,自由格式正确滚动到第 2 行,从此以后事情就变得很花哨了。

通过在一个特定的表达式中移动代码,我已经在另一个窗口上修复了这个问题,不知道为什么会这样,更改不会影响表达式的结果。不幸的是,我没有那么容易在我当前的窗口上修复它。到目前为止,我可以通过从一个特定的 DateTime EditMask 列中删除 Protect 表达式,或者将前面的 DateTime EditMask 列的 TabOrder 设置为正值来解决功能缺失的问题。第一列需要 Protect 表达式,第二列需要不可编辑。我试图给第二列一个正的 TabOrder,同时将它的 Protect 表达式设置为 1,但这不起作用。

我正在撕扯我的头发,并且讨厌 PowerBuilder 一些激烈的东西!如果有人知道问题是什么以及如何在避免它的同时继续利用列表达式,我将不胜感激。我不愿意回到通过从 rowfocuschanged 修改来操作这些东西。

4

2 回答 2

2

这是回想起来的答案,从评论中获取并添加到评论中。

当您设置新行时,PowerBuilder 会尝试将该列设置为当前行中当前具有焦点的同一列。这在基本情况下工作得很好,但是当 Protect 属性有一个表达式时,事情就不太可预测了。我不确定在目标行中的列受到保护的情况下是否存在记录或预期的行为,但我的安全立场是该行为是不可预测的,您可能不应该这样做。正如 Mike 所证明的,明确设置列可以解决他的问题。

如果您正在尝试解决类似问题,要检查的另一件主要事情是确保 RowFocusChanging 没有返回 1 以防止发生行更改。

祝你好运,

特里。

于 2012-01-03T14:57:35.280 回答
1

我遇到过类似的问题,其中不仅字段受到保护,而且当行焦点更改时,背景和文本颜色也会更改。

出于某种原因,Datawindow 表达式非常不一致,尤其是当有其他样式(例如复选框)时。从数据窗口对象中删除所有这些表达式并将它们全部放在数据窗口控件中的一个用户事件/函数中,该控件使用 Post() 从网格列表的 rowfocuschanged() 事件中调用,似乎可以解决问题。此外,与在 dw 表达式上编写代码相比,这样做可以让您更好地控制事件何时真正触发。

于 2012-01-04T00:16:30.550 回答