访问 VBA 基于组合框导航到记录
Posted
技术标签:
【中文标题】访问 VBA 基于组合框导航到记录【英文标题】:Access VBA Navigate to a record based on a combobox 【发布时间】:2017-10-16 06:15:33 【问题描述】:想象一个表(tblEmployee)设置如下:
-
EmpID(PrimaryKey)
EmpName(ShortText)
EmpNo(ShortText)
EmpPhoto(附件)
在表单上,我希望能够从 Combobox(EmpName) 中选择员工姓名,以便其他控件更新并向我显示所选员工的编号和照片。
我已经制作了一个表格(frmEmployee)并将记录源选择为:
SELECT tblEmployee.* FROM tblEmployee;
并通过“添加现有字段”选项卡将所有字段添加到表单中。然后,我将 textbox(EmpName) 更改为具有两列的组合框,第一列的宽度为零,并将 Row Source 更改为:
SELECT tblEmployee.ID, tblEmployee.EmpName
FROM tblEmployee;
因此用户可以查看和选择任何员工的姓名,而无需处理主键 (EmpID)。 还有combobox(EmpName)的afterUpdate事件是这样的:
Private Sub EmpName_AfterUpdate()
' Find the record that matches the control.
Dim rs As Object
Set rs = Me.Recordset.Clone
rs.FindFirst "[ID] = " & Str(Nz(Me![EmpName], 0))
If Not rs.EOF Then Me.Bookmark = rs.Bookmark
End Sub
这为我提供了我想要的功能,而且每当我从组合框中选择另一个员工姓名时,当前员工的姓名都会更新为新选择的员工的 ID(EmpID)。
如何解决这个问题?还有其他更快更好的方法吗?
【问题讨论】:
【参考方案1】:只需使用未绑定的组合框。
要解除当前组合框的绑定,只需删除 Control Source
属性即可。
【讨论】:
【参考方案2】:由于您通过添加现有字段构建表单,然后将 EmpName
更改为 ComboBox,因此 ComboBox 仍然绑定到数据库中的员工姓名!!
我的意思是,如果您显示 John Smith 的记录并在组合框中选择“Peter Griffin”,那么您只是将 John 的名字更改为“Peter Griffin”。您所追求的功能已经很好地内置在 Access 中。这是执行此操作的“标准”方式...
1) 创建一个表单(这将是一个子表单)。叫它frmEmployeeDetail
。将Record Source
指定为tblEmployee
,并像以前一样将所有员工字段添加到其中。
2) 现在创建一个未绑定的表单(Record Source
的 nothing 表单)。将您的 ComboBox 添加到其中。将Row Source
设置为像以前一样显示名称,但将Control Source
留空!您不希望此 ComboBox 更改任何基础数据。你只是想让它坐在那里,现在看起来很漂亮。确保将Bound Column
设置为1。这样组合框的“值”就是您选择的任何名称的EmpID
。将组合框命名为 cmbEmpID
。
3) 在您刚刚创建的未绑定表单上,添加一个子表单(这将是您在步骤 1 中创建的表单)。对于Source Object
,请输入frmEmployeeDetail
。对于Link Master Fields
输入cmbEmpID
。对于Link Child Fields
,请输入EmpID
。
现在,每当您在 ComboBox 上选择一个名称时,它会将 cmbEmpID
的值设置为您刚刚选择的任何员工 ID。由于您将其链接到子表单,因此子表单将显示与 ComboBox 匹配的任何数据(因为这是子表单所做的......)
就格式而言,您可以从子表单中删除边框等,并轻松地将其融合到“主”表单中,使其看起来像一个不错的表单。最好的部分:全部内置。没有代码。
【讨论】:
我也喜欢这种方法,但是因为我会导致拥有更多对象,所以我会接受 Erik 的建议。无论如何,根据您的经验,从长远来看,哪种方法更适合数据库可管理性、编写更少的代码或拥有更少的对象? 不管怎样。像员工表这样的大表,我喜欢你原来的方法(Erik 建议取消绑定组合框)。对于较小的“类别”类型表(如“员工部门”、“职位名称”等——只有少于 30 个左右条目且相当静态的表),我喜欢使用我的方式。我使用列表框而不是组合框,因此我可以查看所有条目并选择要为其设置定义的条目。对于这类表格,我喜欢这种方法,主要是因为那些“类别”类型的表格通常用于在其他地方填充下拉菜单 ...在您的 GUI 中。因此,能够在列表框中看到这些选项,我可以在“主”表单上查看所有选项、调整列表顺序等,但在子表单端设置每个选项的单独行为属性,我觉得非常有用。不过,您是对的……在您正在查找数据的非静态大表上,您的方法确实更简单。现在你明白为什么它不起作用了,所以这都是从这里开始的偏好。以上是关于访问 VBA 基于组合框导航到记录的主要内容,如果未能解决你的问题,请参考以下文章
使用带有 postgresql 表的 vba 填充组合框访问 2007
通过在列表下拉组合框中选择它来访问 VBA 代码以转到另一个表单上的特定记录