访问VBA导航到基于组合框的记录

时间:2017-10-16 06:15:33

标签: vba ms-access combobox access-vba

想象一下表(tblEmployee)设置如下:

  1. 的EmpID(PrimaryKey的)
  2. EmpName(ShortText)
  3. EMPNO(ShortText)
  4. EmpPhoto(附件)
  5. 在表单上,​​我希望能够从Combobox(EmpName)中选择Employee的名称,以便其他控件更新并显示所选员工的编号和照片。

    我制作了一个表单(frmEmployee)并选择了Record Source:

      SELECT tblEmployee.* FROM tblEmployee;
    

    并通过“添加现有字段”标签将所有字段添加到表单中。然后我将文本框(EmpName)更改为具有两列的组合框,其中第一列的宽度为零,并将行源更改为:

    SELECT tblEmployee.ID, tblEmployee.EmpName
    FROM tblEmployee;
    

    因此,用户无需处理主键(EmpID)即可查看和选择任何员工的姓名。 此外,组合框(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)。

    如何解决这个问题?还有其他更快更好的方法吗?

2 个答案:

答案 0 :(得分:0)

只需使用未绑定的组合框。

要使您当前的组合框不受约束,只需删除Control Source属性。enter image description here

答案 1 :(得分:0)

由于您通过添加现有字段构建表单,然后将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.这样,ComboBox的“值”就是您选择的任何名称的EmpID。将ComboBox命名为cmbEmpID

3)在刚刚创建的未绑定表单上,添加一个子表单(这将是您在步骤1中创建的表单)。对于Source Object put frmEmployeeDetail。对于Link Master Fields put cmbEmpID。对于Link Child Fields put EmpID

现在,无论何时在ComboBox上选择名称,它都会将cmbEmpID的值设置为您刚刚选择的员工ID。由于您将其链接到子表单,子表单将显示与ComboBox匹配的任何数据(因为这是子表单所做的...)

就格式化而言,您可以从子窗体中删除边框等,并轻松地将其直接混合到“主”窗体中,以便它看起来像一个漂亮的窗体。最佳部分:全部内置。没有代码。