使用 Access 向导可以完成同样事情的一个更简单的版本。如果您在表单设计中打开表单向导并单击组合框按钮并指向表单标题中的某个位置,您将自动选择创建一个组合框,该组合框将查找与列出的内容匹配的记录在下拉列表中。
但是,请记住以下几点:
它仅在您将表单绑定到整个表时才有效(不推荐用于大型记录集)
它创建的代码非常糟糕。
有很多方法可以解决这个问题。如果您乐于将表单绑定到整个表格,书签导航(与向导创建的代码一样)就可以了。但是,我建议您使用此代码而不是向导代码(假设组合框有一个绑定列,其中包含您要查找的记录的 PK ID):
Private Sub MyComboBox_AfterUpdate()
If IsNull(Me!MyComboBox) Then Exit Sub
With Me.RecordsetClone
.FindFirst "[MyID]=" & Me!MyCombBox
If Not .NoMatch Then
If Me.Dirty Then Me.Dirty = False
Me.Bookmark = .Bookmark
End If
End With
End Sub
组合框需要使用 SQL 行源,它类似于:
SELECT CompanyID, CompanyName FROM Company ORDER BY CompanyName
并且您将组合框定义为有 2 列,第一个是绑定列,并且您将第一列的宽度设置为 0。向导将引导您完成此操作并为您进行设置。它唯一做错的事情就是为此编写了非常糟糕的代码。
现在,如果您不是在搜索唯一值,它会变得更加复杂,您可能想要使用不同的方法。假设您有一个显示人员的表单,并且您希望查看特定公司的人员。在这种情况下,您可能希望按 CompanyName 进行筛选。在这种情况下,您可能需要应用过滤器,而不是执行上述查找操作。在这种情况下,您的组合框的 AfterUpdate 事件将是这样的:
Private Sub MyComboBox_AfterUpdate()
If IsNull(Me!MyComboBox) Then Exit Sub
Me.Filter = "[CompanyName]=" & Chr(34) & Me!MyComboBox & Chr(34)
Me.FilterOn = True
End Sub
现在,在这种情况下,您的组合框将只有一列,带有公司名称且没有隐藏的 ID 字段,所以它有些不同。
我不喜欢编写这种由 Access UI 提供的过滤(您可以右键单击 CompanyName 字段并在弹出的快捷菜单中,输入您要过滤的公司名称,包括通配符,?和 *)。此外,当您在已有过滤器的情况下尝试过滤时,它可能会让人感到困惑。如果您只查看 CitiCorp,然后按 JP Morgan Chase 过滤,您将一无所获。
相反,我倾向于更改表单的 Recordsource,而不是应用过滤器。这意味着每次搜索都会为您提供一个新的结果集,并且是最有效的方法。在返回原始起点方面确实使事情变得更加复杂,但是在一个设计合理的应用程序中,您可能应该首先只向用户呈现数据的子集,所以这种方法的问题“原因”是您需要解决的问题,以构建适当且高效的用户界面,该界面仅检索用户真正需要的数据。