Всем привет! Вопрос следующего содержания: пусть у нас есть кнопка Button, на ее событии Click уже висит несколько делегатов, причем заранее неизвестно каких. Задача — временно отключить обработчик Click, а потом включить. Следующая конструкция не работает:
button1.Click = null;
Если можно обойти наследование то было бы круто!
-=Не бойтесь совершенства, ибо оно Вам не грозит! (С. Дали)=-
Здравствуйте, Vasyaga, Вы писали:
V>Всем привет! Вопрос следующего содержания: пусть у нас есть кнопка Button, на ее событии Click уже висит несколько делегатов, причем заранее неизвестно каких. Задача — временно отключить обработчик Click, а потом включить. Следующая конструкция не работает: V>
V> button1.Click = null;
V>
V>Если можно обойти наследование то было бы круто!
также, как и подписывались, только += замените на -=
Здравствуйте, ussr, Вы писали:
U>также, как и подписывались, только += замените на -=
Это понятно, но я же сказал, что мне заранее неизвестно, какие обработчики уже подключены, то есть мое приложение динамически подгружает те самые onclick... А вот как их выгрузить — непонятно. В идеале мне необходимо не только выгружать(отключать) их, но и сохранять.
В общем лучше объясню поподробнее:
Есть некое меню, в нем итемы — это динамически подгружаемые объекты со своими обработчиками onclick. Моя задача сделать это меню настраиваемым, то есть работающим в 2-х режимах: 1) Обычный режим (срабатывает onclick)
2) Режим Customize (onclick не работает, можно удалять itemы, добавлять новые из списка команд)
Надеюсь теперь будет понятнее...
-=Не бойтесь совершенства, ибо оно Вам не грозит! (С. Дали)=-
Здравствуйте, Vasyaga, Вы писали:
V>Всем привет! Вопрос следующего содержания: пусть у нас есть кнопка Button, на ее событии Click уже висит несколько делегатов, причем заранее неизвестно каких. Задача — временно отключить обработчик Click, а потом включить. Следующая конструкция не работает: V>
V> button1.Click = null;
V>
V>Если можно обойти наследование то было бы круто!
Здравствуйте, DuШes, Вы писали:
DШ>Delegate.RemoveAll
Так просто не получиться. Нужно вытащить значение свойства Control.Events, у него получить делегат по ключу, отвечающий за собитие Control.Click, и у последнего вызвать Delegate.RemoveAll
V>Это понятно, но я же сказал, что мне заранее неизвестно, какие обработчики уже подключены, то есть мое приложение динамически подгружает те самые onclick... А вот как их выгрузить — непонятно. В идеале мне необходимо не только выгружать(отключать) их, но и сохранять.
В общем, что-то у вас не так в консерватории...
Подумай, как эту нехорошую картину, которую ты хочешь — нарисовать по-другому.
Тот метод, который ты (да и я в свое время) использовал в Delphi — оторвал обработчик, сохранил, сделал свои грязные делишки, прицепил обратно — он все-таки плох принципиально. Тебе это раньше, до C# в голову не приходило? Мне — приходило.
Вариант как правильнее — сделать у истчника события (контрола?) методы BeginUpdate/EndUpdate или что-то в этом роде.
Hello, Igor!
V>> Это понятно, но я же сказал, что мне заранее неизвестно, какие V>> обработчики уже подключены, то есть мое приложение динамически V>> подгружает те самые onclick... А вот как их выгрузить — непонятно. V>> В идеале мне необходимо не только выгружать(отключать) их, но и V>> сохранять.
IT> В общем, что-то у вас не так в консерватории...
IT> Подумай, как эту нехорошую картину, которую ты хочешь — нарисовать IT> по-другому. Тот метод, который ты (да и я в свое время) использовал в IT> Delphi — оторвал обработчик, сохранил, сделал свои грязные делишки, IT> прицепил обратно — он все-таки плох принципиально. Тебе это раньше, до IT> C# в голову не приходило? Мне — приходило.
IT> Вариант как правильнее — сделать у истчника события (контрола?) методы IT> BeginUpdate/EndUpdate или что-то в этом роде.
Этот метод имеет один недостаток — надо создавать наследников для всех контролов для которых нужна такая функциональность. Что зачастую неприемлимо. Как альтернативу можно сделать некий враппер, который будет ловить onclick (или другие события) и в зависимости от своего состояния (enabled\disabled) будет вызывать или не вызывать нужные обработчики.
Posted via RSDN NNTP Server 1.9
WBR, Igor Evgrafov
Не могу отключить реакцию на события!!!
От:
Аноним
Дата:
03.03.05 04:51
Оценка:
button1.Click -= new System.EventHandler(this.button1_Click);
И в догонку: сделайте в классе WinForm или как у Вас там boolean переменную, и смотрите там значение. Если false — не исполняем, если true — исполняем. Грубо, но действенно.
А вначале, когда ничего не было, всё было так...
Не настоящий программист тот кодер, кто не форматнул диск из кода.
Всем привет! Вопрос следующего содержания: пусть у нас есть кнопка Button, на ее событии Click уже висит несколько делегатов, причем заранее неизвестно каких. Задача — временно отключить обработчик Click, а потом включить. Следующая конструкция не работает:
button1.Click = null;
Если можно обойти наследование то было бы круто!
this.ButtonSearch.Click += new System.EventHandler(this.ButtonSearch_Click);
назначить событие
this.ButtonSearch.Click -= new System.EventHandler(this.ButtonSearch_Click);
убрать событие
У Вас есть доступ к коду кнопки? Либо возможность наследоваться?
Иначе боюсь, что в лоб эту задачу не решить. Правда можно поизвращаться с рефлексией. Но что-то
мне подсказывает, что Вы в корне выбрали не тот подход.
Если Вы сами разработываете менюшку, то имеете доступ к процессу регистрации делегатов. Ну и запихивайте их в коллекцию, и пользуйте как душе угодно...
Здравствуйте, Vasyaga, Вы писали:
V>Это понятно, но я же сказал, что мне заранее неизвестно, какие обработчики уже подключены, то есть мое приложение динамически подгружает те самые onclick... А вот как их выгрузить — непонятно. В идеале мне необходимо не только выгружать(отключать) их, но и сохранять.
А нельзя создать свой класс события, регулировать подписывание и отписывание на него самому, а на Button.OnClick повесить только возбуждение вашего события?
GIV>Этот метод имеет один недостаток — надо создавать наследников для всех контролов для которых нужна такая функциональность. Что зачастую неприемлимо.
Hello, Igor!
GIV>> Этот метод имеет один недостаток — надо создавать наследников для GIV>> всех контролов для которых нужна такая функциональность. Что зачастую GIV>> неприемлимо.
IT> Или лень.
Здравствуйте, Аноним, Вы писали:
А>У Вас есть доступ к коду кнопки? Либо возможность наследоваться? А>Иначе боюсь, что в лоб эту задачу не решить. Правда можно поизвращаться с рефлексией. Но что-то А>мне подсказывает, что Вы в корне выбрали не тот подход. А>Если Вы сами разработываете менюшку, то имеете доступ к процессу регистрации делегатов. Ну и запихивайте их в коллекцию, и пользуйте как душе угодно...
А>данное сообщение получено с www.gotdotnet.ru А>ссылка на оригинальное сообщение
Думая наврядли автор имеет доступ к кнопке, тогда не что бы ему наверно не помешало бы использовать конструкцию Add|Remove при объявлении события...
Здравствуйте, Vasyaga, Вы писали:
V>Всем привет! Вопрос следующего содержания: пусть у нас есть кнопка Button, на ее событии Click уже висит несколько делегатов, причем заранее неизвестно каких. Задача — временно отключить обработчик Click, а потом включить. Следующая конструкция не работает: V>
V> button1.Click = null;
V>
V>Если можно обойти наследование то было бы круто!
Смешной вариант решения: создать вторую такую же кнопку, без обработчиков событий, и, когда надо отключить обработчик делать ее видимой, а исходную невидимой. И наоборот.
Здравствуйте, Stewe, Вы писали: S>Смешной вариант решения: создать вторую такую же кнопку, без обработчиков событий, и, когда надо отключить обработчик делать ее видимой, а исходную невидимой. И наоборот.
Да уж, смешно... Это из области темы как memset из С++ перегнать в С№...
А по поводу того, что у меня нет доступа к protected членам кнопки или менюитема, то так оно и есть, естессно...
В общем из всей информации я понял одно: без наследования не обойтись. Ну и ладно, конечно в лоб хотелось решить
Придется превозмогать лень...
-=Не бойтесь совершенства, ибо оно Вам не грозит! (С. Дали)=-
Здравствуйте, Vasyaga, Вы писали:
V>Здравствуйте, Stewe, Вы писали: S>>Смешной вариант решения: создать вторую такую же кнопку, без обработчиков событий, и, когда надо отключить обработчик делать ее видимой, а исходную невидимой. И наоборот. V>Да уж, смешно... Это из области темы как memset из С++ перегнать в С№... V>А по поводу того, что у меня нет доступа к protected членам кнопки или менюитема, то так оно и есть, естессно... V>В общем из всей информации я понял одно: без наследования не обойтись. Ну и ладно, конечно в лоб хотелось решить V>Придется превозмогать лень...
Млин, PuntoSwitcher... Я имел в виду C#
-=Не бойтесь совершенства, ибо оно Вам не грозит! (С. Дали)=-
Re[2]: Не могу отключить реакцию на события!!!
От:
Аноним
Дата:
04.03.05 10:40
Оценка:
Так что как сказал один мой товарищ — программист:
По#рать, не замарав штанов, не получится