bgcwaterman Ответов: 1

Нужна помощь с настройкой textchanged на всех текстовых полях...


У меня есть форма win с 43 текстовыми полями, и я хочу включить кнопку, если какое-либо из полей было изменено. следующий код-это то, что у меня есть. Это происходит в подпрограмме Form_Load. Я добавил окно сообщения, чтобы посмотреть, работает ли оно, но это не так. Что я упускаю или делаю неправильно?

Что я уже пробовал:

'Setup TextChanged flag for all textboxes
        For Each Control As Control In Me.Controls
            If Control.GetType = GetType(TextBox) Then
                Dim TextBox As TextBox = DirectCast(Control, TextBox)
                AddHandler TextBox.TextChanged, AddressOf TextBoxTextChanged_Handler
                MsgBox(TextBox.Name & " was changed.") 'Added this message box to see if the sub is working 
            End If
        Next


У меня есть следующее но оно не срабатывает:

' TextChangedEventHandler delegate method.
    Sub TextBoxTextChanged_Handler(ByVal sender As Object, ByVal e As EventArgs)
        Dim TextBox As TextBox = DirectCast(sender, TextBox)
        MsgBox(TextBox.Name & " was changed.")
    End Sub

Ralf Meier

Я не совсем уверен, но предполагаю, что в конце Form_Load элементы управления формы являются экземплярами - не раньше. Я бы попробовал сделать это с другим событием из формы.
Еще один момент : для меня всегда странно давать переменной то же имя, что и тип, на который она ссылается (для каждого элемента управления как элемента управления ... - лучше : для каждого c в качестве контроля)

Richard Deeming

Для Windows Forms элементы управления будут существовать сразу же после создания конструктора. InitializeComponent метод возвращает значение. Это обычно вызывается из конструктора, поэтому элементы управления будут существовать задолго до того, как Load пожары событий. :)

1 Ответов

Рейтинг:
10

phil.o

Вполне возможно, что текстовые поля не находятся непосредственно в форме Controls свойство; они могут содержаться другим элементом управления (GroupBox и т. д.).

Вы можете поставить точку останова на линии foreach и посмотреть, какие элементы управления вы захватите.

Или вы можете статически определить обработчик в IDE, выбрав все текстовые поля и воздействуя на них обработчиком.


bgcwaterman

Текстовые поля находятся в групповых полях. Мне нужно будет выяснить, как это сделать для текстовых полей в групповых полях.

phil.o

Вы могли бы это сделать

For Each ctl As Control In Me.Controls
   If ctl.GetType = GetType(GroupBox) Then
      For Each tb As Control in ctl.Controls
         '' ...
но имхо решение статически назначить обработчик из IDE гораздо проще (если только вы не создаете элементы управления во время выполнения).

bgcwaterman

Как бы вы сделали метод IDE? спасибо

phil.o

- Перейдите к проектному виду формы.
- Выделите все текстовые поля.
- В окне "Свойства" (обычно справа) есть кнопка "события" (которая позволяет отображать события для выбранных элементов управления вместо свойств).
- Перейдите к событию TextChanged и выберите обработчик.
И не забудьте удалить ту часть, где вы пытались сделать это программно, которая больше не понадобится.

bgcwaterman

У меня нет кнопки "события" в окне свойств после выбора текстовых полей.

bgcwaterman

Я нашел кнопку "события"... Извините за мою неопытность. Спасибо.

phil.o

Нет проблем, все были там в какой-то момент :)
Всегда пожалуйста!

bgcwaterman

Это сработало. Мне просто нужно настроить то, что я хочу сделать с обработчиком... Самое странное, что мне нужно перейти к каждому элементу управления, чтобы установить обработчик, потому что если я выберу несколько элементов управления, то событие "TextChanged" не появится ... спасибо...