用于过滤数据表的文本框(在MS Access中查找与您键入的每个击键匹配的记录)

时间:2012-10-26 22:25:36

标签: ms-access

有人可以帮助我理解为什么这段代码没有产生预期的结果? 我有一个带有名为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

2 个答案:

答案 0 :(得分:3)

我遇到了类似的问题,我在互联网上搜索了关键字“当你输入时找到”和“ms access”

我找到了great article。希望它能解决你的问题。

N.B。本文还包含要使用的源代码。

答案 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!
如果你这样做不会受到伤害,但如果没有在代码中添加任何内容,它会使事情变得不那么清晰。