Access中ComboBox如何始终显示关联ID名称且下拉仅展示在职员工?
解决Access组合框显示历史离职员工+仅允许选择在职员工的问题
核心思路
组合框的行来源必须包含所有员工(才能匹配历史离职员工的ID并显示姓名),但通过动态控制下拉列表内容,仅展示在职员工供选择。
具体实现步骤
调整组合框基础行来源
把原仅筛选在职员工的查询,替换为包含所有员工的查询,示例SQL:SELECT EmployeeID, FullName FROM Employees ORDER BY FullName;这样无论员工是否在职,只要工单
AssignedTo字段存储的ID存在于员工表,组合框就能匹配到对应的姓名并显示。通过DropDown事件限制下拉选项
打开表单设计视图,选中目标组合框,为DropDown事件添加VBA代码:Private Sub cboAssignedTo_DropDown() ' 下拉触发时,临时将行来源切换为仅在职员工 Me.cboAssignedTo.RowSource = "SELECT EmployeeID, FullName FROM Employees WHERE EmploymentStatus='Active' ORDER BY FullName;" End Sub通过LostFocus事件恢复全量行来源
为组合框的LostFocus事件添加代码,确保控件失去焦点后,行来源恢复为所有员工,保证浏览历史工单时能正常显示离职员工姓名:Private Sub cboAssignedTo_LostFocus() ' 失去焦点后,恢复包含所有员工的行来源 Me.cboAssignedTo.RowSource = "SELECT EmployeeID, FullName FROM Employees ORDER BY FullName;" End Sub锁定输入范围
确认组合框的LimitToList属性设为Yes,避免用户手动输入不在列表中的值,确保只能选择下拉里的在职员工。
无VBA替代方案
如果不想编写代码,可通过查询参数结合控件属性实现:
- 创建查询
qryEmployeesForAssignment,将EmploymentStatus字段的条件设为:IIf(Forms!你的表单名!cboAssignedTo.Tag="DropDown", "Active", "*") - 将组合框的行来源设为该查询
- 为
DropDown事件添加代码:Me.cboAssignedTo.Tag = "DropDown": Me.cboAssignedTo.Requery - 为
LostFocus事件添加代码:Me.cboAssignedTo.Tag = "": Me.cboAssignedTo.Requery
原设置无效的原因
之前仅将行来源限制为在职员工,导致存储的离职员工ID无法在组合框的行来源中找到匹配项,自然无法显示姓名。Show Only Row Source属性的作用是控制是否仅显示行来源内的项,但前提是行来源必须包含要显示的目标项。
内容的提问来源于stack exchange,提问作者Chris Hughson
相关产品推荐
相关产品推荐

