3

我有一个带有两个子表单的表单(在单独的标签页上)。这是 Access 2003 中的一个 MDB 项目。

当它最初打开时,活动子窗体上的 Form_Current 会触发一次,因为它应该。

但是当您移动到另一条记录(即从主窗体)时,它会在活动子窗体上触发 Form_Current 4 次。然后随后的记录移动导致 Form_Current 触发 2 次。这很痛苦,因为子表单有很多被移动和/或隐藏的字段,因此它会为每个 Form_Current 跳来跳去,更不用说速度很慢了。

我通过 DoCmd.OpenForm 使用过滤器打开表单(实际上它通过 OpenArgs 发送过滤器)。FilterOn 只设置一次,在主窗体的 Form_Open 中,从不在子窗体中。Form_Current 没有在代码的其他任何地方显式调用。

当我在 Form_Current 第一次触发移动时查看调用堆栈时,它看起来像:

my_subform.Form_Current
[<Debug Window>]
my_subform.Form_Current

所以看起来 Form_Current 中的某些东西正在触发另一个 Form_Current 事件。但仅在第一个记录移动。

Form_Current 中的代码有些复杂,涉及自定义类和事件回调,但一般不会接触表格数据。我唯一能想到的可能是触发 Form_Current 是它检查表单控件上的 OldValue - 这会导致它吗?

或者还有什么想到的?

谢谢。

埃里克

4

1 回答 1

2

正如 TheAceMan1 曾经指出的那样,“对于 On Current 事件,您唯一需要注意的是递归!也就是说……事件中的代码会导致事件重新触发。就像移动到代码中的另一条记录一样。除了那……事件可以根据需要进行。” 我发现 Current 非常紧张。也就是说,有时它是放置代码的唯一地方。

您可能知道子表单的事件在父表单的事件之前触发。这对于 Load 来说当然是正确的,也许对于 Current 也是如此。

我只能建议逐步排除故障;注释掉零件,检查功能并解决问题。当然,您可以随时发布更多代码供我们查看。

于 2010-05-06T00:59:42.320 回答