5

我编写了一个表单,它在将文本输入到文本框中时异步执行查询,但是我似乎有些随意地抛出了以下错误:“除非控件具有焦点,否则您无法引用控件的属性或方法。”

直接相关的代码是:

Dim UpdateRequested As Boolean
Dim qryText As String

.
.
.

Private Sub txtBox_Change()
    qryText = txtBox.Text
    UpdateRequested = true
End Sub

省略号中的某些地方是处理动态加载 ADODB 记录集、填充本地表和刷新子表单的代码。但是,即使我禁用此代码,问题仍然存在:有时我会收到错误消息。有时我没有。

通过关闭数据库并重新打开它,这似乎是持久的。每次它再次开始工作时,都是因为我一直在调试器中乱搞代码,但我不确定究竟是什么导致它神奇地“正常工作”或者是什么导致它根本不工作。

更新

为了让事情更令人费解,我添加了几个简单的事件处理程序:

Private Sub txtBox_GotFocus()
    MsgBox "Got focus"
End Sub

Private Sub txtBox_LostFocus()
    MsgBox "Lost focus"
End Sub

我运行表格。我点击测试框。我收到“获得焦点”消息。一旦我输入,我就会看到如上所述的错误。如果我重新打开表单,我可以在有问题的文本框(它本身是未绑定的)和子表单中的绑定文本框之间单击,并按预期看到“获得焦点”和“失去焦点”消息。此外,显示当前值为“Screen.ActiveControl.Name”的消息框会在访问 Text 属性之前显示预期的名称。

4

6 回答 6

7

我知道这是一个旧线程,但这是我遇到同样问题时发现的第一个线程。除了 Kaganar 自己的解决方案之外,其他答案都没有帮助,它为我指明了正确的方向。我猜人们无法重现错误的原因是 Kaganar 的描述中缺少一些重要的细节:

  1. 文本框位于表单页眉(或页脚)中。
  2. 表格不允许添加。

因为我相信完整的答案是......

当窗体有记录源且没有要编辑的记录时,任何控件的 Text 属性都不可访问

我认为 Access 的一部分没有意识到文本框的存在:) 要了解这可能是如何发生的......

  • 将未绑定的TextBox放在表单的详细信息中
  • 不允许添加
  • 设置记录源不返回记录
  • 打开表格。

嘿,快!没有文本框。

返回记录,或允许添加,或删除记录源,等等!有你的文本框和它的文本。

于 2013-09-05T15:38:58.743 回答
5

txtFoo我在表单中添加了一个名为的文本框。这是其更改事件的过程。

Private Sub txtFoo_Change()
    Debug.Print "Value: " & Nz(Me.txtFoo.value, "*Null*") & _
        "; Text: " & Nz(Me.txtFoo.Text, "*Null*")
End Sub

然后,txtFoo当我在 中键入“abc”时,没有任何内容(IOW 其值为 Null)txtFoo,这就是我在“立即”窗口中看到的内容。

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属性,txtVendorName因为它不是活动控件。

鉴于此问题仅出现在一种形式上,而不出现在其他新形式上,我怀疑问题形式已损坏。阅读此 SO 问题的 2 个答案并尝试反编译以解决损坏问题:如何反编译和重新编译。通常建议将反编译作为开发过程中的常规做法。

您还可以使用未记录的Application.SaveAsText方法将表单保存为文本文件。删除不良表格,并用于Application.LoadFromText导入保存的文本副本。

确保您有 db 文件的备份副本,以防出现任何问题。

于 2012-07-23T19:57:20.820 回答
3

若要设置或返回控件的 Text 属性,该控件必须具有焦点,否则会发生错误。
要将焦点移动到控件,您可以使用 txtBox.SetFocusDoCmd.GoToControl "txtBox"

此外,Text 属性并不总是可用:
当控件具有焦点时,Text 属性包含当前在控件中的文本数据;Value 属性包含控件上次保存的数据。当您将焦点移到另一个控件时,控件的数据会更新,并且 Value 属性设置为这个新值。在控件再次获得焦点之前,Text 属性设置将不可用。

于 2012-07-23T18:43:07.600 回答
1

该表单有一个挥之不去的数据源。我不确定为什么这会导致上述行为,特别是考虑到文本框控件未绑定,但是由于删除数据源,文本框的行为符合预期。

于 2012-07-23T21:08:39.353 回答
0

你说“有点武断”我认为如果一切都很好,当你的表单记录集为空时,你必须得到错误。

事实上,这是 Access 中的一个已知错误,如果满足以下条件,则可能会发生此错误:a) 控件位于表单页眉或表单页脚部分 b) 表单被过滤,使得没有记录匹配(或没有记录) c) 不能添加新记录。

在这种情况下,表单的详细信息部分变为空白。控件仍然可见,但 Access 真的很困惑,可能会抛出您描述的错误。

更多信息: http ://allenbrowne.com/bug-06.html

于 2017-04-17T12:19:50.310 回答
-1

我知道我的答案已经过时了。然而,你只能设置焦点三遍。在标题中的 TextBox 上,在详细空间中的任何 texbox 上,再次在标题中的 TextBox 上。我使用访问 2003。

于 2016-03-20T03:09:52.320 回答