Избегайте повторного прикрепления события

#c# #winforms #events

#c# #winforms #Мероприятия

Вопрос:

ситуация такая: у меня есть элемент управления, и у него есть отображение события в определении элемента управления, к этому событию прикреплен обработчик я ищу способ показать какое-то сообщение, если в каком-токлассе, который использует этот элемент управления, к этому событию прикреплен другой обработчик С наилучшими пожеланиями, Иордан

Ответ №1:

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

класс MyClass { частный обработчик событий _myEvent;

 public event EventHandler MyEvent
{
    [MethodImpl(MethodImplOptions.Synchronized)]
    add 
    { 
        _myEvent = (EventHandler)Delegate.Combine(_myEvent, value);
    }
    [MethodImpl(MethodImplOptions.Synchronized)]
    remove 
    { 
        _myEvent = (EventHandler)Delegate.Remove(_myEvent, value); 
    }
}
...
  

}

подробнее об этом здесь

http://msdn.microsoft.com/en-us/magazine/cc163533.aspx

Комментарии:

1. Думаю, это было в значительной степени то, что он ищет. Приятно, не знал, что вы можете делать подобные вещи на C#

Ответ №2:

Это не кажется мне хорошим подходом. При использовании событий управление обычно не должно зависеть от количества подключенных обработчиков событий. Это должно работать независимо от того, есть ли 0 или 27 обработчиков событий, реагирующих на событие. Если вы хотите иметь механизм, в котором у вас будет больше контроля, вам, вероятно, следует рассмотреть возможность использования делегата вместо этого.

Если вы по какой-либо причине ограничены в использовании модели событий и хотите контролировать назначение обработчиков событий, одним из подходов может быть наследование исходного класса, создание события в этом классе с тем же именем и сигнатурой, что и в базовом классе (используя new ключевое слово, чтобы скрыть исходное событие), и отслеживание того, как подключаются и отсоединяются обработчики событий:

 public class BaseClass
{
    public event EventHandler SomeEvent;
}

public class MyClass : BaseClass
{
    private int _refCount = 0;
    public new event EventHandler SomeEvent
    {
        add
        {
            if (_refCount > 0)
            {
                // handler already attached
            }
            base.SomeEvent  = value;
            _refCount  ;
        }
        remove
        {
            base.SomeEvent -= value;
            _refCount--;
        }
    }
}
  

Ответ №3:

Я в замешательстве.

Можете ли вы обнаружить вызов ‘ = new EventHandler (… )’ и остановить его … что?

Я думаю, вам просто нужно лучше организовать свой код. Или переформулируйте свой вопрос.

Комментарии:

1. Думаю, он хочет просто показать сообщение, когда обработчик подписывается на событие рендеринга …. не думаю, что это возможно.

2. Ну, может быть, я был немного неясен, вот ситуация: у меня есть свой элемент управления, который наследует элемент управления DataGridView, я прикрепил Eventhandler для события CellPaint. Я хочу, чтобы, если кто-то, кто использует мой элемент управления, присоединит к этому событию другой обработчик событий, чтобы создать какое-либо сообщение о том, что tihs может привести к различным проблемам С наилучшими пожеланиями, Иордан