在基于非绑定列重新查询后访问 VBA 还原列表框选择
Posted
技术标签:
【中文标题】在基于非绑定列重新查询后访问 VBA 还原列表框选择【英文标题】:Access VBA restore listbox selection after requery based on a non-bound column 【发布时间】:2014-08-24 21:44:43 【问题描述】:因此,我继承了 MS Access 2010(以及现在的 2013)代码,该代码具有绑定到非唯一列的列表框。但是,该绑定值在代码中使用,因此我无法更改绑定的列。但是,我有一个子表单需要重新查询父表单上的列表框。我正在努力解决的是如何将父列表框中的选择恢复为在请求列表框之前选择的项目。
我尝试在重新查询之前存储 Parent.List0 值,然后使用 Parent.List0.Selected 和 Parent.List0.ItemData,但这些似乎不起作用,因为大概是列表框绑定到的列不是唯一的。
列表框中有一列是唯一的。第 4 列(column(3))是唯一的,但我没有找到基于绑定列以外的列选择列表框项的方法。
我相信有人有一些想法可以解决这个问题,但我无法在网络搜索中找到任何解决方案。
【问题讨论】:
【参考方案1】:我使用的是 2010 版,在测试时,我无法重现列表框失去其价值的情况。既不是在绑定的表单上,也不是在未绑定的表单上。
然而,无论如何,第 3 列似乎有一个唯一的键 - 所以你可以使用它。
' Assuming this code runs from within the sub-form
KeyID = Me.Parent.Controls("MyListBox").Column(3)
With Me.Parent.Controls("MyListBox")
.Requery ' Or do whatever you do that causes it to requery
' Find the previously selected item and select
For i = 0 To (.ListCount - 1)
If .Column(3, i) = KeyID Then
.Selected(i) = True
Exit For
End If
Next
End With
这应该可以解决问题。
【讨论】:
正确:它确实改变了,因此问题。 但是,更改只针对一个字段中的一个值。我需要显示该更改,但列表中的项目数没有改变,列表中项目的顺序也没有改变。但是,我无法让 .selected(prevListIndex) = True 实际选择正确的项目——没有错误,它只是没有选择列表框中的任何项目。我确实考虑过 for..next 循环,但似乎必须有比遍历潜在的 100 多个项目更好的方法。我想我必须这样做。 太棒了!非常感谢,DHW。这很好用,而且速度也很快。我仍然无法理解为什么不能只将列表框设置为列表中的特定行索引——似乎 Access 应该存储与列表中存储的实际数据无关的索引引用。但是,因为它没有,你的代码很好地解决了它。谢谢! 对于后来发现这个帖子的人,我对 DHW 的代码进行了微调:我将其改为 .Column(3),而不是 .Column(2) 和 .Column(2, i)和 .Column(3, i) 因为第 4 列是唯一列,并且 .Column 属性是从零开始的(与从 1 开始的绑定列属性不同,而不是从 0 开始)。 我会进行编辑。要回答有关保留列表索引的访问权限的问题 - 在重新查询期间,列表框的内容可能会发生变化。正如我在回答中指出的那样 - 我做了一个测试数据库以确保我的解决方案有效,并且我注意到 Access 保留了 ListBox 值。也可能有一种方法可以直接使用 Windows API 调用来设置列表框控件 - 但这可能是试图用大炮杀死蚊子。以上是关于在基于非绑定列重新查询后访问 VBA 还原列表框选择的主要内容,如果未能解决你的问题,请参考以下文章