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

Kag*_*nar 5 ms-access vba access-vba

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

直接相关的代码是:

Dim UpdateRequested As Boolean
Dim qryText As String

.
.
.

Private Sub txtBox_Change()
    qryText = txtBox.Text
    UpdateRequested = true
End Sub
Run Code Online (Sandbox Code Playgroud)

省略号中的一些位置是处理动态加载ADODB记录集,填充本地表和刷新子表单的代码.但是,即使我禁用此代码,问题仍然存在:有时我得到错误.有时我没有.

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

更新

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

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

Private Sub txtBox_LostFocus()
    MsgBox "Lost focus"
End Sub
Run Code Online (Sandbox Code Playgroud)

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

小智 6

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

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

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

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

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

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

嘿presto!没有文字框.

退回记录,或允许添加,或删除记录源,等等!你的文本框有文字.


Han*_*sUp 5

我添加了一个名为txtFoomy form 的文本框.以下是其更改事件的过程.

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

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

Value: *Null*; Text: a
Value: *Null*; Text: ab
Value: *Null*; Text: abc
Run Code Online (Sandbox Code Playgroud)

基本上,我添加到文本框的每个字符都会触发其更改事件,并将文本框的当前内容打印到立即窗口.

据我所知,你想做类似的事情...除了你想要一个不同的行动代替Debug.Print.再看看你的变更事件程序,并将其与我的进行比较.

Private Sub txtBox_Change()
    qryText = txtVendorName.Text
    UpdateRequested = true
End Sub
Run Code Online (Sandbox Code Playgroud)

这是名为的控件的更改事件txtBox.在该过程中,您引用.Text名为的控件的属性txtVendorName.但是txtBox,它的更改事件代码运行时是活动控件...因此您无法访问.Text属性,txtVendorName因为它不是活动控件.

鉴于此问题只针对一个表单,而不是其他新表单,我怀疑问题表单已损坏.阅读这个SO问题的2个答案,并尝试反编译以治愈腐败:如何反编译和重新编译.在开发过程中,通常建议将反编译作为常规实践.

您还可以使用未记录的Application.SaveAsText方法将表单另存为文本文件.删除错误的表单,然后使用Application.LoadFromText导入保存的文本副本.

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