ms-access - MS Access TextBox 值始终为 NULL

标签 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 <> "" Then
        Me.Filter = "JobNumber LIKE '*" & Me.Text32.Text & "*'"
        Me.FilterOn = True
    End
    Else
        Me.FilterOn = False
    End If
End Sub

这工作得很好,直到我输入了一些没有任何行匹配的东西并且整个事情因这个错误而爆炸(并且在不关闭表单的情况下无法恢复):
运行时错误“2185”:除非控件具有焦点,否则不能引用控件的属性或方法。

我做了一些阅读,普遍的意见是不应该使用 .Text 而应该使用 .Value (或者只是没有属性的 Text32)。这产生了一些非常奇怪的行为。 Text32.Value始终为空。我有一个观察窗口,我可以看到正常行为,Text32.Text有实际值,但 Text32.Value为空。

显然我做错了什么,但我没有足够的 Access 经验来知道它是什么。

顺便说一句,另一个建议是做 Text32.SetFocus在 Access Text 属性之前。这不能解决我提到的错误。它仍然抛出完全相同的错误。

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

最佳答案

正如您所发现的,文本框的 Value仅在控件失去焦点后设置。
相反,Text属性仅在控件具有焦点时才可 Access 。
Value属性被定义为控件的默认成员;这意味着 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
    

    第二种情况,输入时过滤

    嗯,这相当简单,我们只需要在上述解决方案中添加一种跟踪用户输入变化的方法。
    这最好通过 OnChange 来完成。文本框的事件。
    Private Sub txtFilter_Change()
        QuickFilter
    End Sub
    

    这就是您需要添加的全部内容。

    关于ms-access - MS Access TextBox 值始终为 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18263456/

    相关文章:

    ms-access - 在 MS Access 中记录错误和警告的方法

    sql-server - 将多行数据移动到它自己的列中

    arrays - 在 VBA 中,如何将数组设置为空?

    excel - 从单列到 3X8 表

    ms-access - 上个月的查询/表达式

    ms-access - 将记录集导出到电子表格

    c# - 从 ASP.NET 向 MSAcess 添加记录

    sql - 如果连接表中没有关联数据,则需要查询返回 Null 字段

    ms-access - 在 msgbox 中显示单个 db 值

    ms-access - 如果没有 .movelast,我会遇到这个 .recordcount() 问题吗?