Почему метод раскрывающегося списка Access VBA не работает? - PullRequest
0 голосов
/ 06 декабря 2018

Я использую текстовое поле для фильтрации списка со списком в Access 2013. Я помещаю код фильтра в подпрограмму Form_Timer, чтобы дать пользователям время набрать всю строку фильтра перед применением фильтра, и я вызываютаймер из текстового поля Change sub.Он отлично работает, за исключением одной вещи: я хочу, чтобы список со списком выпадал и отображал результаты, но он просто не будет работать.Однако я поместил точно такую ​​же строку кода в подпрограмму 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 и не нашел никого, кто бы обсуждал эту проблему.Есть идеи?

1 Ответ

0 голосов
/ 12 декабря 2018

Вот мой окончательный код.Это работает так, как я хочу.Пользователь вводит несколько символов, и таймер автоматически фильтрует список со списком до элементов, содержащих набранную строку.

StackOverflow - отличное место для хранения подобных вещей - переходя с работы на работу, он экономит некоторыевремя изобретать велосипедНикто из них никогда не писал VBA.

Private Sub cboCENamesMain_Change()

    ' Ordinarily the AfterUpdate event would automatically fire off the Change event.
    ' We set a flag to avoid that - otherwise the list would be filtered to only the selected record.
    If booCancelChange = False Then
        ' Don't bother filtering the combo box list unless the filter text is null or longer than
        ' 1 character.
        If Len(Me.cboCENamesMain.Text) <> 1 Then
            ' Set the Form_Timer event to fire off in 0.3 second to give them time to type a few characters.
            Me.TimerInterval = 300
        End If
    Else
        ' Reset the flag, otherwise the Change code would stop working after the first record selection.
        booCancelChange = False
    End If

End Sub

Private Sub Form_Timer()

    Dim strSQL As String

    ' Reset the timer to not fire off, so that it won't keep running without a change
    ' in the combo box.
    Me.TimerInterval = 0

    ' If they have tabbed out of the combo box after selecting an item, we don't want to
    ' do this.  It's unnecessary and it throws errors from references to the control's
    ' properties when focus is no longer on the control.
    If Screen.ActiveControl.Name = Me.cboCENamesMain.Name Then
        ' Create a SQL filter for the combo box using the entered text.
        strSQL = ""
        strSQL = strSQL & "Select DISTINCT [CE ID] "
        strSQL = strSQL & "From [Covered Entities] "
        If Len(Me.cboCENamesMain.Text) > 0 Then
            strSQL = strSQL & "Where [CE ID] Like ""*" & Me.cboCENamesMain.Text & "*"" "
        End If
        strSQL = strSQL & "Order By [CE ID];"

        ' Apply the filter.
        Me.cboCENamesMain.RowSource = strSQL
        Me.txtRowCount = Me.cboCENamesMain.ListCount
        ' Drop down the combo list so they can see the results of their filter text.
        Me.cboCENamesMain.Dropdown
    End If

End Sub
...