ситуация такая, у меня есть элемент управления, и у него есть событие Render в определении элемента управления, к этому событию прилагается обработчик. Я ищу способ показать какое-то сообщение, если в каком-то классе который использует этот контроль, к этому событию прикрепляется другой обработчик С наилучшими пожеланиями, IordanИзбегайте добавления события снова
ответ
Это не кажется мне хорошим подходом. При использовании событий управление обычно не зависит от количества подключенных обработчиков событий. Он должен работать независимо от того, реагируют ли события на 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--;
}
}
}
Я смущен.
Можете ли вы обнаружить вызов '+ = new EventHandler (...)' и остановить его ... что?
Думаю, вам просто нужно лучше упорядочить свой код. Или переформулируйте свой вопрос.
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);
}
}
...
}
подробнее об этом здесь
Думайте, что это было в значительной степени тем, что он искал. Приятно, не знал, что вы можете делать такие вещи в C# – James
Думаешь, он смотрит только показать сообщение, когда обработчик присоединяется к рендера события .... не думаю возможно. – James
Ну, может быть, я был немного неясен, вот ситуация, когда у меня есть мой контроль, который наследует управление DataGridView, я привязал Eventhandler к событию CellPaint. Я хочу, если кто-то, кто использует мой контроль, присоединяет другой eventHandler к этому событию, чтобы сделать какое-то сообщение о том, что tihs может привести к различным проблемам С наилучшими пожеланиями, Iordan – IordanTanev