Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 07.02.2013
Сообщений: 49

Как уменьшить количество подписок на события

21.02.2015, 19:24. Показов 997. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

Есть форма на которой располагается порядка 1-2 тысячи объектов, к примеру Button. (Вот такое желание заказчика, пока просто тестирование).

Использую:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int Left = 0;
int Top = 0;
for (int cnt = 1; cnt <= 1500; cnt++)
{
    Button button = new Button();
    button.Width = 20;
    button.Height = 20;
    button.Top = Top;
    button.Tag = cnt;
    button.Left = Left;
    //button.Click += new EventHandler(button_Click);
    Controls.Add(button);
    Left += 20;
    if (Left + 20 > Width)
    {
        Left = 0;
        Top += 20;
    }
}
Но если вешаю подписку на событие - время наполнения в 6 раз дольше.
Можно ли сделать единое событие (на самой форме), а потом уже вычислять по координатам клика?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.02.2015, 19:24
Ответы с готовыми решениями:

Зависания формы из-за DataGridView и подписок на события
Добрый день! У меня проблема: зависает форма при интенсивном добавлении строк в DataTable с которым связан DataGridView. На форме...

Как отписаться от подписок удаляемому объекту
Всем привет!) Встретил в инфу, что при удалении экземпляра отменяются подписки на события этого экземпляра. Хотел бы уточнить у знающих,...

Как уменьшить количество строк?
У меня есть следующая менюшка: private void Size_Click(object sender, EventArgs e) { string s = sender.ToString(); ...

9
25 / 25 / 10
Регистрация: 27.11.2011
Сообщений: 272
21.02.2015, 20:10
Делал что то похожее для pictureBox'ов. В качестве аргумента передаем ссылку на функцию которую будет выполнять pictureBox если мы по нему кликнем.
C#
1
2
3
4
5
6
7
8
9
10
public static void CreatePictureControl(Image Img, Panel targetPanel, Action NewFunc)
        {
            PictureBox newPictureBox = new PictureBox();
            newPictureBox.BackgroundImage = Img;
            newPictureBox.Size = new Size(77, 63);
            
            newPictureBox.MouseDoubleClick += (s, e) => { NewFunc(); };
 
            targetPanel.Controls.Add(newPictureBox);
        }
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
21.02.2015, 20:38
Цитата Сообщение от wrun Посмотреть сообщение
Есть форма на которой располагается порядка 1-2 тысячи объектов, к примеру Button
Представляю, как буде тормозить эта форма.
Цитата Сообщение от wrun Посмотреть сообщение
Можно ли сделать единое событие (на самой форме), а потом уже вычислять по координатам клика?
А вы сделайте собственный контрол, нарисуйте на нем кучу кнопок, а при клике будете вычислять на какую кнопку кликнули.
Собственно это единственный способ, кроме клизмы заказчику конечно.
0
1 / 1 / 0
Регистрация: 07.02.2013
Сообщений: 49
21.02.2015, 21:23  [ТС]
Но я ведь это и привел в качестве, примера, у меня как раз в этом проблема - слишком долго идет прорисовка формы, а еще и перерисовывать иногда нужно (((
Событие Click - редкое (относительно кол-ва перерисовки формы), вот и хочу повесить его не на каждый объект, а на всю форму, а потом по координатам искать объект...

Нашел:
C#
1
2
3
static MainWindow() {
    EventManager.RegisterClassHandler(typeof (MainWindow), Mouse.MouseDownEvent, new MouseButtonEventHandler(OnGlobaMouseDown));
}
Но, если честно, не понимаю как воспользоваться
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
21.02.2015, 21:29
Цитата Сообщение от wrun Посмотреть сообщение
Но я ведь это и привел в качестве, примера
Нет, вы не поняли, под "нарисуйте" я имею ввиду в буквальном смысле их рисовать. В OnPaint.
0
25 / 25 / 10
Регистрация: 27.11.2011
Сообщений: 272
22.02.2015, 00:04
wrun, можно получить список всех ваших кнопок на форме, узнать их координаты и занимаемое место, далее отлавливать координаты клика, сверять есть ли в этой обаласти кнопка и если есть, то по ее координатам узнать ее имя, а далее:
C#
1
this.Controls[buttonName].MouseClick += (s, e) => { };
0
1 / 1 / 0
Регистрация: 07.02.2013
Сообщений: 49
22.02.2015, 00:44  [ТС]
Да, примерно так я и думал, но как реализовать прослушку кликов? Если на Form повесить, то при нажатии на button - нет реакции, а как сделать "прозрачную" прослушку?
0
25 / 25 / 10
Регистрация: 27.11.2011
Сообщений: 272
22.02.2015, 01:26
wrun, Ну как то так:
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
public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
            groupBox1.MouseLeave += (s, e) =>
            {
                label1.Text = IsTrue.IsTr(groupBox1, Cursor.Position);
            };
 
            groupBox1.MouseEnter += (s, e) => { label1.Text = "label1"; };
        }
 
        static class IsTrue
        {
           static public string IsTr(GroupBox groupBox, Point point)
            {
                var grb = groupBox.Controls;
 
                foreach (Control c in grb)
                {
                    if(point.X >= c.Location.X & point.X < c.Location.X + c.Size.Width)
                        if (point.Y >= c.Location.Y & point.Y < c.Location.Y + c.Size.Height)
                        {
                            return c.Name;
                        } 
                }
                return "nothing";
            }
        }
    }
Правда метод проверки координат чет не работает но суть понятна.

Добавлено через 18 минут
В случае с формой работать будет, а вот с груп боксом надо пошаманить)
0
1 / 1 / 0
Регистрация: 07.02.2013
Сообщений: 49
22.02.2015, 23:56  [ТС]
Тоже думал о таком, логичное решение, но блин, ведь пользователь крутит мышью от задумчивости, а кликает при необходимости. Получаются лишние вычисления постоянно. Неужели нет глобальной прослушки всех кликов?? (
0
1167 / 885 / 517
Регистрация: 09.04.2014
Сообщений: 2,095
23.02.2015, 12:25
Цитата Сообщение от wrun Посмотреть сообщение
Но если вешаю подписку на событие - время наполнения в 6 раз дольше.
у меня разница 0,6% а не в 6 раз... Если вы заполняете форму, которая уже окрыта используйте SuspendLayout/ResumeLayout, чтобы она не перерислвывалась при каждом новом контроле
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.02.2015, 12:25
Помогаю со студенческими работами здесь

Как уменьшить количество кода?
Здравствуйте. Имеется костыль код. Этот код делает типа &quot;сколько чисел вместится в одно большое число&quot;. Так, как я с С++ недавно,...

Как уменьшить количество запросов к БД
Здравствуйте, у меня есть цикл который выводит картинки, а alt='' и title='' должны будут выводиться из БД. Я могу только сделать так,...

Как уменьшить количество потребляемой памяти
Написал простенькую консольную програмку с несколькими классами. В диспечере задач она занимает не меньше 11 мб памяти. хотелось бы...

Как уменьшить количество запросов к базе?
есть тема wordrpess с плагином транспортной компании...

Рекурсия, как уменьшить количество вызовов?
Вот написал код все вроде работает, но при каждом новом числе значительно увеличивается число вызовов функции. Каким образом можно...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru