访问VBA的Listbox.Requery命令清除ListItems

时间:2017-10-20 22:55:11

标签: sql listbox access-vba ms-access-2010 ms-access-forms

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

enter image description here

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

(完整列表框具有相同的内容,而不是DocTbl.Complete <> Yes,而是DocTbl.Complete = Yes。)

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

这两个按钮触发代码到&#34;移动&#34;这几项。这里是顶部按钮的代码,意味着&#34;移动&#34;从Incompletes到Completes列表框的文档(即将doc&#39; s&#34; Complete&#34;值设置为Yes然后重新查询列表框)。指示的行是出错的地方:

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,因此我认为这不是一个时间问题,但可能更多的是代码需要停止运行以进行重新查询。这没有任何意义,因为requery 代码。

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

在此先感谢!!

1 个答案:

答案 0 :(得分:2)

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

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

由于您在OnClick按钮的Move_To_Complete事件中调用了该按钮,因此该按钮具有焦点,因此.Text属性不可用。

两个解决方法:

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