4

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

2 回答 2

3

我有一个类似的问题,我在互联网上搜索关键字“find as you type”和“ms access”

我发现了这篇很棒的文章。希望它能解决你的问题。

注意本文还包含要使用的源代码。

于 2012-10-26T22:38:00.163 回答
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!

于 2012-10-27T09:31:12.543 回答