通过键入单个字母对 Access 表单进行排序

Sorting Access form by typing a single letter

我正在寻求有关通过接受用户键入的单个字母来对 Access (2013) 表单的数据源进行排序的建议。这个问题更多的是关于设计策略而不是实际代码,尽管代码示例也可能有帮助。

我为客户开发的系统有一个表单,其中包含一个按我定义的一组参数排序的数据集。一切正常,我为用户提供了一些实时排序方法,可以根据需要动态重新排序绑定的数据集。同样,一切正常。

但是,他们在此之前使用的系统(信不信由你,绿屏终端应用程序)有一个他们仍然非常怀念的功能,应该很容易实现。例如,该功能是在客户屏幕上查看数据(这是一个很长的列表)并且能够 (1) 输入姓氏的第一个字母以自动 "scroll down"列表的一部分或 (2) 过滤第一个字母的数据集 ALL BY TYPING JUST THAT LETTER。我建议创建一个未绑定的字段,他们可以将鼠标悬停、键入字母并按回车键,但反馈是鼠标悬停、单击、键入并按回车键需要时间。我建议为每个字母制作按钮,他们可以点击以完成相同的目标,但同样的反馈。

这个功能确实有意义。例如,如果您有一个包含 8,000 名客户的列表,并且您想要快速找到姓氏以字母 "R" 开头的人,那么将鼠标移动到滚动条并拖动对于整天这样做的用户来说可能会变得乏味.相反,如果他们可以简单地按 R 键并直接前往那里,那将是个好主意。

我想答案很简单,但我只是没找到。它是否在某处设置了按键事件?

将表单的 KeyPreview property to True to give it a first shot at any keystrokes, then add a KeyDown 事件处理程序设置为如下表单(未测试):

Private Sub Form_KeyDown(ByVal KeyCode As Integer, ByVal Shift As Integer)
    Dim NoTextBoxFocused As Boolean
    ' Make sure we're not stealing text from focused control
    NoTextBoxFocused = TypeName(ActiveControl) <> "TextBox" And _
                       TypeName(ActiveControl) <> "ComboBox"
    If KeyCode >= vbKeyA And KeyCode <= vbKeyZ And NoTextBoxFocused Then    
        ' PSEUDOCODE: Sort here, presumably case-insensitive;
        '   otherwise, check for capitals with this:
        '   If (Shift And acShiftMask) <> 0 Then

        KeyCode = 0     ' Turns off further handling
    End If
    ' Otherwise, fall through without doing anything else
End Sub

您可能还想将其扩展为完整的增量搜索,完成时仅在搜索时显示标签或文本框,当用户输入他们想要的前几个字母时逐步过滤。如果显示文本框,请确保可以轻松开始新的增量搜索(使用 Esc 或者可能只是超时)。这应该有助于他们摆脱对旧程序的怀念。

只需使用任何控件(组合框、列表框、文本框、按钮)并在 AfterUpdate 或 OnClick 事件中 运行 ApplyFilter embedded macro or vba RunCommand using an SQL LIKE 子句:

ComboBox: Letter Filter
Row Source: "A";"B";"C"; ... "Z"
Row Source Type: Value List

ApplyFilter
   Filter Name: <blank>
   Where Condition: ="[LastName] LIKE '" & [Forms]![Customers]![LetterFilter] & "*'"
   Control Name: <blank>

或者,使用相同的控件和触发事件,更新表单的记录源:

 Recordsource: SELECT * FROM [Customers] 
              WHERE [LastName] LIKE [Forms]![Customers]![LetterFilter] & '*'

OR 同义查询使用 Left()

 Recordsource: SELECT * FROM [Customers] 
                  WHERE Left([LastName], 1) = [Forms]![Customers]![LetterFilter] 

OR SQL 在 VBA 中查询:

 Forms!Customers.Form.RecordSource = "SELECT * FROM [Customers] 
                  WHERE [LastName] LIKE '" & [Forms]![Customers]![LetterFilter] & "*'"

记住设置 RecordSource 不在 VBA 但查询 window