避免再次附加事件

时间:2009-08-12 07:46:00

标签: c# winforms events

情况是这样的,我有一个控件,它在控件的定义中有事件Render,这个事件是附加处理程序我正在寻找一种方法来显示某种消息,如果在某些类中使用此控件另一个处理程序附加到此事件 最好的祝福, Iordan

3 个答案:

答案 0 :(得分:2)

不要公开曝光此事件。将其作为财产公开。这将使您可以控制外部类何时附加处理程序

类MyClass {     private EventHandler _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 :(得分:0)

我很困惑。

你能检测到'+ = new EventHandler(...)'的调用并停止它......什么?

我认为您需要更好地整理代码。或者重新提出你的问题。

答案 2 :(得分: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--;
        }
    }
}