0

我有一个访问表单,我希望用户在其中选择一个 AwardNumber。当他们选择奖项时,该奖项的相关文档会显示在“未完成”或“完成”列表框中。然后我希望他们能够将项目从一个列表移动到另一个列表。列表框是单选的。

在此处输入图像描述

这是后端:
不完整的列表框(在设计中说未绑定)有 3 列。Bound 列是 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

(完整的 ListBox 具有相同的功能,只是它不是DocTbl.Complete <> Yes,而是DocTbl.Complete = Yes。)

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

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

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 查询有效(我在表中看到更新的数据),但是当我尝试重新查询两个 ListBox 以刷新它们时,所有项目都会从两者中消失!。此外,如果我从 ComboBox 中选择另一个奖项,然后重新选择相同的奖项,列表会再次正确填充,只需运行相同的 .Requery 命令!

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

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

提前致谢!!

4

1 回答 1

2

您正在使用该.Text属性,并且像 DataWriter 建议的那样,您不应该使用该属性。

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

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

两种解决方法:

  1. Award_CBox.SetFocus在重新查询之前使用
  2. 用于Forms!Select_Doc_To_Code!Award_CBox.Value使用 value 属性。请注意,这假定绑定列与正在显示的列相同。
于 2017-10-21T08:15:12.543 回答