Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
 Аватар для KellyDink
6 / 6 / 0
Регистрация: 04.01.2012
Сообщений: 182
Записей в блоге: 44

Добавить обработчик событий на UserControl

23.04.2018, 11:14. Показов 4110. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
я тут сделала свой контрол с шахматами и поэтессами и картинкой и текстом, на нем. Теперь я хочу добавить обработчик событий на него. Как бы мне это все объединить это все в один контрол? ибо мне приходится делать одинаковые обработчики на все 3 части (сам контрол, текст на нем и картинка).
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.04.2018, 11:14
Ответы с готовыми решениями:

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

[WPF] Добавить обработчик событий для динамического элемента
На Canvas динамически создаются элементы (Label) Этим элементам нужно присвоить обработчик событий. Я делаю так: public void...

Обработчик в UserControl
надеюсь, суть проблемы будет ясна.. есть юзерконтрол, состоящий из 100500 label-ов и хочется при нажатии на заголовок (один из...

9
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
23.04.2018, 16:32
не совсем уловил проблему...

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class UserControl
{
public event Action MyEvent;
 
public UserControl()
{
button.Click += (s, e) => MyEvent?.Invoke();
picture.Click += (s, e) => MyEvent?.Invoke();
label.Click += (s, e) => MyEvent?.Invoke();
 
//возможно даже прокатит такое, не пробовал
this.Click += (s, e) => MyEvent?.Invoke();
}
 
}
0
 Аватар для KellyDink
6 / 6 / 0
Регистрация: 04.01.2012
Сообщений: 182
Записей в блоге: 44
23.04.2018, 16:42  [ТС]
ну вот у мен есть контрол, унаследованный от UserControl.
При динамическом заполнении формы я пишу

C#
1
2
3
4
5
6
7
8
9
10
foreach (var es int list)
{
MyUserControl control = new MyUserControl(es)
         {
                 Dock = DockStyle.Fill
         };
 
control.MouseClick += ControlClick;
 
}
И при таком раскладе мой обработчик срабатывает только по краюшку моего контрола, а на картинке и тексте, которые живут внутри этого контрола не работают(

Ну и как бы внутри метода ControlClick я проверяю на контрол. и даже если я вешаю этот же метод на картинку и текст внутри контрола, то он мне и отвечает, что это совсем не мой контрол, а просто label без всей необходимой мне информации

C#
1
2
3
4
5
        private void DeviceControlClick(object sender, MouseEventArgs e)
        {
            var control = sender as MyUserControl;
            if (control == null) return;
          }
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
23.04.2018, 18:16
ответ особо не изменился )

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
39
40
41
42
using System;
using System.Windows.Forms;
 
namespace Nya.EventUserControl
{
    public partial class NyaControl : UserControl
    {
        private string _name;
        public event EventHandler<NyaControlClickInfoEventArgs> ClickNyaControl;
 
        public NyaControl(string name)
        {
            InitializeComponent();
 
            label1.Text = _name = name;
            Click += ControlClick;
 
            // можно так на все внутрение контролы сразу подписатся
            // проблема с тем, что заденит также кнопки, 
            // и если будет вложены пользовательский контрол -- его тоже нужно будет "настраивать"
            //foreach (Control control in Controls)
            //    control.Click += ControlClick;
 
            //либо вручную указываем каждый элемент
            label1.Click += ControlClick;
            pictureBox1.Click += ControlClick;
        }
 
        private void ControlClick(object sender, EventArgs args)
            => ClickNyaControl?.Invoke(this, new NyaControlClickInfoEventArgs(_name));
    }
 
    public class NyaControlClickInfoEventArgs : EventArgs
    {
        public string Name { get; private set; }
 
        public NyaControlClickInfoEventArgs(string name)
        {
            Name = name;
        }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System.Windows.Forms;
 
namespace Nya.EventUserControl
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
 
            var control = new NyaControl("Hatsune-Miku");
            control.ClickNyaControl += (s, e) => MessageBox.Show(this, e.Name);
            Controls.Add(control);
        }
    }
}
p.s. возможно есть способ поизящнее прокидывать ивент на сам контрол. =\
Вложения
Тип файла: zip Nya.EventUserControl.zip (190.0 Кб, 5 просмотров)
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
23.04.2018, 18:21
p.p.s.
даный подход -- унификация от microsoft.
C#
1
2
3
ClickNyaControl?.Invoke(
this, /*передаем сам контрол*/
new NyaControlClickInfoEventArgs(_name) /* параметры события */);
Если же делать не по феншую, а в лоб

C#
1
2
3
4
5
6
7
8
9
10
11
12
public partial class NyaControl : UserControl
    {
        private string _name;
        public event Action<string> ClickNyaControl;
 
/* */
 
private void ControlClick(object sender, EventArgs args)
            => ClickNyaControl?.Invoke(_name); //сразу передаем нужную инфу
/* */
 
control.ClickNyaControl += name => MessageBox.Show(this, name);
1
 Аватар для KellyDink
6 / 6 / 0
Регистрация: 04.01.2012
Сообщений: 182
Записей в блоге: 44
24.04.2018, 18:31  [ТС]
я люблю феншуй)
вообще у меня почти все получилось кроме нескольких проблем.
Во-первых, теперь, у меня не определяется sender как мой контрол, в ActiveControl'е в sender он есть, но до него не достучаться. Поэтому мне приходится искать по параметру из Args искать этот контрол из списка контролов и работать с ним. Это извращение или такова жизнь?

