Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
0 / 0 / 1
Регистрация: 29.06.2013
Сообщений: 13
1
.NET 4.x

Одно событие для многих объектов

21.03.2014, 00:29. Показов 3127. Ответов 28
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. C# приложение WPF

Есть 16 меток, при нажати на определённую метку происходит событие отображающее нажатие этой метки.
Всё работает. Только я думаю что это неправильно, особенно когда представлю такой случай, когда будет 50 меток.
Подскажите как укоротить код, или способ, или где почитать.
C#
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
//Нажимаем кнопку
private void L1_MouseUp(object sender, MouseButtonEventArgs e)
        {
            CounterClik(1);
        }
//И таких 16 штук.....................................................
        private void L16_MouseUp(object sender, MouseButtonEventArgs e)
        {
            CounterClik(16);
        }
//События
public void CounterClik(int x)
        {
            if (x == 1) L1.Content = Setka[1 - 1];
            if (x == 2) L2.Content = Setka[2 - 1];
            if (x == 3) L3.Content = Setka[3 - 1];
            if (x == 4) L4.Content = Setka[4 - 1];
            if (x == 5) L5.Content = Setka[5 - 1];
            if (x == 6) L6.Content = Setka[6 - 1];
            if (x == 7) L7.Content = Setka[7 - 1];
            if (x == 8) L8.Content = Setka[8 - 1];
            if (x == 9) L9.Content = Setka[9 - 1];
            if (x == 10) L10.Content = Setka[10 - 1];
            if (x == 11) L11.Content = Setka[11 - 1];
            if (x == 12) L12.Content = Setka[12 - 1];
            if (x == 13) L13.Content = Setka[13 - 1];
            if (x == 14) L14.Content = Setka[14 - 1];
            if (x == 15) L15.Content = Setka[15 - 1];
            if (x == 16) L16.Content = Setka[16 - 1];
            Counter++;
            if (Counter == 2)
            {
                aTimer = new DispatcherTimer();
                aTimer.Tick += new EventHandler(OnTimedEvent);
                aTimer.Interval = new TimeSpan(0, 0, 0, 0, 500);
                aTimer.Start();
             }
        }
Спасибо за внимание. Сильно не пинайте, я только учусь.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.03.2014, 00:29
Ответы с готовыми решениями:

Одно событие для многих объектов. Как отловить?
День добрый! На форме 30 panel, в каждой есть TableLayoutPanel в которой уже есть 40 Label. В...

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

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

Одно событие для группы textbox
Здравствуйте! На форме у меня есть 10 textbox-тов в 8 из них нужно вводить только цифры. Суть...

28
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
21.03.2014, 00:58 2
Прогоните цикл, в котором к каждой метке подключите один и тот же обработчик.

Добавлено через 14 минут
Вот. Форма и много лейблов...
C#
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace name_ik
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.Load+=new EventHandler(Form1_Load);
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            foreach (Control c in this.Controls)
            {
                if(c is Label)
                    c.Click += new EventHandler(LabelClick);
            }
        }
        private void LabelClick(object sender,EventArgs e)
        {
            MessageBox.Show("Нажат элемент: " + ((Label)sender).Name);
        }
    }
}
1
59 / 8 / 5
Регистрация: 30.01.2014
Сообщений: 41
21.03.2014, 01:18 3
Делается все на много проще!
Содаешь 1 событие:
C#
1
2
3
4
private void L1_MouseUp(object sender, MouseButtonEventArgs e)
        {
            CounterClik(((Label)sender).Tag);
        }
Вешаешь это событие на все лейблы (в свойствах на событие не клацаешь 2 раза, а выбираешь из уже созданых именно это событие)
В поле тег записываешь значение от 1 до сколько там их будет.

И состовляешь фуцию которая принимает цыфру из тега

Если контролов будет много, перебор всех будет очень долго и не правильно!

