Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/30: Рейтинг темы: голосов - 30, средняя оценка - 4.93
1 / 1 / 0
Регистрация: 25.10.2010
Сообщений: 32

Как написать процедуру, которая обрабатывала бы изменения в любом из контролов, представленных на форме

08.02.2011, 22:46. Показов 5927. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как написать процедуру, которая обрабатывала бы изменения в любом из контролов, представленных на форме.

Например, имеется форма, на которой 20 TextBox'ов. Нужно, чтобы процедура сама определяла, что произошли изменения в каких-то из этих 20-ти TextBox'ов и делала определенные действия.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.02.2011, 22:46
Ответы с готовыми решениями:

Написать программу которая обрабатывала бы XML и сохраняла бы в PDF
Доброго времени. Столкнулась с такой задачей, приходит XML с счетами за мобильные телефоны и ее надо обработать и отсортировать данные,...

Сконструировать функцию которая реализовывает декартово произведение множеств представленных в форме списков
Сконструировать функцию которая реализовывает декартово произведение множеств представленных в форме списков. Например для множеств X=(A...

Как написать процедуру которая выводит на экран строки таблицы?
Как написать процедуру которая выводит на экран строки таблицы?

18
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
08.02.2011, 23:35
Например, перехватываем изменение текста в текстовых полях:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Public Class Form1
 
    'Создаем массив текстовых полей
    Dim TextBoxes() As TextBox = New TextBox(19) {}
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        For i = 0 To 19
            TextBoxes(i) = New TextBox()
 
            TextBoxes(i).Location = New Point(10, 20 * i)
            TextBoxes(i).Name = "TextBox" & (i)
            Me.Controls.Add(TextBoxes(i))
            'Добавляем обработчик события для всех кнопок
            AddHandler TextBoxes(i).TextChanged, AddressOf TextBoxes_Changes
        Next
        'Добавляем обработчик события для определенного текстового поля
        AddHandler TextBoxes(3).TextChanged, AddressOf TextBox4_Changes
    End Sub
 
    Private Sub TextBoxes_Changes(ByVal sender As System.Object, ByVal e As System.EventArgs)
        'получаем измененный контрол
        Dim tb As TextBox = CType(sender, TextBox)
        'здесь можно задать логику изменения контрола - как одну для всех, так и различную
        Select Case tb.Name
            Case "TextBox0" : tb.Left += 10
            Case "TextBox1" : tb.Enabled = False
            Case "TextBox2" : tb.BackColor = Color.Chocolate
            Case "TextBox4" : MessageBox.Show("Control " & tb.Name & " has been changed")
        End Select
    End Sub
    Private Sub TextBox4_Changes(ByVal sender As System.Object, ByVal e As System.EventArgs)
        MessageBox.Show("tExtBox4 has been changed")
    End Sub
End Class
1
1 / 1 / 0
Регистрация: 25.10.2010
Сообщений: 32
09.02.2011, 00:34  [ТС]
Eugene22, благодарю за быстрый и подробно расписанный ответ. Очень помогло! Спасибо!

Добавлено через 41 минуту
Вот код. При выполнении выдает ошибку в строке Me.Container.Add...
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    Dim TextBoxes() As TextBox = New TextBox(38) {}
    Dim ComboBoxes() As ComboBox = New ComboBox(10) {}
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        For i = 0 To 38 ' у меня 39 текстбоксов
            TextBoxes(i) = New TextBox()
            TextBoxes(i).Name = "TextBox" & (i)
            Me.Container.Add(TextBoxes(i))    ' В этом месте выдает ошибку "Ссылка на объект не указывает на экземпляр объекта."
            AddHandler TextBoxes(i).TextChanged, AddressOf TextBoxes_Changes
        Next
    End Sub
 
    Private Sub TextBoxes_Changes(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim tb As TextBox = CType(sender, TextBox)
        Select Case tb.Name
            Case "textbox1"
                Try
                    Tin_tr = tb.Text
                    tb.BackColor = Color.Green
                Catch
                    tb.Text = ""
                End Try
        End Select
    End Sub
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8729 / 3681 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
09.02.2011, 02:01
ancheville, посмотри 11 строчку в коде Eugene22, и 8 в своём - разницу видишь? Если же разница незаметна, то ответ
здесь.
Цитата Сообщение от Eugene22 Посмотреть сообщение
Me.Controls.Add(TextBoxes(i))
Цитата Сообщение от ancheville Посмотреть сообщение
Me.Container.Add(TextBoxes(i))
1
1 / 1 / 0
Регистрация: 25.10.2010
Сообщений: 32
09.02.2011, 23:19  [ТС]
Подправил код, но все равно ничего не происходит:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
    Dim TextBoxes() As TextBox = New TextBox(38) {}
    'Dim ComboBoxes() As ComboBox = New ComboBox(10) {}
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim ctrl As Control
        Dim nameCtrl As String
        For Each ctrl In GroupBox4.Controls
            For i = 40 To 58
                nameCtrl = "TextBox" & i
                If ctrl.Name = nameCtrl Then
                    ctrl.Enabled = False
                End If
            Next
        Next
        RadioButton1.Checked = True
 
        For i = 0 To 38
            TextBoxes(i) = New TextBox()
            TextBoxes(i).Name = "TextBox" & (i)
            Me.Controls.Add(TextBoxes(i))
            AddHandler TextBoxes(i).TextChanged, AddressOf TextBoxes_Changes
        Next i
        AddHandler TextBoxes(1).TextChanged, AddressOf TextBoxes_Changes
    End Sub
 
    Private Sub TextBoxes_Changes(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim tb As TextBox = CType(sender, TextBox)
        Select Case tb.Name
            Case "textbox1"
                Try
                    Tin_tr = tb.Text
                    tb.BackColor = Color.Green
                Catch
                    tb.Text = ""
                End Try
            Case "textbox2"
                Try
                    Tout_tr = tb.Text
                    tb.BackColor = Color.Green
                Catch ex As Exception
                    tb.Text = ""
                End Try
        End Select
    End Sub
0
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
09.02.2011, 23:33
ancheville, несколько комментариев:
1)Вместо этого
VB.NET
1
Dim TextBoxes() As TextBox = New TextBox(38) {}
можно просто написать
VB.NET
1
Dim TextBoxes(38) As TextBox
- так как далее у тебя создаются эти поля (и зачем тебе столько текстбоксов ?)
2)
VB.NET
1
2
Select Case tb.Name
            Case "textbox1"
- здесь у тебя сравнивается с именем поля, но выше у тебя объявлялись поля с именами "TextBox", а не "textbox"
3)участки кода типа Try...Catch лучше вынести в отдельную процедуру, а затем ее вставлять в Select Case
4) фишку с контролами на группбоксе я вообще не просек
1
1 / 1 / 0
Регистрация: 25.10.2010
Сообщений: 32
10.02.2011, 00:17  [ТС]
1 - заменил
2 - про разный регистр букв понял и тоже изменил.
Итог:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
  Dim TextBoxes(38) As TextBox
 
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 
        For i = 1 To 38
            TextBoxes(i) = New TextBox()
            TextBoxes(i).Name = "TextBox" & (i)
            Me.Controls.Add(TextBoxes(i))
            AddHandler TextBoxes(i).TextChanged, AddressOf TextBoxes_Changes
        Next i
 
    End Sub
 
    Private Sub TextBoxes_Changes(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim tb As TextBox = CType(sender, TextBox)
        Select Case tb.Name
            Case "TextBox1"
                Try
                    Tin_tr = tb.Text
 
                    tb.BackColor = Color.Aquamarine
 
                Catch
                    tb.Text = ""
                End Try
            Case "TextBox2"
                Try
                    Tout_tr = tb.Text
                    tb.BackColor = Color.Green
                Catch ex As Exception
                    tb.Text = ""
                End Try
        End Select
    End Sub
Участки Try...Catch не могу вынести в отдельную процедуру, т.к. для каждого текстбокса у меня своя переменная. Соответственно у меня должно быть 39 процедур, что не удобно!
Фишка с групбоксами - моя заморочка.

В итоге, все равно при изменении любого текстбокса не проивходит переход в процедуру TextBoxes_Changes
0
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
10.02.2011, 00:54
Честное слово, не знаю, что у тебя не получается, тот код, что я приводил он работает 100% - на всякий случай то же самое прикрепил в архиве. По поводу try...catch и обилия переменных - это все зависит от логики приложения - если грамотно все спроектировать и если задача позволяет, то можно попробовать и через одну процедуру все сделать. Хотя можно все эти try catch оставить
И вот еще, можно например так сделать - через двоеточие все действия
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Sub TextBoxes_Changes(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim tb As TextBox = CType(sender, TextBox)
        Select Case tb.Name
            Case "TextBox1" : Tin_tr = tb.Text : tb.BackColor = Color.Aquamarine
            Case "TextBox2"
                Try
                    Tout_tr = tb.Text
                    tb.BackColor = Color.Green
                Catch ex As Exception
                    tb.Text = ""
                End Try
        End Select
    End Sub
- но по идее все правильно.
Вложения
Тип файла: zip WindowsApplication1.zip (62.5 Кб, 41 просмотров)
1
1 / 1 / 0
Регистрация: 25.10.2010
Сообщений: 32
11.02.2011, 01:30  [ТС]
Eugene22, я прописал в коде хэндлер для каждого текстбокса и теперь все работает. Спасибо за участие и советы.
Я не понял только одного: как мне сделать присвоение какого-то параметра всем текстбоксам, расположенным на форме?
0
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
11.02.2011, 13:18
У тебя есть глобальный массив текстбоксов, в коде загрузки формы, с помощью цикла идет присвоение всем текстбоксам определенного имени, присвоение остальных параметров решается подобным способом - то есть через перебор в цикле всех элементов массива и задания им нужного параметра
1
1 / 1 / 0
Регистрация: 25.10.2010
Сообщений: 32
12.02.2011, 11:46  [ТС]
Я прошу прощения, но наверное я не сказал про одну деталь. Дело в том, что у меня на форме уже есть текстбоксы и поэтому их создавать не нужно. Возможно это и является причиной того, что у меня не работает перебор.

VB.NET
1
2
3
4
5
        For i = 1 To 39
            MsgBox(Form1.TextBoxes(i).Name)
            Form1.TextBoxes(i).Text = "500"
 
        Next
от этого кода, по идее, всем свойствам text всех текстбоксов должно присвоиться значение 500, но этого не происходит, хотя я в мэссэджбоксе вижу правильное название текстбокса на форме
0
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
12.02.2011, 12:52
нЕпонятно, что ты хотел сделать вот этой строкой
VB.NET
1
MsgBox(Form1.TextBoxes(i).Name)
- тут вместо Form1 надо использовать Me.
А чтобы перебрать все текстовые поля, которые имеются на форме вне зависимости входят они в какой-нибудь массив или нет -выполняешь следующие действия, например по клику на кнопку:
VB.NET
1
2
3
4
5
For Each textboxControl As Control In Me.Controls
            If TypeOf (textboxControl) Is TextBox Then
                textboxControl.Text = "500"
            End If
        Next
2
1 / 1 / 0
Регистрация: 25.10.2010
Сообщений: 32
12.02.2011, 13:55  [ТС]
Дело в том, что у меня на форме есть 4 групбокса и мои текскбоксы все находятся в них. Когда я пишу вышеприведенных текст, то у меня значение присваивается только текстбоксам, которые непосредственно на форме и не присваивается тем текстбоксам, которые входят в групбоксы. Что делать, для меня это важно?
0
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
12.02.2011, 14:31
Вот так - не лучшее решение, но тут без разницы, где находятся твои текстбоксы на форме или на групбоксах
VB.NET
1
2
3
4
5
6
7
8
9
10
11
For Each textboxControl As Control In Me.Controls       
            If TypeOf (textboxControl) Is TextBox Then
                textboxControl.Text = "500"
            ElseIf TypeOf (textboxControl) Is GroupBox Then
                For Each textboxControl1 As Control In textboxControl.Controls
                    If TypeOf (textboxControl1) Is TextBox Then
                        textboxControl1.Text = "500"
                    End If
                Next
            End If
        Next
1
1 / 1 / 0
Регистрация: 25.10.2010
Сообщений: 32
12.02.2011, 17:07  [ТС]
Цитата Сообщение от Eugene22 Посмотреть сообщение
Вот так - не лучшее решение, но тут без разницы, где находятся твои текстбоксы на форме или на групбоксах
VB.NET
1
2
3
4
5
6
7
8
9
10
11
For Each textboxControl As Control In Me.Controls       
            If TypeOf (textboxControl) Is TextBox Then
                textboxControl.Text = "500"
            ElseIf TypeOf (textboxControl) Is GroupBox Then
                For Each textboxControl1 As Control In textboxControl.Controls
                    If TypeOf (textboxControl1) Is TextBox Then
                        textboxControl1.Text = "500"
                    End If
                Next
            End If
        Next
Это помогло. Благодарю!
0
 Аватар для eJ_Studio
169 / 149 / 14
Регистрация: 13.07.2011
Сообщений: 477
27.02.2012, 17:58
Eugene22, а если будет панель в панели? тут нужна рекурсия, хотя она у тебя возможно и есть, на взгляд не пойму
0
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
27.02.2012, 18:13
Цитата Сообщение от eJ_Studio Посмотреть сообщение
Eugene22, а если будет панель в панели? тут нужна рекурсия, хотя она у тебя возможно и есть, на взгляд не пойму
если панель в панели, а та еще в панели, а та еще и т.д. - то тут лучше вынести код в отдельную процедуру, где в качестве параметра будет использоваться параметр типа GroupBox, а затем в этой процедуре перебираем на панели все элементы, если же элемент - опять групбокс - то вызываем для него эту же процедуру
0
 Аватар для eJ_Studio
169 / 149 / 14
Регистрация: 13.07.2011
Сообщений: 477
27.02.2012, 19:18
Цитата Сообщение от Eugene22 Посмотреть сообщение
если же элемент - опять групбокс - то вызываем для него эту же процедуру
Цитата Сообщение от Eugene22 Посмотреть сообщение
то вызываем для него эту же процедуру
то есть делаем рекурсию
0
_
2364 / 1243 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
27.02.2012, 20:13
Цитата Сообщение от eJ_Studio Посмотреть сообщение
то есть делаем рекурсию
да рекурсию
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.02.2012, 20:13
Помогаю со студенческими работами здесь

написать процедуру "ввод" которая введенное слово в edit перемещает в список listbox и процедуру "очистить", которая очищает поле edit
написать процедуру "ввод" которая введенное слово в edit перемещает в список listbox и процедуру "очистить", которая очищает поле...

Как ускорить отрисовку контролов на форме?
Програмно создаю на форме много контролов - кнопок (>200) и возникают такие проблемы: 1. Контролы появляются не все сразу, а, как бы,...

Написать программу,которая выводит таблицу значений функции >^(x-2)+(x+1). Диапазон изменения аргумента вводится пользователем так же как и шаг пригла
Написать программу,которая выводит таблицу значений функции >^(x-2)+(x+1). Диапазон изменения аргумента вводится пользователем так же как и...

Как используя очередь, написать процедуру или функцию, которая заменяет все отрицательные элементы файла на их абсолютные значения?
Как используя очередь, написать процедуру или функцию, которая заменяет все отрицательные элементы файла на их абсолютные значения?

Написать процедуру, предназначенную для изменения содержимого и внешнего вида ячейки с адресом А1
Написать процедуру Sub с именем Proc16_With() предназначенную для изменения содержимого и внешнего вида ячейки с адресом А1 третьего...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru