0

当用户开始在组合框中输入单词时,如何从字符串的任何部分而不是从头开始自动搜索和查找匹配项?

例如。如果用户开始输入“001007228”,它仍应显示“GEM GRAVURECOINC - 001007228”作为缩小的选择结果。否则,如果用户键入“Gravure”,它仍应显示“GEM GRAVURECOINC - 001007228”作为组合框中值列表的缩小选择。

碰巧的是,一些用户有时可能会记住部分名称或末尾的数字。

4

2 回答 2

0

您的 sql 语句将使用Like运算符,如下所示:

"SELECT * FROM tblSome WHERE FieldName Like '*" & Me!cboYourCombo & "*'"

星号 * 是通配符,可匹配任何字符序列。

Me只能在表单的模块中使用,否则你会使用Forms!frmYours!cboYourCombo,其中Forms指的是所有打开的表单。

于 2013-06-17T20:34:32.647 回答
0

您需要使用数据库中的 VBA 代码捕获 KeyPress 事件。

按 ALT-F11 调出数据库背后的代码并使用类似这样的东西..

Private Sub Combo2_KeyPress(KeyAscii As Integer)
    Select Case KeyAscii
        Case 48 To 57, 65 To 90, 97 To 122 'alphachars only
            Combo2.ListIndex = FindIndex(Combo2.Value, KeyAscii)
        Case vbKeyDecimal
        Case vbKeyBack
        Case vbKeyRight
        Case vbKeyLeft
        Case vbKeyInsert
        Case vbKeyDelete
        Case vbKeyShift
        Case Else
            KeyAscii = 0
            Exit Sub
    End Select
End Sub

其中 'cboYourCombo' 是实际组合框控件的实际对象名称。

在上面的子程序中捕获重要的击键,例如数字和字母

这条线...

    Combo2.ListIndex = FindIndex(Combo2.Value, KeyAscii)

...是说它正在尝试运行 FindIndex() 函数(您必须编写它)并返回字符串中字符开始的位置,然后将组合框中的索引设置为从该位置开始。实际上这行不通,但你明白了。

实际上,您需要将组合框中的整个列表传递给一个例程,该例程在 FindIndex() 函数中查找您想要的数据的位置,并在您寻找的位置之前返回字符。本质上,您是在告诉组合框从字段的左侧向右看,但您已经在上述例程中找到了数据的位置。

IE。

假设我们有这个清单......

ABC123
ABC456
AHJ738
BHS238
MKJ299

如果你对上面的代码进行编码,那么当你按下一个键时,它会在上面的列表中查找具有该字符的第一个项目。让我们说在这种情况下数字 7。

当您按“7”时,例程找到了“AHJ738”项目,这恰好是列表中的第 3 个项目。

因此,它会为您返回“AHJ7”(至少),如果您知道我的意思,这将欺骗组合框从字段的左侧找到它。

换句话说,组合框控件中没有预先构建的方法来查找文本框中间的击键。除非你用谷歌搜索可以做到这一点的替代组合框控件,它们是商业变体。

于 2013-06-18T01:39:59.953 回答