我正在尝试在用户表单中获取一个列表框,以通过在同一表单上的文本框中键入的内容来动态过滤内容。它可以工作,但是当用户开始输入时,它在执行过滤代码时基本上会冻结。如果我快速键入一系列字符,文本框将在几秒钟内不显示这些字符。我想动态过滤列表框而没有滞后。
我试图创建一个计时器来计算用户在执行过滤器之前最后一次键入字符以来的时间,但这带来了另一组问题,包括用户键入的最后一个字符没有触发textbox_change如果它是与倒数第二个字符相关的快速打字。
Private Sub FilterTextBox_Change()
Dim bSelected As Boolean
Dim lListIncrementer As Long
Dim lDictionaryIncrementer As Long
Dim lOriginalListBoxDictionaryIncrementer As Long
Dim lLastListItem As Long
Dim sFilterString As String
Dim lDictionaryIncrementerOffset As Long
Dim dTimerDifference As Double
Dim sCurrentString As String
sFilterString = UCase(InvoiceProductAssociation.FilterTextBox.Text)
lLastListItem = InvoiceProductAssociation.CatapultItemIdAndDescriptionListBox.ListCount - 1
lDictionaryIncrementerOffset = 0
For lDictionaryIncrementer = 0 To oListBoxItemDictionary.Count - 1
sCurrentString = UCase(oListBoxItemDictionary.Keys(lDictionaryIncrementer))
If InStr(sCurrentString, sFilterString) Then
oListBoxItemDictionary(oListBoxItemDictionary.Keys(lDictionaryIncrementer)) = "Show"
ElseIf sFilterString = vbNullString Then
oListBoxItemDictionary(oListBoxItemDictionary.Keys(lDictionaryIncrementer)) = "Show"
Else
oListBoxItemDictionary(oListBoxItemDictionary.Keys(lDictionaryIncrementer)) = "Hide"
End If
Next lDictionaryIncrementer
For lListIncrementer = 0 To lLastListItem
If InvoiceProductAssociation.CatapultItemIdAndDescriptionListBox.Selected(lListIncrementer) = True Then
oListBoxSelectedDictionary("Selected") = InvoiceProductAssociation.CatapultItemIdAndDescriptionListBox.List(lListIncrementer)
End If
Next lListIncrementer
InvoiceProductAssociation.CatapultItemIdAndDescriptionListBox.Clear
For lDictionaryIncrementer = 0 To oListBoxItemDictionary.Count - 1
If oListBoxItemDictionary.Items(lDictionaryIncrementer) = "Show" Then
With InvoiceProductAssociation.CatapultItemIdAndDescriptionListBox
.AddItem oListBoxItemDictionary.Keys(lDictionaryIncrementer)
If oListBoxSelectedDictionary("Selected") = oListBoxItemDictionary.Keys(lDictionaryIncrementer) Then
InvoiceProductAssociation.CatapultItemIdAndDescriptionListBox.Selected(lDictionaryIncrementer + lDictionaryIncrementerOffset) = True
End If
End With
Else
lDictionaryIncrementerOffset = lDictionaryIncrementerOffset - 1
End If
lListIncrementer = lListIncrementer + 1
Next lDictionaryIncrementer
End Sub
加载到字典中的项目数量超过 1,000,但过去字典对我的响应非常快,所以我认为 .additem 导致了滞后。
我想知道是否有人对如何更快地将项目添加到列表框有任何建议,或者有关于仅在用户停止输入 x 秒后成功触发过滤器的建议。