2009-08-12 4 views
0

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

ответ

0

Это не кажется мне хорошим подходом. При использовании событий управление обычно не зависит от количества подключенных обработчиков событий. Он должен работать независимо от того, реагируют ли события на 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--; 
     } 
    } 
} 
0

Я смущен.

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

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

+0

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

+0

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

2

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

класс MyClass { {

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

+0

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