我已经编写了一个表单,可以在文本框中将异步执行查询,但是我有点随意地抛出以下错误:“您无法引用属性或方法除非控件具有焦点,否则为控件。“
紧接相关的代码是:
Dim UpdateRequested As Boolean
Dim qryText As String
.
.
.
Private Sub txtBox_Change()
qryText = txtBox.Text
UpdateRequested = true
End Sub
省略号中的某些位置是处理动态加载ADODB记录集,填充本地表和刷新子表单的代码。但是,即使我禁用此代码,问题仍然存在:有时我得到错误。有时候我没有。
通过关闭数据库并重新打开它似乎是持久的。每次它再次开始工作时,都是因为我一直在调试器中使用代码,但我不确定究竟是什么导致它神奇地“正常工作”或导致它根本无法工作的原因。 / p>
为了让事情更令人费解,我添加了几个简单的事件处理程序:
Private Sub txtBox_GotFocus()
MsgBox "Got focus"
End Sub
Private Sub txtBox_LostFocus()
MsgBox "Lost focus"
End Sub
我运行表单。我点击测试框。我收到“有焦点”的消息。一旦我输入,我就会看到如上所述的错误。如果我重新打开表单,我可以在有问题的文本框(它本身是未绑定的)和子表单中的绑定文本框之间单击,并且可以看到“获得焦点”和“丢失焦点”消息。此外,显示一个当前值为“Screen.ActiveControl.Name”的消息框显示了访问Text属性之前的预期名称。
答案 0 :(得分:6)
我知道这是一个旧线程,但这是我遇到同样问题时发现的第一个。除了Kaganar自己的解决方案之外,没有任何答案有所帮助,这使我指向了正确的方向。我猜测人们在复制错误时遇到麻烦的原因是Kaganar的描述中缺少一些重要的细节:
因为我相信完整的答案是......
当表单有一个没有要编辑的记录的记录源时,任何控件的Text属性都不可访问
我认为Access的一部分没有意识到文本框存在:)要了解它可能会如何发生......
返回记录,或允许添加或删除记录源,等等!你的文本框里面有文字。
答案 1 :(得分:5)
我在表单中添加了一个名为txtFoo
的文本框。以下是其更改事件的过程。
Private Sub txtFoo_Change()
Debug.Print "Value: " & Nz(Me.txtFoo.value, "*Null*") & _
"; Text: " & Nz(Me.txtFoo.Text, "*Null*")
End Sub
然后,当我在txtFoo
中键入“abc”时,txtFoo
(IOW,其值为Null)中没有任何内容,这是我在立即窗口中看到的内容。
Value: *Null*; Text: a
Value: *Null*; Text: ab
Value: *Null*; Text: abc
基本上,我添加到文本框的每个字符都会触发其更改事件,并将文本框的当前内容打印到立即窗口。
据我了解,你想做类似的事情...除了你想要一个不同的行动代替Debug.Print
。再看看你的变更事件程序,并将其与我的比较。
Private Sub txtBox_Change()
qryText = txtVendorName.Text
UpdateRequested = true
End Sub
这是名为txtBox
的控件的更改事件。在该过程中,您引用名为.Text
的控件的txtVendorName
属性。但是txtBox
是其更改事件代码运行时的活动控件...因此您无法访问.Text
的{{1}}属性,因为它不是活动控件。
鉴于此问题只针对一个表单,而不是其他新表单,我怀疑问题表单已损坏。阅读这个SO问题的2个答案,并尝试反编译以治愈腐败:HOW TO decompile and recompile。在开发过程中,通常建议将反编译作为常规做法。
您还可以使用未记录的txtVendorName
方法将表单另存为文本文件。删除不良表单,然后使用Application.SaveAsText
导入已保存的文本副本。
确保您有db文件的备份副本,以防出现任何问题。
答案 2 :(得分:3)
要设置或返回控件的Text属性,控件必须具有焦点,否则会发生错误
要将焦点移至控件,您可以使用txtBox.SetFocus
或DoCmd.GoToControl "txtBox"
。
此外,Text属性并不总是可用:
当控件具有焦点时,Text属性包含当前在控件中的文本数据; Value属性包含控件的最后保存数据。将焦点移动到另一个控件时,控件的数据将更新,并且Value属性将设置为此新值。然后,Text属性设置不可用,直到控件再次获得焦点。
答案 3 :(得分:1)
该表单有一个挥之不去的数据源。我不确定为什么这会导致上述行为,特别是考虑到文本框控件是未绑定的,但是自从删除数据源后,文本框的行为与预期的一样。
答案 4 :(得分:0)
你说“有些随意”我认为如果一切正常,你必须在表单的记录集为空时出错。
实际上它是Access中的一个已知错误,如果满足以下条件,则会发生此错误: a)控件位于表单页眉或表单页脚部分 b)对表单进行过滤,使得没有记录匹配(或者没有记录) c)不能添加新记录。
在这种情况下,表单的“详细信息”部分变为空白。控制仍然是 可见,但Access真的很困惑,可以抛出你的错误 描述
答案 5 :(得分:-1)
我知道我的答案已经过时了。然而,你可以设置焦点三次。在标题中的TextBox上,在详细信息空间中的任何texbox上,再次在标题中的On TextBox上。我使用access 2003。