这如何返回一个空白值?
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 仍然继续说该值为空。谢谢汉斯!以上是关于这如何返回一个空白值?的主要内容,如果未能解决你的问题,请参考以下文章