我有一个包含大约500,000条记录的Access表。当我在ComboBox中输入文本时,我想减少结果。基本上,我需要一个动态的ComboBox,当我在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。
我做了什么因此实现了第二个未绑定的文本框,但是,这使得查询分为两个步骤。我想知道我是否可以一起完成这一切。
答案 0 :(得分:2)
David W Fenton已经为这个问题提供了一个相当详细的答案here。要点:
最简单的方法是只在您输入组合框中的某些字符后才分配组合框的Rowsource。您可以在组合框的OnChange事件
中执行此操作
Allen Browne的Combos with Tens of Thousands of Records还有一些其他的花里胡哨的东西(将逻辑抽象为函数,如果值没有改变则阻止重新计算RowSource),但基本思路是相同的:
- 将组合的RowSource属性留空。
- 创建一个函数,在键入最少数量的字符后分配RowSource。只加载与这些初始字符匹配的条目,因此组合的RowSource永远不会包含超过几百条记录。
- 在组合的更改事件和表单的当前事件中调用此函数。
醇>
如果你真的想在键入每个字符时连续过滤RowSource,你可以调整这些答案来做到这一点。例如,您可以将David W Fenton解决方案中的测试条件更改为If Len(Me!cmbMyCombo.Text) >= 1
。对于Allen Browne解决方案,您可以将常量设置为1并将设置sNewStub
的行更改为:sNewStub = Nz(sSuburb, "")
。
但是,在您的RowSource查询返回一小于行限制的数字之前,您将不会看到任何好处。这就是为什么上面链接的两个解决方案在键入2(或3或4)个初始字符后开始过滤的原因。