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

Одно событие для многих объектов. Как отловить?

03.09.2018, 12:48. Показов 3139. Ответов 31

Студворк — интернет-сервис помощи студентам
День добрый!
На форме 30 panel, в каждой есть TableLayoutPanel в которой уже есть 40 Label. В общей сложности получается рабочих лейблов 1200. Имена у них идут не по порядку (так как на форме помимо этих есть еще и другие).
Вот возник вопрос: как отловить клик мышкой именно на тех лейблах, которые находятся в TableLayoutPanel?
Можно сделать так:
VB.NET
1
2
3
    Private Sub Label1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Label1.MouseClick, Label2.MouseClick
        MsgBox("OK!")
End Sub
Но перечислять все 1200 имен - думаю это маразм.

Еще пробовал делать так (в Form1_Load):
VB.NET
1
2
3
4
For Each Lbl As Control In TableLayoutPanel1.Controls
        AddHandler Lbl.Click, AddressOf Lbl_Msg
        TableLayoutPanel1.Controls.Add(Lbl)
        Next
VB.NET
1
2
3
Private Sub Lbl_Msg()
        MsgBox("OK!")
    End Sub
Но что-то не срабатывает. Подскажите как отловить клик?
Миниатюры
Одно событие для многих объектов. Как отловить?  
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.09.2018, 12:48
Ответы с готовыми решениями:

Одно событие для многих объектов
Здравствуйте. C# приложение WPF Есть 16 меток, при нажати на определённую метку происходит событие отображающее нажатие этой метки. ...

Одно событие для многих элементов
Есть форма, на ней много элементов numericUpDown. Т.к изначально очистить numericUpDown нельзя, мне нужно, чтобы когда элемент становился...

Одно событие для многих обьектов
Как можно сделать одно событие для многих обьектов тима image.мне нужно чтобы если image отпустили в определенном участке формы происходило...

31
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
03.09.2018, 13:29
Сигнатура Lbl_Msg не соответствует сигнатуре события Click
Зачем опять добавляешь Lbl?
Тут целесообразно использовать UserControl, в который вынести TableLayoutPanel со всем содержимым.
1
4708 / 3661 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
03.09.2018, 13:43
Цитата Сообщение от zhigalkin_p Посмотреть сообщение
На форме 30 panel, в каждой есть TableLayoutPanel в которой уже есть 40 Label. В общей сложности получается рабочих лейблов 1200.
Может, что-то в консерватории подправить?
0
1 / 1 / 0
Регистрация: 26.10.2017
Сообщений: 108
03.09.2018, 13:47  [ТС]
Цитата Сообщение от ovva Посмотреть сообщение
Может, что-то в консерватории подправить?
Никак нельзя. Их именно столько и будет.
Цитата Сообщение от ViterAlex Посмотреть сообщение
Тут целесообразно использовать UserControl, в который вынести TableLayoutPanel со всем содержимым.
То есть из TableLayoutPanel создать UserControl? Как с ним потом работать? Я, можно сказать недавно перешел на vb.net.
0
4708 / 3661 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
03.09.2018, 14:10
Тогда м.б. так
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub Form7_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    For Each tlp As Control In Me.Controls
        If TypeOf tlp Is TableLayoutPanel Then
            For Each Lbl As Control In tlp.Controls
                If TypeOf Lbl Is Label Then AddHandler Lbl.Click, AddressOf Lbl_Msg
            Next
        End If
    Next
End Sub
Private Sub Lbl_Msg()
    MsgBox("OK!")
End Sub
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
03.09.2018, 15:12
Цитата Сообщение от ovva Посмотреть сообщение
Тогда м.б. так...
Обратите внимание на
Цитата Сообщение от ViterAlex Посмотреть сообщение
Сигнатура Lbl_Msg не соответствует сигнатуре события Click
По моему, в таком виде работать не будет
0
1 / 1 / 0
Регистрация: 26.10.2017
Сообщений: 108
03.09.2018, 15:14  [ТС]
Неа, не работает
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
03.09.2018, 15:20
Надо так:
VB.NET
1
2
3
    Private Sub Lbl_Msg(sender As Label, e As EventArgs)
        MsgBox("Метка " + sender.Name + vbCrLf + "OK!")
    End Sub
Добавлено через 1 минуту
Цитата Сообщение от zhigalkin_p Посмотреть сообщение
Неа, не работает
Что не работает? Какую ошибку выдаёт?
0
1 / 1 / 0
Регистрация: 26.10.2017
Сообщений: 108
03.09.2018, 15:23  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Что не работает? Какую ошибку выдаёт?
Никакую. Просто ничего, как-будто кода нет.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
03.09.2018, 15:29
Вроде, должна быть ещё возможность обрабатывать Click не на уровне Label, а на уровне TableLayoutPanel.

