2010-11-04 3 views
11

У меня есть кнопка управления на winform. Так что, если у меня есть что-то вроде:Как узнать, назначен ли конкретный делегат событию?

myButton.Click += MyHandler1; 
myButton.Click += MyHandler2; 
myButton.Click += MyHandler3; 

Как я могу сказать, если какой-либо конкретной MyHandler уже был добавлен замковое события, так что не добавляется еще раз где-то в моем коде?

Я читал, как вы можете использовать GetInvocationList() для информации своего собственного события. Но я получаю ошибки при попытке получить элементы для моей командной кнопки, используя различные комбинации. Он говорит,

"Событие 'System.Windows.Forms.Control.Click' может появиться только на левой стороне от + = или -. ="

Что мне не хватает?

[Изменить] - Я хотел бы подчеркнуть this question, что указал Ахмад. Это kludge и должно быть проще IMHO, но похоже, что это может сработать.

+2

Вы не можете. Лучшее, что вы можете сделать, это «myButton.Click - = MyHandler1», прежде чем добавлять его. – slugster

+1

Возможный дубликат [Определить список обработчиков событий, связанных с событием] (http://stackoverflow.com/questions/660480/determine-list-of-event-handlers-bound-to-event) –

+0

@Ahmad - Хороший глаз. Я бы точно этого не видел! Однако, для ясности, я считаю, что мой вопрос все еще действителен. – IAmAN00B

ответ

11

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

myButton.Click -= MyHandler1; 
myButton.Click += MyHandler1; 

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

private bool handlersAdded; 
private void AddHandlers() 
{ 
    if (this.handlersAdded) return; 
    myButton.Click += MyHandler1; 
    this.handlersAdded = true; 
} 
+0

не подходит для статических событий .. – sotn

+0

@sotn Почему бы и нет? Если у вас статическое событие, назовем его «StaticClick», вы все равно можете удалить и добавить из него обработчик: «MyStaticClass.StaticClick- = MyHandler1;'. Это всего лишь указатель метода, который вы удаляете и/или добавляете из/в список. В любом случае, я никогда не буду использовать статические события, если вы окажетесь в таком состоянии, а затем переосмыслите свой дизайн. –

+0

Возможно, это не «ваш» дизайн, а dll третьей стороны, который вы используете. Подумайте об этом примере: вы хотите присоединить обработчик событий к звуковому драйверу своего компьютера и передать некоторые данные нескольким IP-адресам. Этот обработчик событий будет статичным, потому что вы не захотите создавать несколько прослушивателей для каждого ip, но создайте один прослушиватель событий и передайте его оттуда (из-за причин производительности). Вы предлагаете удалить этого обработчика и подключить его к каждому IP-адресу. Рискован. Надеюсь, вы понимаете мою мысль. – sotn

3

Использование GetIvocationList может быть выполнено только внутри владельца события (myButton в вашем случае), это одна из идей, стоящих за событиями (в отличие от делегатов).

Как сказал Slugster, вы не можете проверить список вызовов извне myButton, но вы можете попробовать и удалить MyHandler # перед его добавлением.

Смежные вопросы