我有一个Access表单,我希望用户选择一个AwardNumber。当他们选择奖励时,该奖励的相关文档将显示在“不完整”或“完成”列表框中。然后我希望他们能够将项目从一个列表移动到另一个列表。 ListBox是单选。
这是后端:
不完整列表框(在设计中表示未绑定)有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.Refresh
,Me.Recalc
。我还尝试过再次设置RowSource。我不知道它是否过早地重新征服;我已经提出了断点和DoEvents,因此我认为这不是一个时间问题,但可能更多的是代码需要停止运行以进行重新查询。这没有任何意义,因为requery 是代码。
我知道还有其他方法可以做到这一点(我已经尝试过但都失败了),但我真的很想知道为什么这种方式不起作用。
在此先感谢!!
答案 0 :(得分:2)
您正在使用.Text
属性,就像DataWriter建议的那样,您不应该这样做。
.Text
属性仅在字段具有焦点时可用(请参阅MSDN)。
由于您在OnClick
按钮的Move_To_Complete
事件中调用了该按钮,因此该按钮具有焦点,因此.Text
属性不可用。
两个解决方法:
Award_CBox.SetFocus
Forms!Select_Doc_To_Code!Award_CBox.Value
来使用value属性。请注意,这假定绑定列与显示的列相同。