【问题标题】:How can I auto select items in a multiselect listbox related to values in a table?如何在与表中的值相关的多选列表框中自动选择项目?
【发布时间】: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


【解决方案1】:

必须遍历列表框并与某个值进行比较以确定选择。在您的情况下,请在记录集上执行 FindFirst。如果找到匹配项,则选择项目。假设要匹配的值是数字键,请考虑:

    Dim rs As DAO.Recordset, i As Integer
    Set rs = CurrentDb.OpenRecordset("SELECT ColorID FROM tblColors WHERE CrayonID_HOLD=" & Me.CrayonID_HOLD)
    With Me.lstboxColor
    For i = 0 To .ListCount - 1
        rs.FindFirst "ColorID = " & .ItemData(i)
        .Selected(i) = Not rs.NoMatch
    Next
    End With

【讨论】:

  • 还没有工作...你知道这是否可以与 ADODB 一起工作吗?我注意到 FIndFirst 和 NoMatch 属性不适用于 ADODB。该数据库当前使用 ADODB 记录集和连接。在同一个项目中混用 DAO 不好吗?如果可以的话——我是否需要建立一个像Dim rs As ADODB.Recordset 'Dim cn As ADODB.Connection 'Set cnnLocal = CurrentProject.Connection 这样的连接但使用DAO???抱歉,到目前为止,我只熟悉 ADO……感谢您的帮助。很快就会得到这个工作!
  • 更新:您好 June7,我使用您提供的代码几乎可以正常工作,但无论如何它只选择 1 行。列表框中只有 6 行。它在列表框中选择的行号对应于传递给匹配的 ID 号。例如如果传递了 ID '2',则仅选择列表框中的第 2 行,而实际上(与表格匹配)它应该是第 1、2、4、5 行。有什么想法吗?
  • 发布的代码(使用我的数据库对象名称除外)对我有用。 ID 号与行号匹配无关紧要 - ID 可能是 217 等。这是一个奇怪的失败,我无法解释。你一步调试了吗?编辑问题以提供数据样本和您的确切代码。我对我的代码稍作修改。
  • 添加了当前的确切代码。正在使用 3 个表 - 音乐、设备、MusicEquipment(链接其他 2 个)。
猜你喜欢
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多