我有一个SQL Server的Access客户端,它使用带有多个子表单的选项卡表单。基本上,在主窗体上选择产品,然后选项卡可以访问编辑/插入存储在不同相关表中的产品的不同属性(选项,颜色,styes等)。每个子表单使用它自己的记录源,但同步到产品编号的主表单。
所以,我在一个子表单中有一个组合框,称之为"选项",我想填充查询中使用产品编号的数据"其中"条款。这就是我需要做的。我是如何使用Options子窗体的OnCurrent事件将RowSource设置为等于SQL字符串。这是有效的,但是......每次在主窗体中选择新产品时,OnCurrent事件都会触发,无论选项子窗体是否具有焦点。然后当Options获得焦点时它再次触发。然后,由于选项使用数据表布局,因此即使记录源不需要更改,它也会针对所选的每个记录触发。
虽然这很有效,但是很多不必要的数据都是在(非常)远程SQL Server上来回拍摄的。那么,是否有另一个使用的事件适用于整个子表单,理想情况下只触发一次,而不是子表单中的每个记录?我尝试过焦点,但从未解雇过。当选择新产品时,开放和加载事件不会触发(当然)。或者可能还有另一个地方我应该设置选项子窗体记录源?
这是事件代码:
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
感谢您的帮助。
吉姆
答案 0 :(得分:0)
我认为正确的方法是不动态更改组合框的行源。相反,使用查询设计器将rowsource设置为查询,并让查询从" main form"中读取值。就像你的示例代码中所示...... Forms![产品主要形式]!ProductNumber。
然后我将使用MAIN FORMs AfterUpdate事件触发组合框的刷新。它将类似于MainForm!MySubForm.Form(" mycombobox")。requery。 (我可能没有完全正确的语法...我的访问语法生锈了。)
顺便说一句,我不喜欢自己的答案。原因是您正在硬编码子窗体与其父窗体之间的依赖关系。如果您不希望在其他任何地方使用该子表单,那可能没问题。为了解决这个问题,一些Access Developers使用一个隐藏的表单,该表单包含您从主表单的After Update事件中设置的文本框。然后更新查询以引用您为此表单创建的隐藏表单的文本框。还有其他方法可以做到这一点(例如公共功能)。但对不起,这不是你要求的。我的第一种方法会奏效。但是,第一次需要重新使用该子表单时,您需要重构,隐藏的表单解决方案可以很好地工作。