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.Refresh
、Me.Recalc
。我也尝试再次设置 RowSource。我想知道它是否重新查询太早了;我已经放置了断点和 DoEvents,所以我不认为这是一个时间问题,但可能更多的是代码需要停止-运行-for-requery-to-work。这没有意义,因为重新查询 是 code.
我知道还有其他方法可以做到这一点(我已经尝试过但都失败了),但我真的很想知道为什么这种方法不起作用。
提前致谢!!
您正在使用 .Text
属性,正如 DataWriter 所建议的,您不应该使用。
.Text
属性 仅在字段具有焦点时可用(参见 MSDN)。
因为您在 Move_To_Complete
按钮的 OnClick
事件中调用它,所以该按钮具有焦点,因此 .Text
属性 不可用。
两个解决方法:
- 在重新查询之前使用
Award_CBox.SetFocus
- 使用
Forms!Select_Doc_To_Code!Award_CBox.Value
使用值属性。请注意,这假定绑定列与显示的列相同。
我有一个访问表单,我希望用户在其中 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.Refresh
、Me.Recalc
。我也尝试再次设置 RowSource。我想知道它是否重新查询太早了;我已经放置了断点和 DoEvents,所以我不认为这是一个时间问题,但可能更多的是代码需要停止-运行-for-requery-to-work。这没有意义,因为重新查询 是 code.
我知道还有其他方法可以做到这一点(我已经尝试过但都失败了),但我真的很想知道为什么这种方法不起作用。
提前致谢!!
您正在使用 .Text
属性,正如 DataWriter 所建议的,您不应该使用。
.Text
属性 仅在字段具有焦点时可用(参见 MSDN)。
因为您在 Move_To_Complete
按钮的 OnClick
事件中调用它,所以该按钮具有焦点,因此 .Text
属性 不可用。
两个解决方法:
- 在重新查询之前使用
Award_CBox.SetFocus
- 使用
Forms!Select_Doc_To_Code!Award_CBox.Value
使用值属性。请注意,这假定绑定列与显示的列相同。