1

我在 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"

但我得到的只是语法错误。也许它真的只适用于第一(或唯一)列。

4

1 回答 1

0

我正在寻找这些方面的东西,并遇到了这个旧帖子。我知道这是一条路,所以这更多地是为了为任何未来的读者在搜索档案时可能遇到这个问题而填写信息。

我想出了另一种方法 -复制我想将列表框的正确行设置为第一列的列(或将列连接成一列),并将其宽度设为零。它不会显示,因此列表框对用户来说看起来很正常,但标准语法

lstBoxWhosis = "value"

然后将正常工作。

于 2015-11-25T12:39:52.987 回答