Добавлено через 1 минуту
Если контролы создаются в коде, вешаешь на него то же событие только в коде...
1
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
21.03.2014, 01:26 4
Ну не знаю, проще или нет, но вот даже мне было бы лень разбираться во всем этом, что куда добавить и так далее. Намного проще и наглядней написать несколько строк кода, и вуаля - все работает.
Ну и не думаю, что у ТС будет несколько тысяч лейблов. А с несколькими десятками никаких проблем не будет.
(PS. Если что-то выбирается в свойствах дизайнера и меняется, это не значит, что в коде этого нет... Код тоже будет, так что выигрыш вряд ли такой заметный...).
0
59 / 8 / 5
Регистрация: 30.01.2014
Сообщений: 41
21.03.2014, 01:47 5
Перебирать все контролы, что бы повесить на него событие, это програмно не правильно, не красиво и не лаконично! Так делать можно - но не нужно!
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
21.03.2014, 01:53 6
Ну а как, по Вашему, правильно? Поменять все свойства, с тем чтобы потом (тому, кто возможно будет разбираться в этом коде, или самому разработчику через полгода - год) ломать всю голову, что и где он изменил? Это, по вашему, правильно?
И да, о лаконичности - на мой взгляд, мое решение лаконичнее (в плане размера кода). Разница только в том, что код Вашего варианта скрыт в дизайнере, но он все равно есть. Так в чем разница?
0
59 / 8 / 5
Регистрация: 30.01.2014
Сообщений: 41
21.03.2014, 02:38 7
Цитата Сообщение от insite2012 Посмотреть сообщение
Поменять все свойства, с тем чтобы потом ломать всю голову
В событиях обозначается привязаная ф-ция, и совсем не обязательно лесть в код дизайнера что бы ее увидеть, там только делегат который вызывает эту ф-цию и поле Тег где находится думаю понятно всем.
Но проходить все контролы, увы!

Добавлено через 21 минуту
А давайте визуальные компоненты создавать сразу в коде, а зачем потом код искать где то еще? И классы делать в одном файле. Все на виду, все под рукой!
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
21.03.2014, 02:48 8
Цитата Сообщение от VideoSharp Посмотреть сообщение
А давайте визуальные компоненты создавать сразу в коде, а зачем потом код искать где то еще?
а что в этом такого? Только больной на голову человек будет создавать больше 5 однотипных контролов в дизайнере.

Добавлено через 41 секунду
name_ik, а чем datagrid не устроил?..
2
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
21.03.2014, 02:53 9
Цитата Сообщение от VideoSharp Посмотреть сообщение
А давайте визуальные компоненты создавать сразу в коде, а зачем потом код искать где то еще? И классы делать в одном файле. Все на виду, все под рукой!
Так почему бы и нет, если это соответствует ситуации.
Не знаю у кого как, а у меня именно такая привычка - и обработчики приписывать ручками (а не щелчками), и свойства, ну и все остальное, по возможности. Хорошо это или плохо - не буду судить, но на мой взгляд, так нагляднее.
ну и по сути вопроса, делая что-то через дизайнер, как я уже сказал - это не значит что кода не будет. Он есть. Может, пооптимальнее, что сделан руками, но будет в любом случае. Но написанное вручную намного нагляднее, и плюс к тому - заставляет понять, что именно ты делаешь, а не просто к тупым щелчкам по контролам и копанием в куче свойств этих самых контролов...

Добавлено через 3 минуты
Цитата Сообщение от Psilon Посмотреть сообщение
а что в этом такого? Только больной на голову человек будет создавать больше 5 однотипных контролов в дизайнере.
Полностью согласен. 2, 3, ну 4 еще куда ни шло... Но если ты кидаешь несколько десятков лейблов (баттонов) на форму, то именно самое оптимальное - сделать это кодом через цикл. И тут сам Бог велел подключить сразу и обработчики, а не мудрить с тэгами и всем остальным...
0
59 / 8 / 5
Регистрация: 30.01.2014
Сообщений: 41
21.03.2014, 03:00 10
Цитата Сообщение от insite2012 Посмотреть сообщение
у меня именно такая привычка - и обработчики приписывать ручками (а не щелчками), и свойства, ну и все остальное, по возможности. Хорошо это или плохо - не буду судить, но на мой взгляд, так нагляднее.
это мусорный код, для того его убирают в файл дизайна, что бы он не смешивался с основным кодом.
Да он есть, но его не обязательно видеть всегда!

Добавлено через 2 минуты
Цитата Сообщение от Psilon Посмотреть сообщение
а что в этом такого?
Я имел ввиду абсолютно все компоненты, а в общем тут ничего такого, иногда даже необходимо создать компонент в ходе выполнения.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
21.03.2014, 03:01 11
VideoSharp,
это мусорный код, для того его убирают в файл дизайна, что бы он не смешивался с основным кодом.
а что, кто-то хранит в форме код, который не относится к дизайну, то есть бизнес-логику?

