1

所以基本上我有一个 AddCompany 表单,其中有一个文本框 [CompanyName],我想在其中输入一个新的公司名称,但同时检查是否已经存在一个。

因此,例如,假设我想输入 Microsoft,当我输入 M 时,文本框会显示一大堆带有 M 的其他名称,然后一直继续,直到我输入完成输入 microsoft。基本上 jsut facebook 搜索框是如何工作的。

我如何在 Microsoft Access 2007 上实现这个?可能是在脏事件/更改/按键按下事件中吗???

请赐教!!

非常感谢!!!

4

3 回答 3

1

使用 Access 向导可以完成同样事情的一个更简单的版本。如果您在表单设计中打开表单向导并单击组合框按钮并指向表单标题中的某个位置,您将自动选择创建一个组合框,该组合框将查找与列出的内容匹配的记录在下拉列表中。

但是,请记住以下几点:

  1. 它仅在您将表单绑定到整个表时才有效(不推荐用于大型记录集)

  2. 它创建的代码非常糟糕。

有很多方法可以解决这个问题。如果您乐于将表单绑定到整个表格,书签导航(与向导创建的代码一样)就可以了。但是,我建议您使用此代码而不是向导代码(假设组合框有一个绑定列,其中包含您要查找的记录的 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,而不是应用过滤器。这意味着每次搜索都会为您提供一个新的结果集,并且是最有效的方法。在返回原始起点方面确实使事情变得更加复杂,但是在一个设计合理的应用程序中,您可能应该首先只向用户呈现数据的子集,所以这种方法的问题“原因”是您需要解决的问题,以构建适当且高效的用户界面,该界面仅检索用户真正需要的数据。

于 2009-06-25T20:58:30.783 回答
0

通常,此功能称为自动完成(我也听说过 find-as-you-type)。有一篇文章给出了如何在此页面上的 Access 中执行此操作的示例。

于 2009-06-25T16:20:25.053 回答
0

Access 中的表单具有事件处理函数。那么你不能使用添加到这些函数中的自动完成代码来实现这个功能吗?我在Google Books上找到一本书讨论这个问题。

我可以想到需要添加到事件处理函数中的以下代码:
1. SQL 查找现有的潜在匹配
项 2. 代码生成下拉框以显示潜在匹配项

于 2009-06-26T04:17:07.240 回答