Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
2 / 2 / 1
Регистрация: 26.02.2015
Сообщений: 25
.NET 4.x

Обратиться к CheckBox, расположенному на GroupBox

16.03.2015, 16:55. Показов 3754. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть три кнопки, три группы, в каждой из которых по три чекбокса. У чекбоксов стоит параметр Tag, причём этот параметр одинаковый у некоторых чекбоксов из разных групп. Суть в том, что при нажатии на определенную кнопку у всех чекбоксов с одинаковым Tag должна поставиться галка. Помогите пожалуйста сотворить код =)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.03.2015, 16:55
Ответы с готовыми решениями:

Обратиться к RichTextBox, расположенному на выделенной вкладке TabControl
Излагаю суть проблемы. Есть приложение в котором каждая новая форма открывается не отдельным окном, а во вкладке в общем окне. Делаю...

Как обратиться к элементу расположенному в iframe?
заранее премного благодарен ;)

Как обратиться к GroupBox в цикле ?
Здравствуйте, подскажите пожалуйста, как обратиться к группе Groupbox в цикле. Фрагмент кода, который не работает: 'обратиться к...

27
Почетный модератор
 Аватар для Памирыч
23251 / 9163 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
16.03.2015, 19:16
Покажите визуальное проектирование формы.
И как у Вас называются чекбоксы
0
2 / 2 / 1
Регистрация: 26.02.2015
Сообщений: 25
16.03.2015, 23:30  [ТС]
Я подписал у каждого чекбокса какое у каждого из них значение Tag ("1", "2" или "3"). А в моей программе у чекбоксов свойство текст должно быть пустым. У Tag'а только цифровые значения. Хотя не знаю, влияет это на чтото или нет

Нашёл такой код в инете, но он работает только для чекбоксов не находящихся в ГрупБоксе
VB.NET
1
2
3
4
5
For Each c As CheckBox In Controls.OfType(Of CheckBox)()
      If c.Tag = i Then
         c.Checked = True
      End If
Next
Изображения
 
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
17.03.2015, 05:52
Лучший ответ Сообщение было отмечено koffe09 как решение

Решение

Всё то же самое, только вместо Me, который здесь неявный, нужно написать GroupBox1, или как он там у тебя именован.
VB.NET
1
2
3
4
5
For Each c As CheckBox In GroupBox1.Controls.OfType(Of CheckBox)()
      If c.Tag = i Then
         c.Checked = True
      End If
Next
0
Почетный модератор
 Аватар для Памирыч
23251 / 9163 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
17.03.2015, 06:17
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Я бы сделал так. В свойстве Tag каждой кнопки пишу 1, 2 или 3 в зависимости от того, каким групбоксом она управляет. И код
VB.NET
1
2
3
4
5
    Private Sub Button1_Click(ByVal sender As Button, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, Button3.Click
        For Each c As CheckBox In Controls("GroupBox" & sender.Tag).Controls()
            c.Checked = True
        Next
    End Sub
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
17.03.2015, 06:28
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Рекурсивный подход, работающий с любым количеством элементов управления любой вложенности.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
Sub CheckControl(ByVal ctrl As Control)
    For Each c As Control In ctrl.Controls
        ' Обойти снова
        If с.Controls.Count > 0 Then
            CheckControl(c)
        End If
        ' Проверить, удовлетворяет ли найденный элемент управления какому‐нибудь условию
        If c.Tag = i Then
            c.Checked = True
        End If
    Next
End Sub
0
2 / 2 / 1
Регистрация: 26.02.2015
Сообщений: 25
17.03.2015, 08:52  [ТС]
Памирыч, если в моей проге делать не горизонтальные групбоксы, а вертикальные, то получится не 12 групбоксов (по 20 чекбоксов в каждом), а 40))))) И мне удобней делать строчные элементы, чтобы при ненадобности их можно было легко скрыть. с вертикальным групбоксом так не выйдет. Но за код спасибо))))
0
2 / 2 / 1
Регистрация: 26.02.2015
Сообщений: 25
20.03.2015, 21:12  [ТС]
не получается т.к. Checked не является членом Control =(
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
20.03.2015, 22:10
Тогда так. Вызвать CheckControl(Me, "Нужный тег")
VB.NET
1
2
3
4
5
6
7
8
9
Sub CheckControl(ByVal ctrl As Control, ByVal sTag As String)
    For Each c As Control In ctrl.Controls
        ' Обойти снова
        CheckControl(c, sTag)
    Next
    For Each с In From cb In ctrl Where TypeOf cb Is CheckBox AndAlso cb.Tag = sTag Select cb
        с.Checked = True
    Next
End Sub
Добавлено через 21 минуту
Шестая строка должна быть такая
VB.NET
1
For Each с In From cb In ctrl.Controls Where TypeOf cb Is CheckBox AndAlso cb.Tag = sTag Select cb
1
2 / 2 / 1
Регистрация: 26.02.2015
Сообщений: 25
20.03.2015, 23:03  [ТС]
Я сделал так))
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub SelStr(i As Integer)
     For Each c As CheckBox In GroupBox1.Controls.OfType(Of CheckBox)()
         If c.Tag = i Then
             If c.Checked = True Then
                c.Checked = False
             Else
                 c.Checked = True
             End If
         End If
     Next
     'и так для оставшихся 11-ти групбоксов
 End Sub