Добавлено через 24 секунды
Я имел ввиду абсолютно все компоненты, а в общем тут ничего такого, иногда даже необходимо создать компонент в ходе выполнения.
и это как раз данный случай
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
21.03.2014, 03:02 12
Цитата Сообщение от VideoSharp Посмотреть сообщение
это мусорный код
Это как это "мусорный"? А может это просто сделано для упрощения жизни некоторых кодеров, которым лень писать код вручную? Да, если очень большой опыт, то этим можно пользоваться, не спорю. Но если опыт еще не богатый, а желание его получить и расширить есть - написание кода именно вручную то что надо.
0
59 / 8 / 5
Регистрация: 30.01.2014
Сообщений: 41
21.03.2014, 03:06 13
Цитата Сообщение от insite2012 Посмотреть сообщение
если ты кидаешь несколько десятков лейблов (баттонов) на форму, то именно самое оптимальное - сделать это кодом через цикл
да эсли заранее не известно сколько должно быть "батонов" и если их кидать в массив элемента управления например TableLayoutPanel, тогда и правда лучше создать в коде... но когда размещать все элементы на форму, а потом в коде что-то доковыривать.. это уже по Молдавски
0
0 / 0 / 1
Регистрация: 29.06.2013
Сообщений: 13
21.03.2014, 03:20  [ТС] 14
Цитата Сообщение от insite2012 Посмотреть сообщение
Прогоните цикл, в котором к каждой метке подключите один и тот же обработчик.
Добавлено через 14 минут
Вот. Форма и много лейблов...
Попробовал, работает интересно, правда к себе ещё не подставил пока.
Только как быть с Label которые в этом деле не должны учавствовать (Статические метки, заголовки и тд.)?
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
21.03.2014, 03:25 15
name_ik, создавайте лейблы тоже в коде.
0
0 / 0 / 1
Регистрация: 29.06.2013
Сообщений: 13
21.03.2014, 03:27  [ТС] 16
Цитата Сообщение от Psilon Посмотреть сообщение
name_ik, а чем datagrid не устроил?..
Ещё эту тему не выучил. Учу массивы, вот и придумал задачку себе: рандомно заполнить поле 4х4 из массива 50 размера и поугадывать...
0
59 / 8 / 5
Регистрация: 30.01.2014
Сообщений: 41
21.03.2014, 03:31 17
Цитата Сообщение от name_ik Посмотреть сообщение
Только как быть с Label которые в этом деле не должны учавствовать
Еще одна причина вешать событие непосредственно на конкретные Label
0
0 / 0 / 1
Регистрация: 29.06.2013
Сообщений: 13
21.03.2014, 03:38  [ТС] 18
Psilon,
Цитата Сообщение от Psilon Посмотреть сообщение
name_ik, создавайте лейблы тоже в коде.
Я понимаю, что это идея хорошая, некоторые вещи пытаюсь создавать в коде. Но... может я конечно что то не так делаю...
Програмиирую в WPF
Поле у меня состоит из Grid, я с него сделал "Сетку", потом в "ячейки" поместил Viewbox, а в них уже Label.
Некоторые свойства я смогу прописать, а вот эту пирамиду даже пока и не заморачивался...

Может я что то не правильно делаю, я ВСЕМ благодарен за помощь.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
21.03.2014, 03:53 19
name_ik, вообще это все костыли. Почитайте про DataGrid и даже заполнение его по индексам будет лучше, чем извращаться со 100500 контролами. А уж если с байдингом разберетсь, так вообще молодец.
1
912 / 672 / 134
Регистрация: 01.03.2010
Сообщений: 1,273
21.03.2014, 07:55 20
name_ik,
Если так нужно, то можно и ваш подход автоматизировать.
Одно условие. Все нужные Label, для отличия от других, называть определенным образом - приставка и номер через черту.
Например, в моем примере это lbl_1, lbl_2 и т.д. Сколько угодно.
Тогда можно сделать так:
C#
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
        public Form1()
        {
            InitializeComponent();
            ListLbl();
        }
 
        List<Label> lbl = new List<Label>();
 
        private void ListLbl() // создание списка нужных Label
        {
            foreach (Control ctrl in Controls)         
                if (ctrl is Label && (ctrl as Label).Name.Split('_').First() == "lbl")
                {
                    lbl.Add(ctrl as Label);
                    (ctrl as Label).Click += new EventHandler(Lbl_Click);
                }
        }
 
        private void Lbl_Click(object sender, EventArgs e) // что делать при клике по Label
        {
            //номер нажатой label
            int numLbl = Convert.ToInt32 ((sender as Label).Name.Split('_').ElementAt(1));
 
            // действие
            (sender as Label).Content = Setka[numLbl - 1];            
        }
    }
Писал на форме, поэтому Content здесь конечно не к месту.
1
21.03.2014, 07:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.03.2014, 07:55
Помогаю со студенческими работами здесь

Одно событие для нескольких ComboBox
У меня маленькая проблемка. На форме, сделанной в Excel, у меня динамически создаются ComboBox и...

Одно событие для разных действий
Подскажите, пожалуйста) Не могу четко сформулировать, поэтому не могу найти нужного ответа. У меня...

Одно событие для множества компонентов
На форме несколько edit'ов, несколько checkbox'ов и кнопка. Нужно сделать так, чтобы при изменении...

Одно событие для нескольких элементов управления
добрый день. имеется форма с 19 textBox. необходимо реализовать навигацию между ними с помощью...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru