【发布时间】:2018-12-06 18:11:35
【问题描述】:
我在 Access 2013 中使用文本框过滤组合框列表。我将过滤器代码放在 Form_Timer 子中,以便让用户有时间在应用过滤器之前键入整个过滤器字符串,然后我调用文本框中的计时器更改子。它很好用,除了一件事:我希望组合框列表下拉并显示结果,但它不起作用。但是,我将完全相同的代码行放在组合框的 GotFocus 子中,并且该行完美运行。
我还尝试在 Change 子程序中执行过滤器代码,以防 Form_Timer 执行出现一些奇怪的情况。结果相同。代码如下:
Private Sub cboCENamesMain_GotFocus()
Me.cboCENamesMain.Dropdown '<---This line works perfectly.
End Sub
Private Sub Form_Timer()
Dim strSQL As String
Me.TimerInterval = 0
Me.txtFilter.Value = Me.txtFilter.Text
Me.cboCENamesMain.SetFocus
strSQL = ""
strSQL = strSQL & "Select DISTINCT [CE ID] "
strSQL = strSQL & "From [tblMyTable] "
If Len(Me.txtFilter) > 0 Then
strSQL = strSQL & "Where [CE ID] Like ""*" & Me.txtFilter & "*"" "
End If
strSQL = strSQL & "Order By [CE ID];"
Me.cboCENamesMain.RowSource = strSQL
Me.cboCENamesMain.Dropdown '<---This line doesn't do what it's supposed to.
Me.txtFilter.SetFocus
Me.txtFilter.SelStart = Len(Me.txtFilter.Text)
Me.txtFilter.SelLength = 0
End Sub
Private Sub txtFilter_Change()
If Len(Me.txtFilter.Text) = 0 _
Or Len(Me.txtFilter.Text) > 2 Then
Me.TimerInterval = 500
End If
End Sub
我可以使用列表框而不是组合框来允许用户查看他们的过滤输入结果,但这会严重影响我的表单设计。我在 Google 和 StackOverflow 上搜索过,但没有找到其他人讨论这个问题。有什么想法吗?
【问题讨论】:
-
您的代码对我来说毫无意义。您不能在下拉组合框的同时在文本字段中进行选择,因为这两个操作都需要将焦点放在控件上。该行可能工作正常,但在它再次折叠下拉菜单后立即行。
-
谢谢 Erik - 你是对的,当然,我应该想到这一点。我删除了下拉行后面的代码,然后它就可以工作了。只是这需要用户非常快速地输入他们的过滤文本——恐怕两个手指打字员可能会觉得这很令人沮丧。我知道我过去成功地完成了这种事情,但不记得我是如何做到的 - 我会再考虑一下。
-
好吧,现在我觉得很傻。我从组合框 Change sub 而不是文本框运行计时器,它按我想要的方式工作。不需要文本框 - 仅用于过滤列表框。我只需要将组合框自动展开属性更改为否,以避免 Access 填写匹配项。
-
通过
Me.cboCENamesMain.Dropdown调用,您是否希望强制MS Access 填充组合框的列表部分?也许Me.cboCENamesMain.Requery是更好的选择? -
可能下拉菜单不起作用,因为您已经移动了焦点。将 me.txtFilter 内容移动到 cboCeNamesMain 的 AfterUpdate。 (然后你就不需要那个 gotfocus 电话了)
标签: ms-access vba ms-access-2013