因此,此代码旨在作为一个简单的搜索系统来转到记录集中的某些记录。我最初拥有它所以他们必须单击btnGoToID按钮才能执行搜索。我决定让它更加用户友好,并使搜索字段听到Enter按钮,这也将执行搜索。
当代码到达strID = Trim(Nz(Me.txtSearch.Value, ""))
时,我遇到的问题将随机返回为空字符串,即使在视觉上我可以看到文本框中有值。
在发生此问题时,我无法缩小任何模式。在这一点上,我甚至不知道如何解决这个问题,搜索的话也不会在Google中产生任何结果。我只能说,在记录之间进行更改会影响搜索是否通过。
在我输入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
在评论中的谈话之后,我已经缩小了这个问题,使其变得更加简单。即使文本字段中有多个字符,这也会产生“无效使用null”错误消息。为什么会发生这种情况,我该怎么做才能让它获取文本框中的值?
'============================================================================
' txtUnitNoToSearch_KeyPress
'============================================================================
Private Sub txtUnitNoToSearch_KeyPress(KeyAscii As Integer)
MsgBox Me.txtUnitNoToSearch
End Sub
答案 0 :(得分:4)
我认为您的问题与文本框有2个属性.Value
和.Text
这一事实有关,这两个属性看似相似但行为不同。
当您在文本框中进行编辑时,可以通过.Text
属性更改内容。但是,.Value
属性的内容尚未更新以匹配。
在文本框的更新后事件后,.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
。在处理其余代码时请记住这一点。