Но т.к. в моей программе 12 групбоксов по 20 чекбоксов с кучей кнопок (которые вызывают событие SelStr для определённых значений Tag), случается так, что по нажатию главной кнопки, обрабатывающей все чекбоксы, значения True и False инвертируются. А я хочу задать условие, что если есть хотя бы один положительный чекбокс, то при нажатии на главную кнопку все отр. чекбоксы становятся положительными. А дальше по нажатию этой кнопки все положительные становятся отрицательными. Но я ума не приложу как задать такое условие
0
27 / 27 / 9
Регистрация: 19.08.2014
Сообщений: 77
20.03.2015, 23:53
VB.NET
1
2
3
4
5
If c.Checked = True Then
     c.Checked = False
Else
     c.Checked = True
End If
Можно заменить на:
VB.NET
1
c.Checked = Not c.Checked
Добавлено через 18 минут
Ага... Только я текст под кодом не прочитал. Код писать лень, надеюсь, что справишься. Я бы сделал это в 2 цикла. 1-й цикл проверяет c.Checked. Если попадается False, то выходим из цикла и запускаем 2-й и присваиваем всем c.Checked=True. Если в первом цикле мы дошли до конца и не нашли ни одного False (а это значит, что все True, то есть выделены), то запускаем второй цикл и в нем присваиваем всем c.Checked=False.
1
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
21.03.2015, 02:59
koffe09, если какой‐то код встречается больше одного раза, его нужно вынести в функцию. Не нужно плодить копипасту.
0
2 / 2 / 1
Регистрация: 26.02.2015
Сообщений: 25
21.03.2015, 20:34  [ТС]
не могу понять(( Говоришь сделал бы два цикла, а написал так, будто второй цикл - это два разных. То есть всего три..

Добавлено через 1 час 44 минуты
TigerHawk, не, не получается, помоги пожалуйста. Как не кручу циклы, фигня выходит..
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
21.03.2015, 21:55
Как‐то так.
Нужно одна коллекция и пара функций.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Private colCheckBoxes As New List(Of CheckBox)
 
Public Function CheckControls(ByVal ctrl As Control)As Boolean
    For Each c As Control In ctrl.Controls
        If CheckControls(c) Then
            Return True
        End If
    Next
    Return Convert.ToBoolean((From cb In ctrl.Controls Where TypeOf cb Is CheckBox AndAlso cb.Checked).Count)
End Function
 
Public Sub GetCheckBoxes(ByVal ctrl As Control)
    For Each c As Control In ctrl.Controls
        GetCheckBoxes(c)
    Next
    Dim f = From cb In ctrl.Controls Where TypeOf cb Is CheckBox AndAlso Not cb.Checked
    colCheckBoxes.AddRange(f.ToArray)
End Sub
А внутри обработчика события Click кнопки
VB.NET
1
2
3
4
5
6
7
8
9
If colCheckBoxes.Count > 0 Then
    For Each c As CheckBox In colCheckBoxes
        c.Checked = Not c.Checked
    Next
Else
    If CheckControls(Me) Then
        GetCheckBoxes(Me)
    End If
End If
Как‐то так.
1
27 / 27 / 9
Регистрация: 19.08.2014
Сообщений: 77
22.03.2015, 00:24
Лучший ответ Сообщение было отмечено koffe09 как решение

Решение

Замабувараев, что-то у меня не работает этот код... Если нет выделенных чекбоксов, то ничего не происходит. А если есть, то ошибка: "Не удалось привести тип объекта "System.Object[]" к типу "System.Collections.Generic.IEnumerable` 1[System.Windows.Forms.CheckBox]"."

koffe09, у меня получилось так:
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
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        CheckStatus(GroupBox1)
    End Sub
 
    Private Sub CheckStatus(ByVal GroupBoxName As GroupBox)
        Dim CheckedAll As Boolean 'Переменная отображающая статус всех чекбоксов. 
 
        For Each c In GroupBox1.Controls
            If c.Checked = True Then 'Если чекбокс выделен, то CheckedAll = True и проверяем следующий
                CheckedAll = True
            Else 'Если чекбокс не выделен, то CheckedAll = False и выходим из цикла
                CheckedAll = False
                Exit For
            End If
        Next
 
        CheckAll(Not CheckedAll)
    End Sub
 
    Private Sub CheckAll(ByVal Checked As Boolean) 'Ставим или снимаем галки на всех чекбоксах в зависимости от параметра Checked (True или False)
        For Each c In GroupBox1.Controls
            If TypeOf c Is CheckBox Then
                c.Checked = Checked
            End If
        Next
    End Sub
И потом в каждую кнопку пишешь CheckStatus(ИмяКомбоБокса).
1
2 / 2 / 1
Регистрация: 26.02.2015
Сообщений: 25
22.03.2015, 00:57  [ТС]
Круть, работает!) А как сделать так, чтобы по нажатию button1 событие применялось не к групбоксу1, а к части чекбоксов из разных групбоксов, содержащих Tag допустим с 1 до 10? А button2 применял к чекбоксам с Tag от 10 до 20
0
22.03.2015, 01:34

Не по теме:

koffe09, Может хватить "а как, а как", может нужно уже самому подумать?

0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
22.03.2015, 07:17
TigerHawk, не сработало автоматическое приведение типов. В таком случае 16 и 17 строчки нужно заменить на
VB.NET
1
2
3
For Each cb As CheckBox In From cb In ctrl.Controls Where TypeOf cb Is CheckBox AndAlso Not cb.Checked Select cb
    colCheckBoxes.Add(cb)
Next
Добавлено через 14 минут
koffe09, минимальная переделка с тегом, остальные функции не изменялись
VB.NET
1
2
3
4
5
6
7
8
Public Sub GetCheckBoxes(ByVal ctrl As Control, ByVal sTag As String)
    For Each c As Control In ctrl.Controls
        GetCheckBoxes(c, sTag)
    Next
    For Each cb As CheckBox In From с In ctrl.Controls Where TypeOf с Is CheckBox AndAlso Not с.Checked AndAlso с.Tag = sTag Select с
        colCheckBoxes.Add(cb)
    Next
End Sub
И вызвать:
VB.NET
1
GetCheckBoxes(Me, "Какой‐то тег")
0
27 / 27 / 9
Регистрация: 19.08.2014
Сообщений: 77
22.03.2015, 14:41
Замабувараев, либо я не умею копи-пастом пользоваться, либо одно из двух... Но все равно не работает, а если работает, то как-то не правильно.

Добавлено через 12 минут
Цитата Сообщение от koffe09 Посмотреть сообщение
А как сделать так, чтобы по нажатию button1 событие применялось не к групбоксу1, а к части чекбоксов из разных групбоксов, содержащих Tag допустим с 1 до 10? А button2 применял к чекбоксам с Tag от 10 до 20
Что именно не понятно как сделать? И надо ли разные Tag`и? Мне кажется, что удобнее один Tag для чекбоксов, привязанных к одной кнопке. Так его можно сделать любым, хоть слово вписать, в зависимости от того, что требуется.
1
2 / 2 / 1
Регистрация: 26.02.2015
Сообщений: 25
25.03.2015, 04:02  [ТС]
и у меня не работает =(
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Private colCheckBoxes As New List(Of CheckBox)
    Public Function CheckControls(ByVal ctrl As Control) As Boolean
        For Each c As Control In ctrl.Controls
            If CheckControls(c) Then
                Return True
            End If
        Next
        Return Convert.ToBoolean((From cb In ctrl.Controls Where TypeOf cb Is CheckBox AndAlso cb.Checked).Count)
    End Function
 
    Public Sub GetCheckBoxes(ByVal ctrl As Control, ByVal sTag As String)
        For Each c As Control In ctrl.Controls
            GetCheckBoxes(c, sTag)
        Next
        For Each cb As CheckBox In From с In ctrl.Controls Where TypeOf с Is CheckBox AndAlso Not с.Checked AndAlso с.Tag = sTag Select с
            colCheckBoxes.Add(cb)
        Next
    End Sub
Добавлено через 6 часов 3 минуты
Урааааааа!! Я справился с этой проблемой! Всем спасибо! Вот код:

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
    Private Sub CheckAll(ByVal Checked As Boolean, ByVal i As Integer, Optional n As Integer = 0)
        If n = 0 Then
            n = i
        End If
        'Ставим или снимаем галки на всех чекбоксах в зависимости от параметра Checked (True или False)
        If GroupBox1.Visible = True Then
            If GroupBox1.Visible = True Then
                For Each c In GroupBox1.Controls
                    If c.Tag <= n And c.Tag >= i Then
                        If TypeOf c Is CheckBox Then
                            c.Checked = Checked
                        End If
                    End If
                Next
            End If
        End If
        'И так для моих 12 GroupBox
 
    Private Sub CheckStatus(ByVal i As Integer, Optional n As Integer = 0)
        If n = 0 Then
            n = i
        End If
        Dim CheckedAll1 As Boolean
        'И так для 12 CheckedAll
        Dim b As Boolean
        'Переменная отображающая статус всех чекбоксов. 
 
        If GroupBox1.Visible = True Then
            For Each c In GroupBox1.Controls.OfType(Of CheckBox)()
                If c.Tag <= n And c.Tag >= i Then
                    If c.Checked = True Then
                        'Если чекбокс выделен, то CheckedAll = True и проверяем следующий
                        CheckedAll1 = True
                    Else
                        'Если чекбокс не выделен, то CheckedAll = False и выходим из цикла
                        CheckedAll1 = False
                        Exit For
                    End If
                End If
            Next
        End If
        'Так для 12 GroupBox и 12 CheckedAll
 
        If CheckedAll1 = False And GroupBox1.Visible = True Then
            CheckedAll1 = b
            CheckAll(Not b, i, n)
            Exit Sub
        'Так для 12 CheckedAll через Else If
        Else
            b = True
            CheckAll(Not b, i, n)
            Exit Sub
        End If
    End Sub
 
    Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
        'Вызов функции. В скобках указывается диапазон значений Tag
        CheckStatus1(3, 4)
    End Sub
P.S. Получается много повторяющегося кода (который я удалил для форума) с меняющимися GroupBox(от 1 до 12) и CheckedAll(от 1 до 12), но я не понимаю как его (код) сократить
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.03.2015, 04:02
Помогаю со студенческими работами здесь

GroupBox и CheckBox
хочу сделать так чтобы CheckBox которые были помещенны в GroupBox, не могли выбираться больше двух. То есть, по нажатию на кнопку...

Поиск CheckBox в GroupBox
Здравствуйте!!! Ребята подскажите как правильно. Мне нужно просканировать 13 чекбоксов в групбоксе на предмет установления галочек и...

Groupbox, Checkbox, Radiobutton
Добрый вечер. Заранее извиняюсь за глупые вопросы, я только в начале пути. Нужно сделать простую программку, в которой выбираются пункты и...

Обратиться к нескольким TextBox, принадлежащим одному GroupBox
Здравствуйте, уважаемые форумчане!!!! Помогите пожалуйста с задачкой: На форме есть группбоксы. В них есть текстбоксы. Группбоксы и...

Круглый checkBox в заголовке groupBox
Добрый день, Заголовок groupBox можно сделать с checkBox-ом, а как этот checkBox сделать круглым как radioButton??? он мне по стилю не...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru