【问题标题】:ACCESS 2010 - Autopopulating text fields based off of two comboboxesACCESS 2010 - 基于两个组合框的自动填充文本字段
【发布时间】:2014-04-13 19:51:24
【问题描述】:

我现在有两张桌子。一种称为 Workstations[ID, WorkstationName, Image, Operating System],另一种称为 Machines[ID,Asset Tag, Serial Number, MAC, Comments]。我现在有两个组合框。一个用于显示所有工作站名称(cboWorkstationName)列表的工作站表,另一个用于显示所有资产标签(cboAssetTags)列表的机器表

制作此表单的目的是,当我在 cboWorkstationName 中选择一个值时,我希望它根据 Workstations 表自动填充所有文本字段,组合框 cboAssetTags 自动填充与 Machines 表相关的字段第二个组合框。最后,我希望能够通过使用下拉列表轻松地将不同的资产标签数据保存到任何工作站。

现在,cboWorkstationName 会根据 Workstations 表和 cboAssetTags 自动填充文本字段,但不会填充基于 Machines 表的文本字段。但是,当我单击资产标签(从第二个组合框)时,它会自动填充相关字段。它只是没有填满每个领域。

关于我如何自动填充,对于第一个组合框,我将表单绑定到第一个表,并将继承值列表设置为是。对于第二个组合框,我只是将 Control Source 设置为 ID。对于第二个组合框下方的文本字段,我为 OnChange 事件编写了以下代码。

Me.txtSerialNumber.Value = Me.cboAssetTag.Column(2)
Me.txtMAC.Value = Me.cboAssetTag.Column(3)
Me.txtComments2.Value = Me.cboAssetTag.Column(4)

我想我必须在某处添加一行代码,以便在我更改第一个组合框时刷新/运行第二个组合框。

如果您需要任何澄清,请告诉我。

提前致谢!

编辑:

Private Sub cboWorkstationID_Change()
Dim db As Database
Dim rec1 As Recordset
Dim rec2 As Recordset

Set db = CurrentDb
Set rec1 = db.OpenRecordset("SELECT * FROM Workstations WHERE ID = " &     Me.cboWorkstationID.Column(0) & "")
Set rec2 = db.OpenRecordset("SELECT * FROM Machines WHERE ID = " & Me.cboAssetTag.Column(0) & "")

Me.txtComments.Value = rec1("Comments")
Me.txtImage.Value = rec1("Image")
Me.txtOperatingSystem.Value = rec1("Operating System")
Me.txtLocation.Value = rec1("Location")
Me.txtSerialNumber.Value = rec2("Serial Number")
Me.txtMAC.Value = rec2("MAC")
Me.txtComments2.Value = rec2("Comments")


Set rec1 = Nothing
Set rec2 = Nothing
Set db = Nothing
End Sub

【问题讨论】:

  • 你有 Me.cboAssetTag.Requery 吗?
  • 是的,我尝试为 cboAssetTag 组合框的 OnChange 事件添加它,但它不起作用。我在想我可能需要将它添加到 cboWorkstationName 吗?编辑:刚试过,也没有用。我在想我可能必须写一些东西来更新第二个框,就好像对那个组合框做了一个实际的操作。

标签: database vba ms-access combobox


【解决方案1】:

如果您使用查询来填充文本框会更好。我要做的是编写一个函数,并在两个组合的 OnChange 事件中执行该函数。比如:

Dim db as Database
Dim rec1 as Recordset
Dim rec2 as Recordset

Set db = CurrentDB
set rec1 = db.OpenRecordset("SELECT * FROM Workstations WHERE ID = " & Me.cboWorkstationName.Column(0) & "")
set rec2 = db.OpenRecordset("SELECT * FROM Machines WHERE ID = " & Me.cboAssetTags.Column(0) & "")

Me.txtWorkstationName.Value = rec1("WorkstationName")
Me.txtSerialNumber.Value = rec2("Serial Number")
Me.txtMAC.Value = rec2("MAC")
etc...

Set rec1 = Nothing
Set rec2 = Nothing
Set db = Nothing

您可以相应地填写其余字段。只需确保您的组合具有默认值,或者您有某种类型的错误捕获/编码默认值,以便在您第一次更改组合时它会正常运行。

【讨论】:

  • 我不同意,我认为将数据提取到组合框并使用 OP 中所暗示的列是可行的方法。
  • 只是好奇为什么您认为将所有数据拉到下拉列表中比将通过管道的数据最小化更好?
  • 对于 Me.txtWorkstationName.Value = rec1("WorkstationName") 部分,是否仅针对我想要自动填充的所有不同文本字段?
  • 是的。每次更改下拉列表中的值时,您都将更新每个文本字段。如果您愿意,您可以将其拆分,或者强制用户从两个下拉菜单中做出选择,而是在您的表单上放置一个“提交”按钮并在单击提交按钮时运行该函数。
  • 我是否也需要包含组合框?现在我收到一条错误消息,提示找不到方法或数据成员。但这可能是我的字段名称的问题。
猜你喜欢
  • 2012-11-24
  • 1970-01-01
  • 2012-02-29
  • 2012-02-15
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多