#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);
}
}
...
}
подробнее об этом здесь
Комментарии:
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 может привести к различным проблемам С наилучшими пожеланиями, Иордан