MS Access 选项卡式表单多个 OnCurrent 触发

Posted

技术标签:

【中文标题】MS Access 选项卡式表单多个 OnCurrent 触发【英文标题】:MS Access tabbed form multiple OnCurrent firings 【发布时间】:2017-04-19 23:04:39 【问题描述】:

我有一个访问 SQL Server 的客户端,它使用带有多个子表单的选项卡式表单。基本上,在主窗体上选择一个产品,然后选项卡允许编辑/插入存储在不同相关表中的产品的不同属性(选项、颜色、样式等)。每个子表单都使用自己的记录源,但会同步到产品编号上的主表单。

所以,我在一个子表单中有一个组合框,称为“选项”,我想使用“where”子句中使用产品编号的查询中的数据填充该组合框。这就是我需要做的。我的做法是使用 Options 子窗体的 OnCurrent 事件将 RowSource 设置为等于 SQL 字符串。这行得通,但是......每次在主窗体中选择新产品时都会触发 OnCurrent 事件,无论选项子窗体窗体是否具有焦点。 Then it fires again when Options get the focus.然后,由于 Options 使用数据表布局,它会为每条选定的记录触发,即使记录源不需要更改。

虽然这可行,但有很多不必要的数据来回传输到(非常)远程 SQL Server。那么,是否有另一个事件可以用于整个子表单,理想情况下只触发一次,而不是用于子表单中的每条记录?我试过Got Focus,但从未成功。选择新产品时(当然)不会触发 Open 和 Load 事件。或者我应该在其他地方设置选项子表单记录源?

这是事件代码:

Private Sub Form_Current()
    Dim sql As String
    sql = "SELECT O.[OptionID], O.[Caption] FROM ProductOptions AS O WHERE o.[OptionTypeID] in (1,2,8,9) AND o.ProductNumber = "
    sql = sql & "'" & Nz(Forms![products main form]!ProductNumber, "99test") & "'"
    oidSelect1.RowSource = sql
End Sub

感谢您的帮助。

吉姆

【问题讨论】:

所以您设置的是组合框的 RowSource 而不是叙述中所述的 RecordSource?为什么要使用代码来设置组合框的 RowSource?为什么不在 RowSource 属性中有 SQL 语句,然后在组合框 GotFocus 事件中的代码只是对 RowSource 进行重新查询? 嗯,过滤器(where 子句)必须动态设置,因为它会随着当前正在编辑的每个产品而变化。并且不会使用 GotFocus 对每个选定的记录进行组合框重新查询? (这是一个网格视图,因此组合框会复制到每一行。) 组合框 RowSource SQL 语句 WHERE 子句将引用 ProductNumber,因此它是动态的。 Seth 的回答是这样的,除了我会使用组合框 GotFocus 事件来触发重新查询。他确实对主要形式的依赖提出了很好的观点。通常,主组合框和从属组合框采用相同的形式。此外,带有显示别名值的查找的组合框在连续表单或数据表表单上效果不佳。 如果ProductNumber是表单和子表单的主/外键链接,那么为什么要引用主表单,ProductNumber应该是子表单RecordSource的一部分。 我尝试在子表单上引用产品编号,但是在添加新记录时,它具有空值,所以是的,我必须将其存储在隐藏字段中。 【参考方案1】:

我认为正确的方法是不要动态更改组合框的行源。相反,使用查询设计器将行源设置为查询,并让查询从“主表单”中读取值,就像您的示例代码中所示...Forms![products main form]!ProductNumber。

然后,我将使用 MAIN FORMs AfterUpdate 事件触发组合框的刷新。它将类似于 MainForm!MySubForm.Form("mycombobox").requery。 (我可能没有完全正确的语法......我的访问语法生锈了。)

顺便说一句,我不喜欢我自己的答案。原因是您正在对子表单与其父表单之间的依赖关系进行硬编码。如果您永远不会在其他任何地方使用该子表单,那可能会很好。为了解决这个问题,一些 Access 开发人员使用了一个隐藏的表单,该表单包含您从主窗体的更新后事件中设置的文本框。然后更新查询以引用您为此表单创建的隐藏表单的文本框。

还有其他方法可以做到这一点(例如公共函数)。但对不起,这不是你真正要求的。我的第一种方法会奏效。但是第一次需要重用该子表单时,您需要重构,隐藏表单解决方案效果很好。

【讨论】:

以上是关于MS Access 选项卡式表单多个 OnCurrent 触发的主要内容,如果未能解决你的问题,请参考以下文章

我的 MS Access 组合框仅适用于某些记录

在选项卡式表单中间添加额外(嵌套)表单的最佳方法

VBA 列出 MS Access 中所有打开的对象

具有单个选项卡形式的多个表

选项卡到 MS Access 中子表单的第一个字段

在 Access 2010 中查看时,Access 2007 表单中的幻影框