0

我有一个包含大约 500,000 条记录的 Access 表。当我在 ComboBox 中键入文本时,我想修剪结果。基本上,我需要一个动态组合框,当我在组合框中键入时,它会根据每个字符显示记录。

问题是,ComboBox 的基础表有大约 500,000 条记录。并且 ComboBox 对象在达到其限制之前只能显示 65,000 条记录,并且不会预览其余记录。没有人会同时查看 65,000 条记录,但是当键入整个记录集中间的任何数字时,这些记录根本不会显示。因为该特定数字超出了 65,000 的限制。所以我需要一个用于整个表格的动态组合框。

例如,如果您正在查看一堆 SSN,而不是 ComboBox 显示它不能显示的所有记录,因为 SSN 太多(超过 65,000 是 ComboBox 限制)这就是我需要的。

如果在 ComboBox 中键入 5。该列表将仅显示 5 组数字。如果您键入 51,它会将列表值限制为 51 系列数字。如果您键入 512,它会将列表值限制为 512 系列数字,依此类推。不过,对于整张桌子,不仅仅是前 65K。

到目前为止我已经尝试过的是实现第二个未绑定的文本框,但是,这使得查询成为一个两步过程。我想知道我是否可以一起做这一切。

4

1 回答 1

2

David W Fenton 已经在这里为这个问题提供了相当详细的答案。要点:

最简单的方法是仅在您在其中键入一些字符后分配组合框的 Rowsource。您可以在组合框的 OnChange 事件中执行此操作

Allen Browne 的Combos with Tens of Thousands of Records有一些其他的花里胡哨(将逻辑抽象为一个函数,如果值没有改变,则防止重新计算 RowSource),但基本思想是相同的:

  1. 将组合的 RowSource 属性留空。
  2. 创建一个在输入最少字符数后分配 RowSource 的函数。仅加载与这些初始字符匹配的条目,因此组合的 RowSource 永远不会包含超过几百条记录。
  3. 在组合的 Change 事件和窗体的 Current 事件中调用此函数。

如果您真的想在输入每个字符时连续过滤 RowSource,您可以调整这些答案来做到这一点。例如,您可以将 David W Fenton 解决方案中的测试条件更改为If Len(Me!cmbMyCombo.Text) >= 1. 对于 Allen Browne 解决方案,您可以将常量设置为 1 并将设置的行更改sNewStub为:sNewStub = Nz(sSuburb, "")

但是,在您的 RowSource 查询返回的一大块数字小于行限制之前,您不会看到任何好处。这就是为什么上面链接的两个解决方案在输入 2 个(或 3 个或 4 个)初始字符后开始过滤的原因。

于 2016-08-06T06:33:18.203 回答