只是为了增加组合,我会提供两种方法,一种推荐,另一种不推荐。
方法 1:如果您已将表单绑定到整个数据表(这是不推荐的方法),您可以使用组合框向导导航到请求的记录,但我不会在最近的版本中推荐它使用权:
一个。它不允许您在创建代码之前正确命名组合框。
湾。代码是错误的。
这是我刚刚在我的测试数据库中生成的代码:
Dim rs As Object
Set rs = Me.Recordset.Clone
rs.FindFirst "[InventoryID] = " & Str(Nz(Me![Combo2], 0))
If Not rs.EOF Then Me.Bookmark = rs.Bookmark
这在很多方面都是错误的,这非常了不起。代码应该是这样的:
With Me.RecordsetClone
.FindFirst "[ID]=" & Me!cmbMyComboBox
If Not .NoMatch Then
If Me.Dirty Then Me.Dirty = False
Me.Bookmark = .Bookmark
Else
MsgBox "Not Found!"
End If
End With
当 RecordsetClone 已经存在时,不需要克隆表单的记录集。
当您可以直接使用预先存在的对象时,没有理由使用对象变量。
在离开记录之前需要检查脏记录,因为如果您不强制保存,保存过程中的错误可能会导致数据丢失。
但更好的方法是:
方法 2:使用组合框更改表单的基础记录源。
组合框的 AfterUpdate 事件如下所示:
If Not IsNull(Me!cmbMyComboBox) Then
Me.Recordsource = Me.Recordsource & " WHERE [ID]=" & Me!cmbMyComboBox
End If
现在,这只适用于第一次,因为在 Recordsource 的第二次重置时,您最终会得到两个 WHERE 子句,这并不好。有两种方法:
一个。假设表单在没有 WHERE 子句的情况下打开,将打开的记录源值存储在表单的 OnLoad 事件中的模块级变量中:
Private Sub Form_Load()
strRecordsource = Left(Me.Recordsource,Len(Me.Recordsource)-1)
End Sub
在模块级别,相应地定义 strRecordsource:
Dim strRecordsource As String
然后在组合框的 AfterUpdate 事件中,改为:
Me.Recordsource = strRecordsource & " WHERE [ID]=" & Me!cmbMyComboBox
现在,如果您的表单打开时已经定义了 WHERE 子句,它会变得更加复杂,但我不会深入讨论,而是将它作为练习留给读者,最好的方法可能是什么。