MS Access:相关子表单的即时更新

Posted

技术标签:

【中文标题】MS Access:相关子表单的即时更新【英文标题】:MS Access: Immediate update of related subforms 【发布时间】:2014-03-28 10:28:10 【问题描述】:

我有一个包含 2 个子表单(SF1 和 SF2)的表单 (F)。我还有 3 个 Oracle 表(T1、T2 和 T3)。每个(子)表格对应一个表格:

F -> T1
SF1 -> T2
Sf2 -> T3

此外,每个(子)表单都会根据某些条件显示一个行列表:

* F shows all rows of T1.
* SF1 shows rows of T2 based on the row selected in F.
* SF2 shows rows of T3 based on the row selected in SF1.

使之成为可能:

* In SF1: A field of SF1 is linked to the "id" field of F.
* In SF2: A field of SF2 is linked to a special control of F.

F 的特殊控件是一个具有特殊 SourceControl 属性的文本框:

=[SF1].[Form]![ID]

获取在 SF1 选择的行的 id。

好的,现在的问题是:如果用户在 F 处选择不同的行,那么 SF1 行和 SF2 行都会立即更新。但是,如果用户在 SF1 选择了不同的行,那么 SF2 行不会立即更新,它们可能会在用户更改选择后 0.3 或 0.5 秒更新。

造成这种不同行为的原因是什么?在第二种情况下是否也可以立即更新行?


更新:已解决:只需在 SF1 的 Form_Current() 事件中调用 SF2.Requery(),当用户在 SF1 更改选择时,SF2 内容将立即更新:

Private Sub Form_Current()                  ' at Form__SF1 module

    Dim SF2 As Form
    On Error Resume Next
    Set SF2 = Me.Parent("SF2").Form         ' SF2 is a son of the parent
    If Err <> 0 Then                        ' parent not openned
        Exit Sub
    End If
    On Error GoTo 0

    SF2.Requery                             ' update SF2 content

End Sub

【问题讨论】:

听起来它在两种情况下都可以正常工作,只是速度很慢。桌子有多大?它们成比例地大吗?索引是如何设置的? SF2 是 F 中的子表单还是 SF1 中的子表单? 表很小,因为它们仍然是开发表,大约有 5 到 10 行。我相信大小不是原因。 SF1 和 SF2 都是 F 的子形式(SF2 不是 SF1 的子形式)。奇怪的是,如果用户更改 F 中的选择,那么 SF2(和 SF1)会立即更新。但是,如果用户在 SF1 中更改选择,则 SF2 会在 0.3-0-5 秒后更新。正如我在对 Alan Waage 评论的回复中解释的那样,SF2 依赖于 SF1 的选择,方法是使用 F 处的中间文本框,该文本框从 SF1 获取所选值,并由 SF2 读取。 【参考方案1】:

在 F1 中的单元格中添加更新后事件,这意味着 SF1 和 SF2 需要更新。在那种情况下调用 .Requery on SF1 和 SF2

【讨论】:

不走运,事件没有被触发。我为特殊控件(文本框)的 AfterUpdate 事件添加了一个基本的子函数(包含一个 MsgBox 语句)。当用户选择 SF1 中的其他行时,文本框的值会立即更改,但事件不会发生(不显示对话框)。还尝试了更改事件,结果相同。也许事件没有启动,因为文本框的值是由特殊的 SourceControl 属性(“=[SF1].[Form]![ID]”)设置的? 链接到 SF1 的文本框不是放置更新后检查的位置。 “但是,如果用户在 SF1 选择不同的行”这就是您需要事件调用的地方。按照提供的信息进行。 表单 F 的 texbox 从子表单 SF1 的选择中获取其值(使用公式“=[SF1].[Form]![ID]”)。子表单 SF2 获取表单 F 的 texbox 的值,并相应地显示行。没有 VBA 代码,一切都以图形方式设计(在“设计模式”下​​)。当用户在 SF1 更改选择时,F 的文本框值会立即更新,但 SF2 不会立即更新,它会在 0.3-0.5 秒后更新。 " 当用户在 SF1 更改选择时,F 的文本框值" 这就是您必须触发的内容。所以它不会是更新后的事件。您将不得不通过鼠标事件之一。 我通过在 SF1 的 Form_Current 事件中添加代码解决了这个问题(请参阅问题中的“更新”部分)。

以上是关于MS Access:相关子表单的即时更新的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 表单以更新多个表而无需子表单

Ms Access:来自另一个子表单的子表单重新查询未更新

在 MS Access 数据表子表单中导航和更新

MS Access 使用绑定表单更新未绑定表单

MS Access 嵌套子表单链接到主(父)表单

MS Access 2010:是不是可以链接数据表子表单