Добавлено через 51 секунду
Цитата Сообщение от zhigalkin_p Посмотреть сообщение
Никакую. Просто ничего, как-будто кода нет.
Сигнатуру обработчика Lbl_Msg поменяли?

Добавлено через 1 минуту
Проверьте в отладчике происходит подсоединение обработчика Click или нет.

Добавлено через 2 минуты
Если обработчик не подсоединяется, проверьте в отладчике циклы в Form7_Load - доходит работа кода до AddHandler... или нет.
0
4708 / 3661 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
03.09.2018, 15:31
Цитата Сообщение от zhigalkin_p Посмотреть сообщение
Неа, не работает
У меня так все работает, в соответствии с заказанным. При клике на Label в TableLayoutPanel имеем Ok.
Миниатюры
Одно событие для многих объектов. Как отловить?  
0
Эксперт .NET
 Аватар для Rius
13127 / 7688 / 1676
Регистрация: 25.05.2015
Сообщений: 23,457
Записей в блоге: 14
03.09.2018, 15:31
Цитата Сообщение от zhigalkin_p Посмотреть сообщение
Никак нельзя. Их именно столько и будет.
Откуда появилась такая чудесная форма? Наследие?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
03.09.2018, 15:36
Как у Вас создаются 30 TableLayoutPanel? Если программно, то возможно Вы их создаёте после события Load Формы и, поэтому, обработчик загрузки Form7_Load их не находит.

Добавлено через 2 минуты
Цитата Сообщение от ovva Посмотреть сообщение
У меня так все работает...
Получается, сигнатуру обработчика соблюдать не обязательно? Не знал этого.
0
1 / 1 / 0
Регистрация: 26.10.2017
Сообщений: 108
03.09.2018, 15:43  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Как у Вас создаются 30 TableLayoutPanel? Если программно, то возможно Вы их создаёте после события Load Формы и, поэтому, обработчик загрузки Form7_Load их не находит.
Нет, они уже там, вставлены вручную в дизайнере.
0
1 / 1 / 0
Регистрация: 26.10.2017
Сообщений: 108
03.09.2018, 15:56  [ТС]
Вот, просто ничего не происходит
Миниатюры
Одно событие для многих объектов. Как отловить?  
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
03.09.2018, 16:02
Цитата Сообщение от zhigalkin_p Посмотреть сообщение
Вот, просто ничего не происходит
Скорее всего обработчик не подсоединяется. Надо смотреть последовательность организации Формы.
Скиньте весь проект.
0
1 / 1 / 0
Регистрация: 26.10.2017
Сообщений: 108
03.09.2018, 16:13  [ТС]
Вот проект на котором тренируюсь. Сильно не ругайтесь, там много мусора.
Вложения
Тип файла: rar Proba.rar (121.6 Кб, 4 просмотров)
0
1 / 1 / 0
Регистрация: 26.10.2017
Сообщений: 108
03.09.2018, 16:34  [ТС]
Забыл сказать, у меня VS 2017
0
 Аватар для ViterAlex
8951 / 4863 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
03.09.2018, 16:42
zhigalkin_p, у тебя TableLayoutPanel находятся не на форме, а внутри GroupBox. Это нужно учитывать. Но лучше вынести всё в UserControl, как ты уже сделал с TableLabel
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16139 / 11263 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
03.09.2018, 16:42
У Вас TableLayoutPanel лежат не в Форме (Form1), а в дочерней панели (Panel1), в GroupBox1. Так же часть Lablel лежит не в TableLayoutPanel, а в TableLable1.
При таких различиях в способах организации элементов у Вас не получится единообразно их обрабатывать. Как то приведите всё к единообразию.
Цикл из решения ovva обрабатывает Lablel лежащие только в TableLayoutPanel, которые в свою очередь лежат непосредственно в родительской форме. У Вас таких нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.09.2018, 16:42
Помогаю со студенческими работами здесь

Как сделать одно событие для нескольких одинаковых объектов с разными индексами
У меня несколько элементов shape с именами Blue1-10, вопрос в том, как создать событие, onMouseDown допустим, но только не для каждого...

Как отловить событие для своего класса?
класс: TSomeClass = class(TObject) procedure OnKeyDown(var Message); message WM_KEYDOWN; end; var C: TSomeClass; begin

Как можно отловить событие что все дочерние вьюхи для моей загружены?
Привет. есть xml вида: <myView .....> <myView1 ..... /> <myView2 ..... /> </myView> собсно когда myView и дочерние...

Как для нескольких компонентов выполнять одно событие
Вообще суть такая: На форме есть 5 кнопок. Я на одну кнопку реализовал код, чтобы когда наводишь курсор на Button он сам в течении 3 сек....

Как сделать одно событие для каждого элемента массива?
Здравствуйте. Есть массив с контролами. А как сделать чтобы при наведении мыши на контрол, который в массиве с ним что-то происходило? Для...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru