在change事件处理程序中获取文本框值

时间:2012-07-23 18:34:52

标签: ms-access vba access-vba

我已经编写了一个表单,可以在文本框中将异步执行查询,但是我有点随意地抛出以下错误:“您无法引用属性或方法除非控件具有焦点,否则为控件。“

紧接相关的代码是:

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属性之前的预期名称。

6 个答案:

答案 0 :(得分:6)

我知道这是一个旧线程,但这是我遇到同样问题时发现的第一个。除了Kaganar自己的解决方案之外,没有任何答案有所帮助,这使我指向了正确的方向。我猜测人们在复制错误时遇到麻烦的原因是Kaganar的描述中缺少一些重要的细节:

  1. 文本框位于表头(或页脚)中。
  2. 表格不允许添加。
  3. 因为我相信完整的答案是......

    当表单有一个没有要编辑的记录的记录源时,任何控件的Text属性都不可访问

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

    • 将未绑定的TextBox放在表单的详细信息中
    • 不允许添加
    • 将recordsource设置为不返回记录
    • 打开表单。
    嘿,嘿!没有文字框。

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

答案 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.SetFocusDoCmd.GoToControl "txtBox"

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

你说“有些随意”我认为如果一切正常,你必须在表单的记录集为空时出错。

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

在这种情况下,表单的“详细信息”部分变为空白。控制仍然是 可见,但Access真的很困惑,可以抛出你的错误 描述

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

答案 5 :(得分:-1)

我知道我的答案已经过时了。然而,你可以设置焦点三次。在标题中的TextBox上,在详细信息空间中的任何texbox上,再次在标题中的On TextBox上。我使用access 2003。