我正在尝试按照Microsoft's example关于如何向Microsoft Access中的ComboBox添加“全部”选项,但除了指定代码之外,他们的文章没有提供足够的指导。< / p>
我要做的是构建一个表单,允许用户从ComboBox中选择一个选项(选项是从表中的记录生成的),然后根据用户选择的选项构建一个过滤的报表。 ComboBox由2列组成:记录的主键/ ID及其可显示的名称。
我无法理解Microsoft提供的VBA代码足以弄清楚发生了什么,但我希望我的ComboBox中的“All”选项要么具有空白主键/ ID,要么具有= 0。情况并非如此,因为在使用表单时选择“全部”选项会导致错误消息“您输入的值对此字段无效”。这使我相信“全部”文本被填充到主键/ ID列而不是显示列。该示例指示我将显示列号分配为ComboBox的“Tag”属性 - 在这种情况下,我的显示列号为2.但是,这(以及我添加的几乎任何其他值)会导致上述错误信息。
不知道微软的例子是否适用于我的情况,或者我是否需要以某种方式调整他们的代码?
答案 0 :(得分:4)
检查组合框的Control Source属性。听起来它可能绑定到表单记录源中的字段。如果你使它成为未绑定控件(控件来源属性中没有任何内容),你应该可以从组合的行源中选择任何项目,而不会向你抱怨。
假设您的组合的行来源是这样的查询:
SELECT id, disp_name
FROM YourTable
ORDER BY disp_name;
您可以使用UNION查询添加“all”行:
SELECT id, disp_name
FROM YourTable
UNION ALL
SELECT TOP 1 0, "**ALL**"
FROM AnyTable
ORDER BY disp_name;
AnyTable可以就是这样。如果您碰巧有一个只包含一行的表,请使用那一行......您甚至不需要 TOP 1 部分。尽量不要使用一些ReallyBigTable作为AnyTable。
编辑:实际上,如果某个ReallyBigTable有一个主键或其他唯一字段,您可以在WHERE子句中使用它来检索单行,那么它会很好:
SELECT id, disp_name
FROM YourTable
UNION ALL
SELECT 0, "**ALL**"
FROM ReallyBigTable
WHERE pk_field = 1
ORDER BY disp_name;
UNION ALL将返回所有组合行。如果您有任何重复的行,则可以使用UNION而不是UNION ALL来稀疏它们。