2009-08-12 52 views
0

情况是这样的我有一个控件,它有事件在控件的定义中呈现,对于这个事件是附加处理程序我正在寻找一种方式来显示某种类型的消息,如果在某些类中使用此控件另一个处理程序附加到此事件 恭喜, 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

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

}

更多信息认为他是希望只显示一条消息时,处理程序订阅渲染事件....不认为这是可能的。 – James 2009-08-12 07:55:11

+0

嗯可能是我有点不清楚这里的情况是我有我的控制继承DataGridView控件我已附加CellPaint事件的Eventhandler。我希望如果有人使用我的控件附加了另一个eventHandler来处理这个事件以发出一些消息,说明这会导致不同的问题 祝你好运, Iordan – IordanTanev 2009-08-12 07:55:35

2

不公开揭露的事件。将其公开为属性。这会给你控制时,外部类的附加处理

MyClass类 { 私人事件处理_myEvent;在这这里

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

+0

想想这是他正在寻找的。不错,不知道你可以在C#中做这种事情 – James 2009-08-12 08:05:50