Vba 如何获得';价值';属性从MSAccess窗体文本框中删除,而它';正在编辑什么?

Vba 如何获得';价值';属性从MSAccess窗体文本框中删除,而它';正在编辑什么?,vba,ms-access,ms-access-forms,Vba,Ms Access,Ms Access Forms,如何在编辑MS Access窗体的textBox控件时捕获键入的值?我想显示一个搜索结果(在列表框中),该结果随着每个新字符添加到用于搜索的文本框中而更新?查询已就位,事件已就位,唯一缺少的是类型化值存储在何处,因为在“键入”事件期间,它不在控件的.value属性中。注意,我尝试读取下面的状态(以及在以前的编辑中)的许多尝试都是垃圾。我有这个查询构建函数,它可以在不同的时间执行(问题中没有列出,mia culpa)。我现在将状态作为所述查询函数的参数传递,而不是尝试主动读取它。我把这个留给任何走

如何在编辑MS Access窗体的textBox控件时捕获键入的值?我想显示一个搜索结果(在列表框中),该结果随着每个新字符添加到用于搜索的文本框中而更新?查询已就位,事件已就位,唯一缺少的是类型化值存储在何处,因为在“键入”事件期间,它不在控件的.value属性中。

注意,我尝试读取下面的状态(以及在以前的编辑中)的许多尝试都是垃圾。我有这个查询构建函数,它可以在不同的时间执行(问题中没有列出,mia culpa)。我现在将状态作为所述查询函数的参数传递,而不是尝试主动读取它。我把这个留给任何走上类似道路的人作为警告。如果到目前为止我给任何人的指示有误,我深表歉意。

文本框的“Value”属性不会像人们所期望的那样在更改或键控事件时更新。如果希望在键入内容时捕获键入到文本框中的内容,则需要查找“Text”属性,如中所示:

Me.txtSearchBox.Text
不幸的是,除非文本框处于活动状态,否则无法访问此属性,因此,如果您在与其他控件交互时正在读取.Text,则需要测试文本框是否处于活动状态,而不会处于活动状态,并故障切换到检取“值”,如:

' assuming you've already dim'd the strSearchBox as String here...
If Screen.ActiveControl.Name = txtSearchBox.Name Then
    ' the control is active, so for the moment, Text is accessible
    strSearchBox = Trim(txtSearchBox.Text & vbNullString)
Else
    ' textBox failover:
    ' Value is always accessible
    strSearchBox = Trim(txtSearchBox.Value & vbNullString)
End If
' strSearchBox now has the contents of txtSearchBox, one way or the other
是的,我是一个强迫性修剪者。是的,我通过添加“”(更正为vbNullString per@ComputerVersteher,非常感谢)。如果那很可怕的话,请对我大喊大叫。要点是,.Value在表单加载时可以为null,而将null值赋给字符串变量是错误的

不幸的是,如果您要在调试或加载表单Screen.ActiveControl.Name时运行此代码,则无法调用它。您可以通过测试相关表单是否已实际加载来解决此问题,如下所示:

If not CurrentProject.AllForms(Me.Name).IsLoaded Then
    ' activeform failover:
    ' Value is always accessible
    strSearchBox = Trim(txtSearchBox.Value & vbNullString)
Else
    ' there's an Form loaded, so there is an ActiveControl Name to test
    If Screen.ActiveControl.Name = txtSearchBox.Name Then
        ' the control is active, so for the moment, Text is accessible
        strSearchBox = Trim(txtSearchBox.Text & vbNullString)
    Else
        ' textBox failover:
        ' Value is always accessible
        strSearchBox = Trim(txtSearchBox.Value & vbNullString)
    End If
End If
我希望这能节省一些人一点时间。
如果你读了它而不听从我的建议,也许会节省你的时间。查看编辑以查看有关VB窗体读取状态的其他错误想法以及控件名称唯一性的错误假设等。

实现这一点的关键是使用文本框的
OnChange
事件,该事件针对更改文本框内容的每次击键触发

因此,通过引用
OnChange
事件的事件处理程序中文本框的
Text
属性,可以轻松更改列表框的内容

下面是一个搜索动物名称列表的基本演示:


这回答了所问的问题。不幸的是,我的问题被人为地简单化了。Mia culpa.concat为空字符串以避免NULL,这没什么错。我也提到了这一点,因为
Nz
是一个内置的IMS访问函数,其他vba主机不可用,但我使用空字符串,因为它是类型安全的(编译器不会抱怨
”中的意外字符),并且可以保护您的6字节内存!如果表单未加载,则无法访问其中的控件!不要比较名称,比较对象,因为两个窗体可以有同名控件(打开窗体两次)。每个打开的表单都可以有一个活动控件,如果Me.ActiveControl是Me,则可以访问.Text属性
。txtSearchBox
就足够了。@ComputerVersteher,(1)感谢vbNullString:我在Access中工作的时间太长了。我忘得太多了。(2) 未加载时无法访问控件:是的,我一直在经历各种各样的相关错误。我必须重新编辑上面的内容,以获得最终的不那么愚蠢的解决方案。我的部分问题是,当我应该选择formCurrent时,我通过formLoad调用进行初始查询(在我的列表框中填充默认搜索结果)。我想知道您选择使用单独的文本框的原因是什么。你不能像我一直用的那样只用Combo吗?请看这里,对于组合框来说,这不是一个合适的显示方案——对不起,我没有在问题中给出足够的信息。批准的答案很有用,回答了基本问题,但不适用于我的情况。我需要根据条目显示许多多列行(可以说,结果是ListBox形状的),并且使用场景通常是一个回顾场景。这不是一个自动完成的情况,这是一个积极的过滤结果的情况。同样,我在充实问题中的情况方面做得很差。我确实使用了一个组合框,正如你在应用程序的其他地方描述的那样。事实上,我更喜欢你的编程方法,而不是我在组合框上采用的方法。美好的