有人可以帮助我理解为什么这段代码没有产生预期的结果? 我有一个带有名为TxtVendorSearch的文本框的表单。
当用户开始在此文本框中输入内容时,我希望它开始在表单的子数据表中过滤结果。
我从一个完全填充的数据表开始,我不确定为什么一旦我开始键入一个应该留下结果的有效过滤器,过滤器就会把整个过滤器搞砸了。
Private Sub TxtVendorSearch_KeyPress(KeyAscii As Integer)
Dim str1 As String
str1 = "[VendorID] LIKE '*" & Me.TxtVendorSearch.Value & "*' "
Me!subOrderDS1.Form.Filter = str1
Me!subOrderDS1.Form.FilterOn = True
End Sub
答案 0 :(得分:3)
答案 1 :(得分:2)
不要使用KeyPress
事件,您将无法轻松地从事件处理程序本身重建实际输入数据(当事件被触发时,刚刚按下的键尚未添加到文本框的文本,意味着你总是缩短最后一次击键。
相反,请使用KeyDown
事件,并使用文本框“.Text
”属性而不是.Value
。
.Value
只有在焦点离开框后才会设置。
因此,您的代码可以简单地重写为(确保您的KeyDown事件在表单上的文本框中的事件中设置):
Private Sub TxtVendorSearch_KeyDown(KeyCode As Integer, Shift As Integer)
' If there is no filter criteria, disable filtering '
If Len(Trim(TxtVendorSearch.Text)) = 0 Then
subOrderDS1.Form.FilterOn = False
Exit Sub
End If
' Do nothing if user hits RETURN or TAB '
If KeyAscii < 32 Then
KeyCode = 0
Exit Sub
End If
Dim str1 As String
str1 = "[VendorID] LIKE '*" & Trim$(TxtVendorSearch.Text) & "*'"
subOrderDS1.Form.Filter = str1
subOrderDS1.Form.FilterOn = True
End Sub
我使用Trim()
删除了用户可能输入的任何前导和尾随空格。
最后一件事:您无需在表单代码中使用Me.
或Me!
。
如果你这样做不会受到伤害,但如果没有在代码中添加任何内容,它会使事情变得不那么清晰。