【发布时间】:2019-10-12 07:23:25
【问题描述】:
到目前为止,我已经完成了与此相反的操作 - 我已根据在多选列表框中所做的选择将记录输入到表中。多选列表框命名为“lstboxColor”,表命名为 tblColors。这是通过以下代码完成的:
Set rs = New ADODB.Recordset
Dim itm As Variant
cnnLocal.CursorLocation = adUseClient 'avoid error 3705
'SET UP A LOOP TO ADD A COLOR RECORD IN THE COLORS TABLE FOR EACH SELECTED COLOR
rs.Open "tblColors", cnnLocal, adOpenDynamic, adLockOptimistic
For Each itm In lstboxColor.ItemsSelected
rs.AddNew
rs!CrayonID = CrayonID_HOLD
rs!ColorID = lstboxColor.ItemData(itm)
rs.Update
Next
rs.Close
所以,现在我想做与此相反的操作 - 我需要打开一个带有列表框的表单,并根据表中的值自动预选多选列表框中的项目。除了循环遍历表并使用 if 语句和 .Selected = true 之外,似乎无法弄清楚所需的方法。有任何想法吗?提前谢谢你。
编辑:添加了几乎可以工作的当前代码。更改了我需要做的事情 - 我正在使用 3 个表格,并且有一个组合框选择自动选择列表框中的行。代码在组合框的 AfterUpdate() 中。我添加了“Else: If rs.NoMatch Then .Selected(i) = False”——但这不是问题。认为它可能是 SQL 查询,但同样的查询在子表单中提取了正确的答案,所以我知道该查询有效。可能是我用于列表框行的查询(仅从 tblEquipment 中选择 EquipmentID 和 Equipment name)?请让我知道您对它可能仅突出显示列表框中的一行的原因有何看法。
编辑:此代码适用于 3 个表。组合框中的选择会自动选择列表框中的正确行。解决方案标记为 2 表版本(或 1 表),但概念相同。
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim i As Integer
Dim strSQL As String
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT tblMusicEquipment.EquipmentID, *
FROM tblMusic
INNER JOIN (tblEquipment INNER JOIN tblMusicEquipment
ON tblEquipment.EquipmentID = tblMusicEquipment.EquipmentID)
ON tblMusic.InstrumentID = tblMusicEquipment.InstrumentID
WHERE (((tblMusic.InstrumentID))) = " & [cboSelectInstrument])
With Me.LstEditEquip
For i = 0 To .ListCount - 1
rs.FindFirst "EquipmentID =" & .ItemData(i)
If Not rs.NoMatch Then
.Selected(i) = True
Else: If rs.NoMatch Then .Selected(i) = False
End If
Next
End With
【问题讨论】:
-
应在代码中使用续行以使其更具可读性。将数据样本作为有问题的表格提供会很好。最初的例子是关于颜色的,只涉及 2 张桌子。问题的具体内容已更改。
-
您的查询提取了 EquipmentID,但代码表明 InstrumentID 是搜索的值。这些真的是一回事吗? FindFirst 语法不正确:
rs.FindFirst "EquipmentID=" & .ItemData(i) -
你成功了。这是寻找错误的东西和语法的结合。现在可以了!将您的问题标记为解决方案。非常感谢!
-
将您的 *ANSWER 标记为解决方案,再次感谢您。
标签: ms-access