【问题标题】:Access 2007, Textbox search box like the Facebook name search box on the top rightAccess 2007,文本框搜索框,如右上角 Facebook 名称搜索框
【发布时间】:2010-11-05 21:35:03
【问题描述】:

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

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

如何在 Microsoft Access 2007 上实现此功能?可能是在脏事件/更改/按键按下事件中???

请赐教!!

非常感谢!!!

【问题讨论】:

    标签: database vba facebook ms-access-2007 search


    【解决方案1】:

    一般来说,此功能称为自动完成(我也听说过 find-as-you-type)。 Access on this page 中有一篇文章给出了如何执行此操作的示例。

    【讨论】:

      【解决方案2】:

      使用 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,而不是应用过滤器。这意味着每次搜索都会为您提供一个新的结果集,并且是最有效的方法。在返回原始起点方面确实使事情变得更加复杂,但是在一个设计合理的应用程序中,您可能应该首先只向用户呈现数据的子集,所以这种方法的问题“原因”是您需要解决的问题,以构建一个适当且高效的用户界面,该界面仅检索用户真正需要的数据。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-13
          相关资源
          最近更新 更多