MS Access 文本框值始终为 NULL

Posted

技术标签:

【中文标题】MS Access 文本框值始终为 NULL【英文标题】:MS Access TextBox Value is always NULL 【发布时间】:2013-08-15 23:16:37 【问题描述】:

我正在为坚持使用 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 是 NULL。

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

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

有人可以在这里为我指明正确的方向吗?

【问题讨论】:

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

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

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

第二种情况,输入时过滤

嗯,这很简单,我们只需要在上述解决方案中添加一种在用户键入时跟踪更改的方法。 这最好通过 texbox 的 OnChange 事件来完成。

Private Sub txtFilter_Change()
    QuickFilter
End Sub

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

【讨论】:

【参考方案2】:

不要使用 .text 属性 而是使用 .value 属性

text3.value=text1.value+text2.value

您不需要每次都像 .text 属性那样设置焦点。

完美运行....vba ms 访问

【讨论】:

以上是关于MS Access 文本框值始终为 NULL的主要内容,如果未能解决你的问题,请参考以下文章

根据带有if条件的多个文本框值将值分配给表单上的文本框-MS ACCESS

ms 访问 - 基于文本框值的复选框

如何在jquery自动完成中传递文本框值

Access 2010 Web 数据库 - 从局部变量更新文本框值?

从文本框值查看组合框值 Microsoft Access 2007

将文本框值插入 Access SQL 查询