我在 Access 表单上使用了几个绑定的 ListBox 控件。ListBox 的内容是相关的,因此,除其他外,当用户单击一个 ListBox 时,所选行可以在其他行中更改。一切正常,我已经做过很多次了,只要 ListBox 有一个列。我使用超级简单的 VBA 语法 lstBoxWhosis = "SomeText"
并且只要 ListBox 确实包含该项目,所选行就会成为包含该文本的行,而无需其他搜索、查找或重新定位命令。
我目前的头疼是多列ListBox。最左边的列没有唯一的条目,当我使用上述语法时,我得到一个重新定位,但仅限于包含文本的第一行。我需要根据两列中的值进行定位。是否有一些类似的方法可以对多列执行此操作,还是我必须手动搜索 ListBox 内容?
我已经尝试用空格、逗号和分号连接列,还有语法
lstBoxWhosis = array("SomeText1","SomeText2")
这些都没有运气。
雷木:
我现在就是这样做的,实际上很简单。这是代码:
lstSpoje = lstKatastr
Do Until lstSpoje.Column(1) = lstOblast
lstSpoje.Selected(lstSpoje.ListIndex + 1) = True
Loop
第一行直接定位到第一列中块的开头,第二行一步一步,检查第二列,直到它得到正确的行。重复的数量并不保证更有效的搜索方法。它工作正常,除了在重新定位期间显示会颤动。
否则,我会发布我认为相关的所有内容。ListBoxes 是绑定的,正如我在第一句话中所说的,这意味着它们基于表或查询。如果您认为还有其他信息可以帮助某人解决此问题,请告诉我可能是什么。
雷木:
是的,这无疑会奏效。实际上,我已经做了类似的事情,其中一个 ListBox 有近 15,000 个项目,所以为了帮助用户定位内容,我放入了 26 个带有字母的 CommandButton,将 ListBox 移动到该字母的开头。我使用以下代码来定位 ListBox
x = ActiveControl.Caption
i = CurrentDb.OpenRecordset("SELECT Count(*) FROM TableOfKatastrs WHERE Left(Katastr,1)<'" & x & "'").Fields(0)
lstKatastr.Selected(i) = True
我可能会为此采用类似的方案 - 它可以消除闪烁问题并且启动速度更快。但是我希望在我的第一个示例中使用一些鲜为人知的语法,其中一行代码可以完成所有操作:
lstBoxWhosis = "SomeText"
雷木:
我会满足于两个,因为我使用的是两列。:) 但说真的,简单的赋值语法是如此直接和优雅,而且经常有一些奇怪的措辞很少使用,鲜为人知,可以解决这样的问题。我已经尝试了各种其他的东西,比如
lstSpoje.Column(1) = "SomeText2"
但我得到的只是语法错误。也许它真的只适用于第一(或唯一)列。