Еще при событии в обычный Click не выбрать кнопку мыши, которой щелкается по контролу(

а еще, если я вешаю событие на "MouseEnter" на label, picturebox и сам контрол, которое бы показывало tooltip, а при mouseleave этот tooltip прятать, то в некоторых местах соединения текста и самого контрола (это мое сугубо субъективное мнение) даже при остановки мыши этот tooltip постоянно выключается и включается( очень неудобно( пришлось его ставить только на картинку.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
24.04.2018, 19:37
Цитата Сообщение от KellyDink Посмотреть сообщение
Во-первых, теперь, у меня не определяется sender как мой контрол
можно увидеть вызов event и его обработку?

Цитата Сообщение от KellyDink Посмотреть сообщение
Еще при событии в обычный Click не выбрать кнопку мыши, которой щелкается по контролу(
ну, можно подписатся и на MouseDown, подход не сильно изменится.

Вообще 100% можно как-то пробрасывать событие MouseEnter дальше на UserControl...

Добавлено через 47 минут
Цитата Сообщение от KellyDink Посмотреть сообщение
пришлось его ставить только на картинку.
ToolTip из компонентов WinFroms? Если "да", то можно так

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public MainForm()
        {
            InitializeComponent();
 
            var control = new NyaControl("Hatsune-Miku");
            control.ClickNyaControl += (s, e) => MessageBox.Show(this, e.Name);
            var tooltip = new ToolTip();
            SetToolTip(tooltip, control);
            Controls.Add(control);
        }
 
        private void SetToolTip(ToolTip tooltip, Control control)
        {
            tooltip.SetToolTip(control, "Kitsune");
            if (control.Controls.Count != 0)
                foreach (Control innerControl in control.Controls)
                    SetToolTip(tooltip, innerControl);
        }
Правда при наведении на пикчу/лейбу будет "переотображатся"
1
 Аватар для KellyDink
6 / 6 / 0
Регистрация: 04.01.2012
Сообщений: 182
Записей в блоге: 44
25.04.2018, 19:07  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
ну, можно подписаться и на MouseDown, подход не сильно изменится.
Я подписалась, а в своем EventArgs добавила enum MouseButtons. При создании самого события надо передать MouseButtons и он сам поймет, какая клавиша была использована)

Цитата Сообщение от Wolfdp Посмотреть сообщение
можно увидеть вызов event и его обработку?
это я курица... пока писала Вам кляузу нашла ошибку

при подписки на event я делала
C#
1
control.ClickDeviceControl += (s,e) => DeviceControlClick(this, new MyEventArgs(device, MouseButtons));
а надо было
C#
1
control.ClickDeviceControl += (s,e) => DeviceControlClick(control, new MyEventArgs(device, MouseButtons));
Вот он всю форму и выдавал

Цитата Сообщение от Wolfdp Посмотреть сообщение
Правда при наведении на пикчу/лейбу будет "переотображатся"
не поняла, чем этот вариант отличается от моей привязки tooltip'а к label, picture и control'у =(

при наведении на опеределенное место он постоянно мигает, а если быстро двигать мышкой, то он и прятаться не успевает( помните косынку на старых версиях винды? там все зависало и карты так красиво друг на друга накладывались? тут все то же самое получается, только не так изящно! =(

Раньше я привязывала tooltip.show к событию MouseEnter и tooltip.Hide
сейчас попробовала в самом контроле при инициализации оного прописать
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public MyControl(string name)
        {
         InitializeComponents();
         SetToolTip(tooltip, this);
         }
 
        private void SetToolTip(ToolTip tooltip, Control control)
        {
            tooltip.SetToolTip(control, "Kitsune");
            if (control.Controls.Count != 0)
                foreach (Control innerControl in control.Controls)
                    SetToolTip(tooltip, innerControl);
        }
Только он реагирует только по краюшкам контрола, а на картинке и тексте не реагирует. И кстати если ручками влоб в инициализации объекта прописывать _tooltip.SetToolTip(_label, "text"); отдельно для текста, картинки и контрола, то реагирует тоже только по краюшкам. А вот на событие MouseEnter срабатывает, только мигает адски(
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
25.04.2018, 19:49
Цитата Сообщение от KellyDink Посмотреть сообщение
то реагирует тоже только по краюшкам.
как -то странно... Проект сильно большой, чтобы глянуть? Ну или сам контрол.
0
 Аватар для KellyDink
6 / 6 / 0
Регистрация: 04.01.2012
Сообщений: 182
Записей в блоге: 44
21.05.2018, 01:49  [ТС]
В общем у меня были какие-то смутные надежды, что при переносе в новый проект такого больше не будет повторяться, но увы(
Все то же самое. Самый эффективный способ пока, что я нашла - это сделать эту тултипу только на картинку.

Собственно я упорная( я долго пыталась найти в чем подвох самостоятельно.
Если навести мышью где-то накраешке текстбокса идет вечная перерисовка тултипа.
Вложения
Тип файла: 7z Nya.EventUserControl.7z (160.9 Кб, 0 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.05.2018, 01:49
Помогаю со студенческими работами здесь

Обработка событий в UserControl
Интересует как лучше согласно принципап ООП обработать из формы событие , которое происходит в расположенном на этой форме UserControl (...

Обработчик мыши для элемента UserControl
Здравствуйте. У меня вопрос, как можно через основной код, описать обработчик мыши для эллипса, который находится в UserControl. Если...

Обработчик событий
Есть простая форма а точнее даже таблица в 3 колонки в центральной колонке есть textarea чуть ниже есть чекбокс который дает возможность...

Обработчик событий
Нужно чтобы при нажатии кнопки вверх “VK_UP” созданный объект “sq1” двигался. Но в обработчике данный объект не видно...

Обработчик событий
Доброго времени суток уважаемые эксперты! Вообщем есть проблема, есть у меня 3 компонента типа TEdit, в 2 из них можно вводить...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru