1

我有一个 MS Access 数据库,并且我创建了一个表单,可以在其中选择列表框中的多个项目。我用管道保存到数据库中 | 分隔符。我遇到的问题是当有人需要修改表单时,我需要用它的正常值填充列表框,然后根据从数据库中提取的内容,选择项目。

我目前开始拆分从数据库中提取的记录,但之后我迷路了:

temps = Split(records("Pillar"), "|")

我知道我需要做一个For Each语句,但我迷路了。我试过做...

For Each varItem In temps
    Pillar.ItemData(0) = varItem
Next

但这不起作用。就我所知,我可以使用的唯一其他正确值是Pillar.ItemsSelected,但是当我这样做时收到一个只读错误。

4

1 回答 1

0

您检索records("Pillar")哪个是一串 -分隔的|数字。然后Split()将该字符串放入一个数组中。关键是选择其值与这些数组成员之一匹配的每个列表框行。

但是,我认为您实际上并不需要数组。|在该字符串的开头和结尾添加 a 应该更容易,然后用于InStr()检查包含在|字符中的列表框值是否存在于修改后的字符串中。

这种描述可能难以理解。看看这个来自即时的例子是否阐明了这一点。

cstrPillar = "1|2|3"
? "|" & cstrPillar & "|"
|1|2|3|
strListBoxValue = "3"
? "|" & strListBoxValue & "|"
|3|
? InStr(1, "|" & cstrPillar & "|", "|" & strListBoxValue & "|")
 5 

如果这是有道理的,这就是我在命令按钮的单击事件中应用它的方式。请注意,我使用字符串常量 ,cstrPillar作为您使用 动态检索的字符串的代理records("Pillar")。我将我的多选列表框命名为lstPillar.

Private Sub cmdSelectRows_Click()
    Const cstrPillar As String = "1|2|3"
    Dim i As Long
    For i = 0 To (Me.lstPillar.ListCount - 1)
        Me.lstPillar.Selected(i) = ( _
            InStr(1, _
                "|" & cstrPillar & "|", _
                "|" & Me.lstPillar.ItemData(i) & "|") > 0)
    Next
End Sub

该单击事件的效果是选择与 1、2 或 3 匹配的列表框行,并取消选择所有其他行。

我意识到这个Me.lstPillar.Selected(i)陈述可能具有挑战性。我能建议的最好的方法是参考即时窗口示例,并希望它足够清楚。

于 2013-10-11T20:31:39.040 回答