这如何返回一个空白值?

Posted

技术标签:

【中文标题】这如何返回一个空白值?【英文标题】:How is this returning a blank value? 【发布时间】:2014-12-17 14:38:02 【问题描述】:

因此,此代码旨在用作一个简单的搜索系统,以查找记录集中的某些记录。我最初拥有它,因此他们必须单击 btnGoToID 按钮才能执行搜索。我决定让它对用户更友好一点,并让它在搜索字段中监听 Enter 按钮,这也将执行搜索。

当代码到达strID = Trim(Nz(Me.txtSearch.Value, "")) 时,我遇到的问题将随机返回为空字符串,即使在视觉上我可以看到文本框中有一个值。

我无法缩小出现此问题的任何模式。在这一点上,我什至不知道如何解决这个问题,也不知道搜索的词可能会在谷歌中产生任何结果。我只能说,似乎在记录之间进行更改会影响搜索是否通过。

在我放入 txtSearch_KeyPress 子程序之前,这一直有效。

'============================================================================
' txtSearch_KeyPress
'============================================================================
Private Sub txtSearch_KeyPress(KeyAscii As Integer)
    'If user pressed enter
    If KeyAscii = 13 Then
        Call btnGoToID_Click
    End If
End Sub



'============================================================================
' btnGoToID_Click
'============================================================================
' <<Purpose>>
' Allow the user to search for a specific ID 
'============================================================================
Private Sub btnGoToID_Click()
On Error GoTo Err_Handler

    Dim rs As Recordset
    Dim strID As String

    Set rs = Me.RecordsetClone

    strID = Trim(Nz(Me.txtSearch.Value, ""))

    If (strID <> "") Then

        'Go to the ID
        rs.FindFirst "ID = '" & strID & "'"

        If rs.NoMatch Then
            MsgBox "ID does not exist"
        Else

            'If we have a match, set the record as the current record
            Me.Bookmark = rs.Bookmark
        End If
    Else
        MsgBox "Please enter a valid ID.", vbOKOnly, "Invalid ID"
    End If


Exit_Handler:
On Error Resume Next

    Me.txtSearch.Value = ""
    rs.Close
    Set rs = Nothing
    Exit Sub

Err_Handler:
    Call LogError(Err.Number, Err.Description, "txtSearch on " & Me.Name)
    Resume Exit_Handler
End Sub

在 cmets 中的对话之后,我缩小了这个问题的范围,使其变得简单得多。即使在文本字段中有多个字符后,这也会产生“无效使用 null”错误消息。为什么会发生这种情况,我该怎么做才能让它获取文本框中的值?

'============================================================================
' txtUnitNoToSearch_KeyPress
'============================================================================
Private Sub txtUnitNoToSearch_KeyPress(KeyAscii As Integer)
    MsgBox Me.txtUnitNoToSearch
End Sub

【问题讨论】:

我不确定错误可能是什么。但在我看来,您可以通过 textBox 的 _AfterUpdate 事件处理所有这些 只有在他们离开该字段时才会触发 AfterUpdate 事件,如果有的话(它是一个未绑定的字段)。你能扩展一下你的意思吗? 是的,但除非您已将字段定义为多行,否则我相信按 enter 会导致相同的结果 我将它设置为多行仅是为了允许输入键被“捕获”。由于将其保留为默认值只会导致它消失。您是否正在考虑将其从多行更改,以便在按下回车键时将其移开,然后使用 OnUpdate 事件调用搜索? 你是对的。这取决于你想要什么。就我个人而言,我不认为这是糟糕的用户体验;你有一个过滤的文本字段,你输入 sth 然后它过滤。这似乎足够合理。 :) 但正如已经说过的,这取决于你想要什么:) 【参考方案1】:

我认为您的问题与文本框有两个属性(.Value.Text)有关,它们看起来相似但行为不同。

当您在文本框中进行编辑时,更改内容可通过.Text 属性获得。但是,.Value 属性的内容尚未更新以匹配。

在文本框的 After Update 事件之后,.Value 将包含新内容。如果焦点从文本框移开,它的.Text 属性甚至将不再可用。

抱歉,我想不出如何更好地解释这一点。但我认为使用这个 KeyPress 事件过程会更清楚情况:

Private Sub txtUnitNoToSearch_KeyPress(KeyAscii As Integer)
    Debug.Print "Text: '" & Me.txtUnitNoToSearch.Text & "'"
    Debug.Print "Value: '" & Me.txtUnitNoToSearch.Value & "'"
End Sub

在您对文本框的上下文进行更改时,在“立即”窗口中观察Debug.Print 的输出。 (Ctrl+g 将打开立即窗口。)

最后一点是Me.txtUnitNoToSearch 会为您提供其默认属性.Value。在处理其余代码时请牢记这一点。

【讨论】:

我刚刚对其进行了测试,发现 AfterUpdate 事件从未触发过。你打败了我:) 哇,这绝对是这个原因。 .Text 给了我我想要的东西,但是 .Value 仍然继续说该值为空。谢谢汉斯!

以上是关于这如何返回一个空白值?的主要内容,如果未能解决你的问题,请参考以下文章

Select2 多个 - 如何设置空白默认值

将`input`的值分配给变量但在JS中返回空白

Excel公式-如果没有查找值,则VLOOKUP保留为空白

JS如何获取页面可见区域高度

报表服务器:如果参数 = null 或空白,如何选择所有内容(启用多个值)

如何保持电源查询的空返回值?