Access VBA 的 Listbox.Requery 命令清除 ListItems

Access VBA's Listbox.Requery command clears ListItems

我有一个访问表单,我希望用户在其中 select 一个 AwardNumber。当他们 select 获奖时,该奖项的相关文件会出现在“不完整”或“完整”列表框中。然后我希望他们能够将项目从一个列表移动到另一个列表。列表框是单个 select.

这是后端:
Incomplete ListBox(在设计中表示未绑定)有 3 列。绑定列为 1,但第 1 列和第 3 列的宽度为 0,因此被隐藏。列表框还有以下 RowSource:
SELECT DocTbl.DocID, DocTbl.DocTitle, DocTbl.DocLink FROM DocTbl WHERE ((DocTbl.Complete <> Yes) AND (DocTbl.AwardNumber = Forms!Select_Doc_To_Code!Award_CBox.Text)) ORDER BY DocTbl.DocID

(Complete ListBox 也一样,只是没有 DocTbl.Complete <> Yes,它有 DocTbl.Complete = Yes。)

当他们 select ComboBox 中的 AwardNumber 时,有一些 VBA 运行以下命令来填充列表,这按预期工作:
Me.Incompletes.Requery Me.Completes.Requery

这两个按钮触发代码 "move" 项目。这是顶部按钮的代码,用于 "move" 从未完成列表框到完成列表框的文档(即通过将文档的 "Complete" 值设置为是,然后重新查询列表框)。指示的行是出错的地方:

Sub Move_To_Complete_Click()
  docID = Incompletes.Column(0, Incompletes.ListIndex)

  Set Tbl = CurrentDb.TableRefs("DocTbl")
  Set db = CurrentDb

  db.Execute = "UPDATE DocTbl " & _
  " SET DocTbl.Complete = Yes " & _
  " WHERE DocTbl.DocID = " & docID

---->Me.Incompletes.Requery
---->Me.Completes.Requery
End Sub

换句话说,UPDATE 查询有效(我在 table 中看到更新的数据),但是当我尝试重新查询两个 ListBox 以刷新它们时,所有项目都消失了 来自两者!。此外,如果我 select 来自 ComboBox 的另一个 Award,然后重新 select same Award,列表将再次正确填充,只是通过运行相同的.Requery命令!

我试过 Me.RefreshMe.Recalc。我也尝试再次设置 RowSource。我想知道它是否重新查询太早了;我已经放置了断点和 DoEvents,所以我不认为这是一个时间问题,但可能更多的是代码需要停止-运行-for-requery-to-work。这没有意义,因为重新查询 code.

我知道还有其他方法可以做到这一点(我已经尝试过但都失败了),但我真的很想知道为什么这种方法不起作用。

提前致谢!!

您正在使用 .Text 属性,正如 DataWriter 所建议的,您不应该使用。

.Text 属性 仅在字段具有焦点时可用(参见 MSDN)。

因为您在 Move_To_Complete 按钮的 OnClick 事件中调用它,所以该按钮具有焦点,因此 .Text 属性 不可用。

两个解决方法:

  1. 在重新查询之前使用 Award_CBox.SetFocus
  2. 使用Forms!Select_Doc_To_Code!Award_CBox.Value使用值属性。请注意,这假定绑定列与显示的列相同。