Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
41 / 13 / 4
Регистрация: 22.07.2013
Сообщений: 145

Оптимизация кода

14.08.2016, 21:55. Показов 1797. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте господа. Помогите привести свой ГК к божескому виду. Если вкратце: На форме есть несколько (23) разных pictureBox-ов при наведении на которые должен выполняться один метод но с разными аргументами.

Метод один и его трогать не нужно. Он только принимает аргументы от разных контролов.
C#
1
2
3
4
  public void pb_MouseHover(Control pictureBox, string a)
        {
            /**/
        }

А можно ли как то сократить вот этот код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 private void pictureBox1_MouseHover(object sender, EventArgs e)
        {
            pb_MouseHover(pictureBox1, "Сообщение 1");
 
        }
private void pictureBox2_MouseHover(object sender, EventArgs e)
        {
            pb_MouseHover(pictureBox2, "Сообщение 2");
 
        }
private void pictureBox3_MouseHover(object sender, EventArgs e)
        {
            pb_MouseHover(pictureBox3, "Сообщение 3");
 
        }
и т.д.
Нет желания плодить сотню обработчиков. Спасибо.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.08.2016, 21:55
Ответы с готовыми решениями:

Оптимизация кода на C#
Здравствуйте уважаемые господа. Использую WinForms, webbrowser. Написал программу, всё нормально работает. Я создал отдельный...

Оптимизация кода
Добрый вечер, требуется проверка нескольких полей на пустоту, можно ли как то всю эту проверку сократить. if...

Оптимизация кода
Всем привет написал простую программу, в которой две кнопки запускают / останавливают два таймера. Вопрос как можно оптимизировать код?...

10
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
14.08.2016, 22:10
Цитата Сообщение от Sergei12 Посмотреть сообщение
можно ли как то сократить вот этот код:
Можно, почему бы и нет. Все пикчеры повесить на один обработчик. Но естественно, в самом обработчике пикчеры придется как-то различать (например, по имени) для передачи в метод нужного аргумента.
Да, еще можно предварительно создать словарь, с аргументами, и из него их вытаскивать по имени пикчера, тогда и много ветвлений не понадобится.
1
41 / 13 / 4
Регистрация: 22.07.2013
Сообщений: 145
14.08.2016, 22:12  [ТС]
Не поделитесь ссылкой на пример ?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
14.08.2016, 22:22
Цитата Сообщение от Sergei12 Посмотреть сообщение
Не поделитесь ссылкой на пример ?
Да вот накидал за пару минут, примерно такой вариант.
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
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 WindowsFormsApplication3 {
    public partial class Form1 : Form {
        Dictionary<string, string> messageArgs = new Dictionary<string, string>();
        public Form1() {
            InitializeComponent();
 
            messageArgs.Add("pb1", "Message 1");
            messageArgs.Add("pb2", "Message 2");
            messageArgs.Add("pb3", "Message 3");
            messageArgs.Add("pb4", "Message 4");
 
            foreach (PictureBox pb in this.Controls.OfType<PictureBox>()) {
                pb.MouseHover += new EventHandler(pb_MouseHover);
            }
        }
 
        void pb_MouseHover(object sender, EventArgs e) {
            string arg = messageArgs[(sender as PictureBox).Name];
            Method(sender as PictureBox, arg);
        }
        void Method(PictureBox pb, string message) {
            MessageBox.Show(pb.Name, message);
        }
    }
}
Добавлено через 1 минуту
Да, в моем примере на форме 4 пикчера, с именами pb1, pb2, pb3, pb4. Вы сделайте как вам надо, соответственно заполнив словарь нужными данными.
1
41 / 13 / 4
Регистрация: 22.07.2013
Сообщений: 145
16.08.2016, 21:16  [ТС]
Извините не понял - как lable присвоить text "messege1" или "messege2" ?
А вот это вообще не понятно:
C#
1
2
3
4
5
 
        void pb_MouseHover(object sender, EventArgs e) {
            string arg = messageArgs[(sender as PictureBox).Name];
            Method(sender as PictureBox, arg);
        }
Добавлено через 3 минуты
Откуда берется Name? Это pb1 в
C#
1
            messageArgs.Add("pb1", "Message 1");
Добавлено через 2 минуты
Выдает ошибку - данный ключ отсутствует в словаре

Добавлено через 1 минуту

Добавлено через 25 минут
В принципе со всем разобрался, но ошибка все равно осталась :

Необработанное исключение типа "System.Collections.Generic.KeyNotFoundE xception" в mscorlib.dll

Дополнительные сведения: Данный ключ отсутствует в словаре.
0
Заблокирован
16.08.2016, 21:21
Цитата Сообщение от Sergei12 Посмотреть сообщение
В принципе со всем разобрался, но ошибка все равно осталась :
Sergei12, Значит не разобрались. .Name это свойство, которое отвечает за название вашего PictureBox. Чтобы не было подобных "ошибок", заполняйте словарь в том цикле, где подписываетесь на событие.
1
41 / 13 / 4
Регистрация: 22.07.2013
Сообщений: 145
17.08.2016, 06:56  [ТС]
т.е. так :
C#
1
2
3
4
5
6
7
 foreach (PictureBox pb in this.Controls.OfType<PictureBox>())
            {
                messageArgs.Add("pb1", "Messege1");
                messageArgs.Add("pb2", "Messege2");
                messageArgs.Add("pb3", "Messege3");
                pb.MouseHover += new EventHandler(pb_MouseHover);
                            }
