我有一个MS Access数据库,我创建了一个表单,可以在列表框中选择多个项目。我用管道保存到数据库中分隔符。我遇到的问题是当有人需要修改表单时,我需要用它的普通值填充列表框,然后根据数据库的拉动,选择项目。
我目前有一个开始,我分割从数据库中提取的记录,但之后我迷路了:
temps = Split(records("Pillar"), "|")
我知道我需要做一个 For Each 声明,但我迷路了。我试过......
For Each varItem In temps
Pillar.ItemData(0) = varItem
Next
但这不起作用。这就是我所能得到的唯一正确值,我可以使用的是Pillar.ItemsSelected
,但是当我这样做时,我收到了一个只读错误。
答案 0 :(得分:0)
您检索records("Pillar")
,这是一串|
- 分隔的数字。然后Split()
将该字符串转换为数组。关键是要选择其值与其中一个数组成员匹配的每个列表框行。
但是,我认为你实际上并不需要一个数组。将|
添加到该字符串的开头和结尾应该更容易,然后使用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
该click事件的效果是选择与1,2或3匹配的列表框行,并取消选中所有其他行。
我意识到Me.lstPillar.Selected(i)
声明可能具有挑战性。我建议的最好的方法是返回立即窗口示例,希望能够说清楚。