Ms access MS Access文本框值始终为空

Ms access MS Access文本框值始终为空,ms-access,vba,ms-access-2010,Ms Access,Vba,Ms Access 2010,我正在为坚持使用MS Access的人做一些工作。我通常不使用它,所以我对整个控制结构和最佳实践有点陌生。我试图实现的是在表单上有一个过滤器文本框,当输入值时,它将过滤细节部分中的行。这似乎是一个简单的用例。我最初尝试了以下行为作为On Change事件的事件处理程序: Private Sub FilterGrid() Me.Text32.SetFocus If Not IsNull(Me.Text32.Text) And Me.Text32.Text <> ""

我正在为坚持使用MS Access的人做一些工作。我通常不使用它,所以我对整个控制结构和最佳实践有点陌生。我试图实现的是在表单上有一个过滤器文本框,当输入值时,它将过滤细节部分中的行。这似乎是一个简单的用例。我最初尝试了以下行为作为On Change事件的事件处理程序:

Private Sub FilterGrid()
    Me.Text32.SetFocus

    If Not IsNull(Me.Text32.Text) And Me.Text32.Text <> "" Then
        Me.Filter = "JobNumber LIKE '*" & Me.Text32.Text & "*'"
        Me.FilterOn = True
    End
    Else
        Me.FilterOn = False
    End If
End Sub
Private-Sub-FilterGrid()
Me.Text32.SetFocus
如果不为null(Me.Text32.Text)和Me.Text32.Text“”,则
Me.Filter=“类似于“*”的作业编号&Me.Text32.Text&“*”
Me.FilterOn=正确
终点
其他的
Me.FilterOn=False
如果结束
端接头
在我键入没有任何行匹配的内容之前,这一切都很顺利,整个过程因此错误而爆发(并且在不关闭表单的情况下无法恢复): 运行时错误“2185”:除非控件具有焦点,否则无法引用控件的属性或方法

我在周围读了一些书,一般的意见是不应该使用.Text,而应该使用.Value(或者只是没有属性的Text32)。这产生了一些非常奇怪的行为。
Text32.Value
始终为空。我有一个监视窗口,可以看到对于正常行为,
Text32.Text
有一个实际值,但
Text32.value
为空

显然我做错了什么,但我没有足够的经验去了解它是什么

另一个建议是在访问Text属性之前执行
Text32.SetFocus
。这并不能解决我提到的错误。它仍然抛出完全相同的错误


有人能在这里为我指出正确的方向吗?

正如您所发现的,文本框的
值只有在控件失去焦点后才会设置。
相反,只有控件具有焦点时才能访问
Text
属性

属性被定义为控件的默认成员;这意味着
Text32
Text32.Value
隐式相同,但是,根据上下文的不同,
Text32
有时可以引用控件本身,而不仅仅是其值

所有这些差异有时会令人愤怒

回到手头的事情:处理过滤有两种方法

  • 如果要筛选的列表很大,用户最好键入他们的筛选器,然后按ENTER键进行验证
  • 如果列表不太大,可以在键入时实现筛选器
第一种情况,等待ENTER验证用户输入。 假设筛选文本框名为
txtFilter
,位于一个窗体上,该窗体的子窗体显示要筛选的数据表(或连续窗体)

您只需将文本框
OnKeyDown
事件连接起来,如下所示:

' We will only perform the filter if the user press the ENTER key
Private Sub txtFilter_KeyDown(KeyCode As Integer, Shift As Integer)
    Select Case KeyCode
        Case 13, 9
            KeyCode = 0
            QuickFilter
    End Select
End Sub

' Perform the actual filtering on the subform
Private Sub QuickFilter()
    Dim sql As String
    Dim filter As String
    If txtFilter.Text = vbNullString Then
        ' Reset the filter if the textbox is emtpy
        SubForm.Form.FilterOn = False
    Else
        'Some common substitutions that users may have already inserted as wildchars
        filter = Replace(txtFilter.Text, "%", "*")
        filter = Replace("*" & filter & "*", "**", "*")
        ' We construct the filter SQL
        sql = "([JobNumber ] LIKE """ & filter & """)"
        sql = sql & " OR ([ProjectCode] LIKE """ & filter & """)"
        sql = sql & " OR ([SupplierName] LIKE """ & filter & """)"
        '... Add as many columns to filter on as you want

        ' Assign the filter to the subform
        SubForm.Form.filter = sql
        SubForm.Form.FilterOn = True
    End If
End Sub
第二种情况,键入时进行筛选 这相当简单,我们只需要在上述解决方案中添加一种方法,以便在用户键入时跟踪更改。
这最好通过texbox的
OnChange
事件来完成

Private Sub txtFilter_Change()
    QuickFilter
End Sub

这就是您需要添加的所有内容。

是否
not=“”
会产生相同的行为?或者“”只是另一个更新。我继续测试。在控件失去焦点之前,textbox的Value属性似乎不会更新。我已经在控件注册的每个事件上测试了Value属性,它在文本框中正确显示我“更改”的内容的唯一时间是在我单击文本框之外的某个位置后,在AfterUpdate事件中。这可以通过添加一个必须点击的“搜索”按钮轻松解决,但我发现这不是一个好的用户体验。如果它能按他们输入的内容过滤,那就更好了。(我知道存在性能问题)。