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