Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Как удалить все события ?


Автор: andrx 11.1.2006, 13:09
Подскажите пожалуйста как в с# для события можно удалить все его обработчики
если неизвестно количество добавленных в свойство обработчиков и неизвестно какие это обработчики ?

можно что-то наподобии этого :
Код

foreach ( Control control in this.Controls )
{
     // отключить каждую кнопку
     control.Enabled = false;
     control.Click -= new EventHandler( <НАЗВАНИЕ МЕТОДА> );
}

но как тогда узнать количество добавленных обработчиков и какие это обработчики ?


Или может проще удалить и заново создать объект(ы) для которого(ых) необходимо "почистить" свойство ?

заранее благодарен за любую полезную информацию smile

Автор: dronzo 11.1.2006, 13:22
http://www.gotdotnet.ru/forums/Common/202082.aspx
Подойдёт ?

Автор: andrx 11.1.2006, 13:34
dronzo
Спасибо!
помоему то что надо, сейчас буду пробывать ! smile

как только получится - напишу ответ !

Автор: andrx 11.1.2006, 15:34
Уважаемый dronzo
Еще раз спасибо, все работает просто замечательно !
жаль что не могу повысить Вам рейтинг smile , еще не дорос smile

Посему ходатайствую перед модератором об увелечении репутации dronzo.

Всем кто столкнется с подобной проблемой приведу решение, которое посоветовал dronzo,
но в это решение мне пришлось добаить еще один оператор if ( delegates != null )
для проверки наличия добавленных
обработчиков события, иначе может возникнуть ошибка :
Код

foreach ( Control control in this.Controls )
                {
                    // отключить каждую кнопку
                    control.Enabled = false;

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

Автор: dronzo 11.1.2006, 15:55
Да ладно - писал ведь не я. Просто наткнулся на этот код некоторое время назад, когда похожий вопрос возник smile

Автор: mr.DUDA 11.1.2006, 18:48
+1

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)