Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access Access 2010-组合框-未绑定表单-显示现有记录中的数据_Ms Access_Vba_Ms Access 2010 - Fatal编程技术网

Ms access Access 2010-组合框-未绑定表单-显示现有记录中的数据

Ms access Access 2010-组合框-未绑定表单-显示现有记录中的数据,ms-access,vba,ms-access-2010,Ms Access,Vba,Ms Access 2010,我遇到的问题是,当用户查看/编辑数据时,在未绑定表单的组合框中显示正确的信息 填充组合框的表格: tblLocation idLocation Location Location Description 在tblPerson表中,有一个名为idLocation的FK字段。我有一个表单,允许用户从列表框中选择一个人,并在文本框和组合框中显示信息 组合框是使用以下项目设置的: idLocation <--- column width set to 0 Location

我遇到的问题是,当用户查看/编辑数据时,在未绑定表单的组合框中显示正确的信息

填充组合框的表格:

tblLocation   
  idLocation  
  Location
  Location Description
在tblPerson表中,有一个名为idLocation的FK字段。我有一个表单,允许用户从列表框中选择一个人,并在文本框和组合框中显示信息

组合框是使用以下项目设置的:

idLocation  <--- column width set to 0
Location
问题是msgBox cmbLocation将显示文本而不是FK。如果用户尝试编辑数据,但未进行任何更改,则将尝试保存文本而不是FK

我找到了一种手动方法,但我不确定它是否是最好的方法:

        For i = 0 To (cmbLocation.ListCount - 1)
            If Val(cmbLocation.Column(0, i)) = Val(.Fields("idLocation").Value) Then
                cmbLocation = cmbLocation.ItemData(i)
                Exit For
            End If
        Next
同样,这是可行的——但我不得不认为我做错了什么——可能是一些显而易见的事情


有更好的方法吗?

您可以动态更改组合框中显示的数据。在您的场景中,我建议您使用列表框的OnClick事件(一旦选择了此人)。添加以下代码:

yourcomboxname.RowSource=“从tballocation WHERE idLocation=“&FK”中选择*


如果单击某个人后,组合框中的数据没有更改,则可能需要进行“Me.Refresh”

将表单基于在位置列中留下联接的查询


然后,当该字段绑定到文本框时,该字段将显示为自动且无任何代码。更好的是,如果实际位置值发生变化,则不需要更新代码等。事实上,这就是关系数据库的全部优点

这是一个连续形式,对吗?若否,则为单一表格。列表框用于选择。一旦一个人被选中,数据就会显示在右边的几个文本框和组合框中。啊,但是表单是无限的。这是一个相当复杂的表单,使用选项卡引导用户完成一个流程。使用unbounded的原因是它为审计目的提供了更好的控制。unbound的结果是您编写了太多的代码。一个装订的表格在这里就足够了。在一天结束时,您仍然使用一个查询来获取一条记录,我的建议是使用一个带有左连接的查询来引入组合描述数据列。这意味着您不需要特殊代码。组合框可以而且应该仍然基于引入适当列的查询(第一列仍然是PK)。同样,这将导致您不必使用dlookup()或从原始查询中创建单独或特殊的记录集来获取组合显示的值。
        For i = 0 To (cmbLocation.ListCount - 1)
            If Val(cmbLocation.Column(0, i)) = Val(.Fields("idLocation").Value) Then
                cmbLocation = cmbLocation.ItemData(i)
                Exit For
            End If
        Next