Access 2007 VBA - невозможно установить фокус после настройки фильтра форм, который возвращает ноль записей

У меня есть текстовое поле управления в заголовке непрерывной формы. Любые символы, введенные в текстовое поле, используются для построения и применения строки фильтра. После применения фильтра фокус возвращается к текстовому полю, используя set focus и selstart, чтобы пользователь мог добавить больше символов. В результате список записей фильтруется по мере ввода каждого символа.

Заданный код фильтра запускается текстовым полем при событии изменения. Код перемещает фокус на другой элемент управления, а затем обратно, чтобы обновить свойство textbox.value (я пытался использовать.text, но продолжал сталкиваться с другими проблемами фокуса).

Фильтрация записей работает нормально до тех пор, пока не будет введена строка, что приведет к отображению нулевых записей. На этом этапе строка VBA, которая устанавливает свойство Selstart, выдает ошибку "Вы не можете установить свойство элемента управления, если у него нет фокуса". Строки кода перечислены ниже, TxtFilterString - имя текстового поля, LengthOfText - целое число, SetFormFilter - подпрограмма, которая создает фильтр и применяет его:

LengthOfText = Len(Me.TxtFilterString.Value)

SetFormFilter

Me.TxtFilterString.SetFocus
Me.TxtFilterString.SelStart = LengthOfText

Кажется, что строка Me.TxtFilterString.SetFocus терпит неудачу, когда нет записей для отображения, и это приводит к тому, что следующая строка выдает ошибку, несмотря на то, что элемент управления отображается в разделе заголовка.

Какие-нибудь мысли? Что я пропустил?

Спасибо за прочтение. Салазки

2 ответа

Я предполагаю, что у вас есть список, отображающий результаты вашего запроса.
Если произойдет ошибка, когда в списке будет отображаться 0 записей, то не могли бы вы просто поставить галочку вокруг результатов списка, которые не запускают строку с ошибками?

if listbox.listcount >0 then
  Me.TxtFilterString.SelStart = LengthOfText
endif

Я понятия не имею, почему возникает проблема, но мое решение состоит в том, чтобы не выполнять строку кода, если набор записей пуст или текстовое поле, о котором идет речь, содержит ноль, что, по-видимому, происходит, если содержимое удаляется с помощью клавиши удаления. Мой на смену саба здесь:

Private Sub TxtFilterString_Change()
' Call sub that sets the form filter to value entered in text box
   Dim LengthOfText As Integer
    On Error GoTo ErrHandler

    Me.CmdResetSearch.SetFocus  ' move the focus away to update the  value prop, as the text prop has focus issues
    Me.TxtFilterString.SetFocus

    SetFormFilter ' build and set the continuous forms filter string

    ' The following if block is to overcome a bug where Access does not allow the
    ' set focus property of the text field to be set when there are no records to display

    ' The result is that the filter string that returns zero records becomes highlighted
    ' allowing it to be overwritten.

    ' The IsNull clause is required if the user used delete to remove the text in the text box

   If Me.Recordset.RecordCount = 0 Or IsNull(Me.TxtFilterString) Then
      ' There are no records or the user has deleted in the field (causing a Null to be enetered)
      Me.TxtFilterString.SetFocus

    Else
      ' There are records and there is text in the text box so set focus and caret position
      Me.TxtFilterString.SetFocus
      Me.TxtFilterString.SelStart = Len(Me.TxtFilterString.Value)
   End If

    Exit Sub
ErrHandler:
    MsgBox "An error in TxtFilterString_change : " & Err.Description, vbExclamation
    Exit Sub
End Sub
Другие вопросы по тегам