Access 组合框新增链接主子字段:级联下拉不用再写 VBA
Access 组合框新增链接主子字段:级联下拉不用再写 VBA
摘要: Access 更新后,组合框也能设置「链接主字段」和「链接子字段」。选了产品类别,产品列表自动跟着筛选,常见的级联组合框不用再写 AfterUpdate 事件代码。access开发|access培训|access框架|请添加edonsoft。

Hi,大家好!
做订单录入时,经常要放两级下拉框:先选产品类别,再选产品。类别选了「办公用品」,产品框里就只列笔、纸、文件夹;换成「电脑配件」,列表跟着换。
以前做这个联动,我通常在类别组合框的 AfterUpdate 事件里改产品框的 RowSource,然后再 Requery。界面上再加几个筛选条件,事件代码就越来越长;另一个窗体要做同样的联动,还得再复制一遍。
新版 Access 的组合框属性里增加了「链接主字段(Link Master Fields)」和「链接子字段(Link Child Fields)」。把父级控件和子级列表中的关联字段配好,Access 就会替你限制子组合框的选项。普通的级联下拉,事件代码可以省掉。

用产品类别和产品做例子
假设有两张表:
产品类别
| 字段 | 类型 | 示例 |
|---|
| 类别ID | 自动编号,主键 | 1 |
| 类别名称 | 短文本 | 办公用品 |

产品档案
| 字段 | 类型 | 示例 |
|---|
| 产品ID | 自动编号,主键 | 101 |
| 产品名称 | 短文本 | A4 复印纸 |
| 类别ID | 数字(长整型) | 1 |

产品档案里的 类别ID 是外键,说明这个产品属于哪个类别。组合框联动时,Access 就是拿主组合框当前的类别 ID,到子组合框的数据源里找相同的类别 ID。
先设置主组合框
在订单录入窗体上放一个组合框,名称设为 cbo类别。它的行来源取自产品类别表:
SELECT [类别ID], [类别名称]
FROM [产品类别]
ORDER BY [类别名称];
组合框属性这样设:
第一列存类别 ID,宽度设为 0,不显示;用户看到的是第二列的类别名称。主组合框的实际值是数字 ID,不是显示出来的文字。
再设置子组合框
添加第二个组合框,名称设为 cbo产品。行来源把产品 ID、产品名称和类别 ID 都选出来:
SELECT [产品ID], [产品名称], [类别ID]
FROM [产品档案]
ORDER BY [产品名称];
对应的组合框属性:
绑定列(Bound Column):1
列数(Column Count):3
列宽(Column Widths):0cm;4cm;0cm
链接主字段(Link Master Fields):cbo类别
链接子字段(Link Child Fields):类别ID
这里容易漏的是第三列。它虽然隐藏了,但必须在子组合框的行来源里,Access 才能用它和 cbo类别 的值做匹配。两个字段的数据类型也要兼容:上面的类别 ID 都是数字长整型。
如果 cbo产品 绑定到订单明细表的 产品ID 字段,用户最后保存的是产品 ID;类别框可以按你的表结构决定是否绑定,或者作为筛选用的未绑定控件。
属性在哪儿设置
在窗体设计视图里选中子组合框 cbo产品,打开属性表,在「数据」选项卡里找到:
链接主字段:输入 cbo类别
链接子字段:输入 类别ID
注意,这是设在子组合框上,不是设在 cbo类别 上。主字段填父级控件名称;子字段填子组合框行来源里的字段名。

保存窗体后切到窗体视图,先选一个类别,再打开产品下拉框,列表里应该只剩下该类别的产品。换类别,产品列表也会跟着变化。基本联动不需要再给 cbo类别_AfterUpdate 写 Requery。
三级下拉也能照着接
比如地区选择是「省份 → 城市 → 区县」,先把城市组合框的链接主字段设为省份组合框,链接子字段设为城市数据源中的省份 ID;再把区县组合框的链接主字段设为城市组合框,链接子字段设为区县数据源中的城市 ID。
每一级只负责和紧挨着的上一级关联。字段名可以不同,字段值和数据类型要能对应上。城市和区县的数据源里都要包含用于关联的 ID 列,即使这列宽度设为 0,也不能从行来源里删掉。
以前写的代码要不要删
如果原来的 AfterUpdate 代码只做了两件事:重新查询子组合框、刷新子组合框,那么改好这两个属性后,这段代码可以去掉。
如果事件里还做了其他事,比如清空旧产品、检查库存、自动选中第一项,不要整段删掉。可以先保留那些业务处理,只删重复的筛选和刷新代码,再测试新增记录和修改旧记录两种情况。
还有个细节:换了类别后,原来选中的产品可能不属于新类别。联动会限制下拉列表,但你的表结构和保存逻辑仍要保证产品选择有效。数据关系重要的话,在表结构或保存校验里也加一道约束,不能只靠界面下拉框。
属性表里没有这两项
这两个属性是随 Access 更新加入的,具体能否看到和 Office 版本、更新通道有关。先到「文件 → 帐户 → 关于 Access」查看版本并安装 Office 更新,再回到窗体设计视图查看子组合框的「数据」选项卡。
如果你的 Access 还没有这两个属性,旧的 AfterUpdate + Requery 做法仍然能用。属性出现后,可以把简单联动改成属性配置;有额外业务动作的事件代码则继续保留。
这次更新省掉的是级联下拉里那段重复的筛选代码。主、子数据源和关联字段还是要设计好;配对正确后,窗体代码会清爽不少。
列表框也是一样
列表框里也是一样有同样的功能。只要设置好「链接主字段」和「链接子字段」,上级列表框选项变化时,下级列表框会自动筛选,无需额外的 AfterUpdate 事件代码。