?
Тогда отладчик выдает: Необработанное исключение типа "System.ArgumentException" в mscorlib.dll

Добавлено через 1 час 1 минуту
Если инициализировать словарь так -
C#
1
2
3
4
5
6
 Dictionary<string, string> messageArgs = new Dictionary<string, string> { 
        {"pb1", "Messege1"},
        {"pb2", "Messege2"},
        {"pb3", "Messege3"}
            
        };
то все та же ошибка - Необработанное исключение типа "System.Collections.Generic.KeyNotFoundE xception" в mscorlib.dll

Дополнительные сведения: Данный ключ отсутствует в словаре.

Добавлено через 8 часов 24 минуты
Подскажите, что не правильно? Спасибо.
0
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
17.08.2016, 08:25
Цитата Сообщение от Sergei12 Посмотреть сообщение
т.е. так :
Нет, скорее так:
C#
1
2
3
4
5
foreach (PictureBox pb in this.Controls.OfType<PictureBox>())
            {
                messageArgs.Add(pb.Name, "Messege1");
                pb.MouseHover += new EventHandler(pb_MouseHover);
                            }
1
41 / 13 / 4
Регистрация: 22.07.2013
Сообщений: 145
17.08.2016, 21:47  [ТС]
C#
1
                messageArgs.Add(pb.Name, "Messege1");
Здесь pb имя picBox а или это все заполнение и есть?

Добавлено через 37 минут
Поясните пожалуйста эту строчку.
Зачем здесь :
C#
1
pb.Name
?
И как вообще нужно заполнять словарь? Несколько вариантов в инете нашел и все равно ошибки или не работает.
Спасибо.

Добавлено через 2 часа 1 минуту
Не могу найти ошибку в коде. С виду все правильно.
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
 public partial class Levels : Form
    {
        Dictionary<string, string> messageArgs = new Dictionary<string, string>();
public form1()
        {
            InitializeComponent();
            messageArgs.Add("pp1", "mess");
            messageArgs.Add("pp2", "sdsdf");
            messageArgs.Add("pp3", "wwdsf"); 
 
           foreach (PictureBox pb in this.Controls.OfType<PictureBox>())
            {
                pb.MouseHover += new EventHandler(pb_MouseHover);
                        }
}
void pb_MouseHover(object sender, EventArgs e)
        {
            string arg = messageArgs[(sender as PictureBox).Name];
            Method(sender as PictureBox, arg);
                    }
 
        void Method(PictureBox pb, string message)
        {
            label1.Text = message;
        }
При подводе мышки к боксу текст label1 не меняется а после отвода сам label1 исчезает. При наведении на совершенно другой бокс (не отмеченный в словаре) выпадает ошибка -

Необработанное исключение типа "System.Collections.Generic.KeyNotFoundE xception" в mscorlib.dll

Дополнительные сведения: Данный ключ отсутствует в словаре.
Что же не так?

Добавлено через 29 минут
Оказывается проблема вот в чем - все picBox'ы находятся внутри GroupBox'а и поэтому при наведении на них ничего не происходит, но если вывести их за пределы области GroupBox'а то обработчик срабатывает.
Подскажите как сделать, что бы код работал если картинка находится внутри GroupBox'а и можно ли вообще?
0
Заблокирован
17.08.2016, 22:36
Лучший ответ Сообщение было отмечено Sergei12 как решение

Решение

Цитата Сообщение от Sergei12 Посмотреть сообщение
Подскажите как сделать, что бы код работал если картинка находится внутри GroupBox'а и можно ли вообще?
Sergei12, ну так перебирайте контролы внутри groupBox:

C#
1
foreach (PictureBox pb in groupBox1.Controls.OfType<PictureBox>())
1
41 / 13 / 4
Регистрация: 22.07.2013
Сообщений: 145
17.08.2016, 23:00  [ТС]
Спасибо! Больше вопросов не имею)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.08.2016, 23:00
Помогаю со студенческими работами здесь

Оптимизация кода
Есть код, который проверяет дерево на связность и говорит, будет ли эта фигура деревом если удалить цикл. Lib.graph.CycleSearchStack(); ...

Оптимизация кода(?)
В общем суть: программа считывает txt файл и записывает его в таблицу на SQL сервере. В txt файле 46 тысяч строк, заполнение таблицы...

Оптимизация кода
Здравствуйте, заранее прошу прощения за столь неординарный вопрос, но вот есть задание &quot;Реализовать при помощи паттерна Абстрактная...

Оптимизация кода(Наблюдатель)
Здравствуйте, хотел задаться таким неординарным вопросом. Есть задание(фото присутствует) смысл в изучении паттерна &quot;Наблюдатель&quot;...

Оптимизация кода. Авторизация в программе
Помогите оптимизировать код убрать все лишнее может можно это все сделать по легче... private void button1_Click(object sender,...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru