Как получить свойство 'Value' из текстового поля формы MSAccess во время его редактирования? - PullRequest
2 голосов
/ 29 января 2020

Как мне записать значение, вводимое в элемент управления textBox формы MS Access по мере его редактирования? Я хотел бы показать результаты поиска (в списке), который обновляется с каждым новым символом, добавляемым в текстовое поле, используемое для поиска? Запрос на месте, события на месте, единственное, чего не хватает, это где хранится введенное значение, потому что оно не находится в свойстве элемента управления .Value во время «типизированных» событий.

Ответы [ 2 ]

2 голосов
/ 29 января 2020

Ключом к достижению этого является использование события OnChange текстового поля, которое срабатывает при каждом нажатии клавиши, которое изменяет содержимое текстового поля.

Таким образом, вы можете легко изменить содержимое поле списка, ссылаясь на свойство Text текстового поля в обработчике события OnChange.

Вот очень базовая c демонстрация поиска списка имен животных:

enter image description here

0 голосов
/ 29 января 2020

Обратите внимание, что многие из моих попыток прочитать состояние ниже (и в предыдущих изменениях) являются мусором. У меня есть эта функция построения запросов, которая выполняется в разное время (не указан в вопросе, mia culpa). Сейчас я передаю состояние в качестве параметра для указанной функции запроса, а не пытаюсь его активно читать. Я оставляю это как предупреждение любому, кто идет по подобному пути. Я прошу прощения, если до сих пор руководил кем-то неправильно.

Свойство 'Value' в textBox не обновляется при событиях изменения или keyup, как и следовало ожидать. Если вы хотите sh захватить содержимое, введенное в textBox по мере его ввода, вам нужно искать свойство 'Text', например:

Me.txtSearchBox.Text

К сожалению, это свойство не доступен, если textBox не активен, поэтому, если вы читаете .Text, взаимодействуя с другим элементом управления, вы захотите проверить, активен ли textBox, которым он не будет, и переключиться на проверку 'Value 'вместо этого, как в:

' assuming you've already dim'd the strSearchBox as String here...
If Screen.ActiveControl.Name = txtSearchBox.Name Then
    ' the control is active, so for the moment, Text is accessible
    strSearchBox = Trim(txtSearchBox.Text & vbNullString)
Else
    ' textBox failover:
    ' Value is always accessible
    strSearchBox = Trim(txtSearchBox.Value & vbNullString)
End If
' strSearchBox now has the contents of txtSearchBox, one way or the other

Да, я навязчивый Trim () er. Да, я приводил к строке, добавляя "" (исправлено в vbNullString для @ComputerVersteher - большое спасибо). Пожалуйста, кричите на меня, если это ужасно. Дело в том, что .Value может быть нулевым при загрузке формы, и присвоение нулевого значения строковой переменной прерывается.

К сожалению, если вы собираетесь запускать этот код во время входа и выхода из отладки или загрузки формы Screen.ActiveControl.Name не будет вызываться. Вы можете решить эту проблему, проверив, что данная форма действительно загружена, например, так:

If not CurrentProject.AllForms(Me.Name).IsLoaded Then
    ' activeform failover:
    ' Value is always accessible
    strSearchBox = Trim(txtSearchBox.Value & vbNullString)
Else
    ' there's an Form loaded, so there is an ActiveControl Name to test
    If Screen.ActiveControl.Name = txtSearchBox.Name Then
        ' the control is active, so for the moment, Text is accessible
        strSearchBox = Trim(txtSearchBox.Text & vbNullString)
    Else
        ' textBox failover:
        ' Value is always accessible
        strSearchBox = Trim(txtSearchBox.Value & vbNullString)
    End If
End If

Надеюсь, это сэкономит некоторым людям немного времени. Может быть, это сэкономит вам время, если вы прочитаете это и не последуете моему совету. Ознакомьтесь с изменениями, чтобы увидеть другие плохие идеи о состоянии чтения формы VB и неверные предположения об уникальности имен элементов управления, et c ...

...