powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Управление событиями
5 сообщений из 5, страница 1 из 1
Управление событиями
    #36406725
vinvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотел бы поднять тему, интересующую, как мне кажется, многих - как правильно управлять событиями.

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

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

Код: plaintext
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.
private EventHandler delegateDelete;
...

private void Form1_Load(object sender, EventArgs e)
        {
...
            SetNewClickForDelete();            
        }
...
void bindingNavigatorDeleteItemMyClick(object sender, EventArgs e)
        {
            if (MessageBox.Show("Вы уверены, что хотите удалить?", "", MessageBoxButtons.YesNo  , MessageBoxIcon.Question) == DialogResult.Yes)
            {
                if (delegateDelete != null)
                       delegateDelete(sender, e);
            }
        }
...
private void SetNewClickForDelete()
        {
            object sender = bindingNavigatorDeleteItem;

            FieldInfo fieldEventClick = typeof(ToolStripItem).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static);
            object fieldEventClickValue = fieldEventClick.GetValue(sender);
            EventHandlerList handlerList = (EventHandlerList)sender.GetType().GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(sender, new object[] { });
            Delegate delegates = handlerList[fieldEventClickValue];
           
            if (delegates != null)
            {
                foreach (Delegate targetDelegate in delegates.GetInvocationList())
                {
                    delegateDelete += (EventHandler) targetDelegate;
                    handlerList.RemoveHandler(fieldEventClickValue, targetDelegate);
                }
            }

            bindingNavigatorDeleteItem.Click += new EventHandler(bindingNavigatorDeleteItemMyClick);
}


Вопрос вот какой - почему так делать не рекомендуется?
Да, я понимаю, что я ображаюсь к внутренним (не интерфейсным) полям и свойствам классов, и производитель вправе поменять это свойство и внутреннюю реализацию как ему вздумается, и в этом случае мой код работать не будет.
Однако, зададим себе вопрос. Если я использую FW 3.5 SP1 и именно под него пишу проект, вряд ли Microsoft выпустит SP2 и т.д., в котором коренным образом изменит внутренности.
Т.е. использование такого кода достаточно безопасно?
Конечно, если мы хотим, чтобы эти классы гарантированно использовались в дальнейших версиях FW, то так писать не нужно, но что делать, если такое переопределение необходимо, а других механизмов пока не видно?
Как видите, вопрос совсем не религиозный, а очень даже практический.
...
Рейтинг: 0 / 0
Управление событиями
    #36406734
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю в первую очередь нужно подумать о дизайне программы, возможно то, что вы придумали по изменению событий можно сделать намного проще.
...
Рейтинг: 0 / 0
Управление событиями
    #36408507
vinvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно сделать. Но при этом придеться переписывать ЗАНОВО код, который УЖЕ НАПИСАН в событии родительского класса.
...
Рейтинг: 0 / 0
Управление событиями
    #36408796
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно стремиться к простоте.
Через некоторое время вам придется разбираться в этом коде снова, для внесения изменений к примеру.
И вы потратите скорее всего на это уйму времени.
...
Рейтинг: 0 / 0
Управление событиями
    #36408835
vinvin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Про "простоту" - полностью согласен.
Но вопрос остался - что делать, когда нужно переопределять события?

Мне кажется дело в том, что в .NET эта проблема не решена в должной мере. Т.е. механизма управления событиями, кроме как += -= нет. Отсюда и вытекает этот достаточно сложный код (и не очень корректный - с точки зрения обращения к внутренним свойствам класса).
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Управление событиями
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]