Обратите внимание, что многие из моих попыток прочитать состояние ниже (и в предыдущих изменениях) являются мусором. У меня есть эта функция построения запросов, которая выполняется в разное время (не указан в вопросе, 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 ...