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

Получать события из экземпляра класса

06.09.2021, 12:02. Показов 1175. Ответов 3
Метки нет (Все метки)

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

есть приложение

А
а так же Библиотека классов Б

в приложении А открываю форму из класса Б

так вот интересует вопрос как можно подписаться на события библиотеки классов (Б)

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

смысл таков

моя библиотека классов имеет форму с контролом RDP клиентом

этот контрол возвращает различные события свои типа

какие то ошибки с сервера РДП и т д

так вот мне необходимо в приложении А перехватывать эти события и показывать их пользователю
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.09.2021, 12:02
Ответы с готовыми решениями:

Как можно изменить атрибут экземпляра одного класса при добавлении/изменении экземпляра другого класса
Мне нужно, чтобы при создании города/деревни уже существующей области (т.е. уже создана область с таким названием) изменялись атрибуты...

Как создать атрибут экземпляра класса в методе экземпляра класса?
Здравствуйте. Подскажите, как в javascript создать новый атрибут экземпляра класса в методе экземпляра? class YandexMap{ //...

Создание экземпляра класса - наследника экземпляра другого класса
Имеется два класса: класс Layer и класс-наследник Neuron. Я создал экземпляр класса Layer l1 и задал его свойства, теперь мне необходимо...

3
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
06.09.2021, 12:38
C#
1
2
3
4
5
6
7
8
9
namespace Б
{
   public class TheForm : Form
   {
      public event EventHandler<EventArgs> RdpError;
 
      protected virtual void OnRdpError(EventArgs e = null) => RdpError?.Invoke(this, e ?? EventArgs.Empty);
   }
}
Событие активируется методом OnRdpError, EventArgs можете заменить на нужный тип, если с событием нужно передавать какие-то дополнительные данные.
В классе из А подписывайтесь на RdpError так же, ка подписываетесь на любое другое событие.
1
4 / 4 / 1
Регистрация: 15.03.2019
Сообщений: 676
06.09.2021, 13:01  [ТС]
Спасибо огромное. это работает!
0
4 / 4 / 1
Регистрация: 15.03.2019
Сообщений: 676
10.09.2021, 12:53  [ТС]
Что то если использую эту подписку по ерунда получается.

Все прекрасно работает, мне прилетают уведомления но,

если во втором окне вылетает какие то исключение а в моем случае я тупо вызываю в нем метод
C#
1
Dispose();
дабы закрыть окно и убить в нем все но вылетает при этом все приложение (

как быть?

ка ктолько убираю подписку сразу все становится нормальным нету никаких проблем с закрытием и т д

как я понимаю нужно как то реализовать отписку от события при нужных мне методах

итак открываю второе окно так

C#
1
2
3
4
5
var fg = new Form1(daysOfWeek);
 
                   fg.RdpError += DataF_RdpError;
 
                   fg.Show();
Сам метод
C#
1
DataF_RdpError
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        //Подписка на события
        private void DataF_RdpError(object sender, String[] e)
        {
            if (e[0].ToString() == "YesLogin")
            {
                Visible = false;
                Servers.CurrentRow.Cells[1].Value = new Bitmap(Properties.Resources.yes_connetted);
            }
            else
            {
                if (e[0].ToString() == "-745" || e[0].ToString() == "-545")
                {
                    ErrorsText.Text = e[1].ToString();
                    
                }
                else
                {
                    MessageBox.Show(e[0].ToString() + " - " + e[1].ToString());
                }
               
            }
        }
а вот метод при котором у меня отваливается все приложение этот метод находится во втором окне

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
 //После отключения закроем приложение!
        private void RDP_OnDisconnected(object sender, AxMSTSCLib.IMsTscAxEvents_OnDisconnectedEvent e)
        {
            if(FullStrine == false)
            {
                //Зададим новое расширение для окна сервера
                RDP.DesktopHeight = ClientSize.Height;
                RDP.DesktopWidth  = ClientSize.Width;
                RDP.Width         = ClientSize.Width;
                RDP.Height        = ClientSize.Height;
                //Подключаемся с новыми расширениями
                ConnectionServer();
            } else
            {
                if (FullStrine_resize == true)
                {
                    Size resolution   = Screen.PrimaryScreen.Bounds.Size;
                    if (Screen.AllScreens.Length > 1)
                    {
                        Size resolution_2 = Screen.AllScreens[1].Bounds.Size;
 
                        if ((resolution.Width + 50) > Right)
                        {
                            ClientWidth = resolution.Width;
                            ClientHeight = resolution.Height;
                            ClientSize = new Size(ClientWidth, ClientHeight);
                            RDP.DesktopHeight = ClientSize.Height;
                            RDP.DesktopWidth = ClientSize.Width;
                            RDP.Width = ClientSize.Width;
                            RDP.Height = ClientSize.Height;
                            RDP.FullScreen = true;
                            FullStrine = true;
                            FullStrine_resize = false;
                            //Подключаемся с новыми расширениями
                            ConnectionServer();
                        }
                        else
                        {
                            ClientWidth = resolution_2.Width;
                            ClientHeight = resolution_2.Height;
                            ClientSize = new Size(ClientWidth, ClientHeight);
                            RDP.DesktopHeight = ClientSize.Height;
                            RDP.DesktopWidth = ClientSize.Width;
                            RDP.Width = ClientSize.Width;
                            RDP.Height = ClientSize.Height;
                            RDP.FullScreen = true;
                            FullStrine = true;
                            FullStrine_resize = false;
                            //Подключаемся с новыми расширениями
                            ConnectionServer();
                        }
                    } else
                    {
                        ClientWidth = resolution.Width;
                        ClientHeight = resolution.Height;
                        ClientSize = new Size(ClientWidth, ClientHeight);
                        RDP.DesktopHeight = ClientSize.Height;
                        RDP.DesktopWidth = ClientSize.Width;
                        RDP.Width = ClientSize.Width;
                        RDP.Height = ClientSize.Height;
                        RDP.FullScreen = true;
                        FullStrine = true;
                        FullStrine_resize = false;
                        //Подключаемся с новыми расширениями
                        ConnectionServer();
                    }
                } else
                {
                    Dispose(); // вот здесь когда я убиваю его убивается все приложение (
                }
 
                
            }  
        }
такая же история вот с этими методами

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private void RDP_OnAutoReconnecting2(object sender, AxMSTSCLib.IMsTscAxEvents_OnAutoReconnecting2Event e)
        {
            // Если подписаны на событие - инициируем его
            if (RdpError != null)
            {
                string[] mes = { "-545", "Ошибка соединения произведите поключение сново!" };
                RdpError(this, mes);
            }
            Dispose();
        }
 
        private void RDP_OnIdleTimeoutNotification(object sender, EventArgs e)
        {
            // Если подписаны на событие - инициируем его
            if (RdpError != null)
            {
                string[] mes = { "-745", "Превышено время простоя произведите подключение сново!" };
                RdpError(this, mes);
            }
            Dispose();
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.09.2021, 12:53
Помогаю со студенческими работами здесь

Почему при вызове метода у экземпляра класса он сначала ищет у экземпляра
Всем привет, после прочтения Лутца про ООП появился такой вопрос почему при вызове метода у экземпляра класса он сначала ищет у экземпляра,...

Создание экземпляра класса, разрушение экземпляра класса
Не могу найти информацию про разрущение экземпляра класса. Объясните пожалуйста, что это?

Создание нового экземпляра дочернего класса из экземпляра базового
Всем привет! Извиняюсь, если вопрос глупый, но что-то не смог найти конкретный ответ на него... У меня есть несколько классов: все они...

При создании экземпляра класса, создается 2 экземпляра вместо 1
Подсчет экземпляров ведется с помощью статического члена num_dogs, который во всех трех конструкторах (1. по умолчанию, 2. со всеми...

Сложение экземпляра базового класса и экземпляра наследника
Добрый вечер! Моя задача - сложить экземпляр базового класса и наследника. Нужно сделать так, чтобы результат сложения &quot;знал&quot;...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru