2009-08-12 8 views
0

状況はこれと同じです。私はコントロールを持っていて、イベントを持っています。このイベントはコントロールの定義にレンダリングされています。何らかのメッセージが表示されるこのコントロールを使用する別のハンドラがこのイベントにアタッチされています 最高のお礼、 Iordan再度イベントを添付しないでください

答えて

0

これは良いアプローチとして私を攻撃しません。イベントを使用する場合、コントロールは通常、アタッチされたイベントハンドラの数に依存しない必要があります。 0または27のイベントハンドラがイベントに反応しているかどうかに関係なく動作するはずです。より多くのコントロールを持つメカニズムを使用する場合は、代わりに代理人を使用することを検討する必要があります。

何らかの理由でイベントモデルを使用するように制限されていて、イベントハンドラの割り当てを制御したい場合は、元のクラスを継承し、同じクラスの名前とシグネチャでイベントを作成する方法がありますベースクラスのように(元のイベントが隠されているようnewキーワードを使用して)、およびイベントハンドラを着脱する方法を追跡:

0

私は混乱しています。

'+ = new EventHandler(...)'の呼び出しを検出して停止できますか?

あなたのコードを整理する必要があると思います。または、あなたの質問に再度語りましょう。

+0

は、彼はちょうどハンドラは、renderイベントをサブスクライブメッセージを表示しようとしていると考えて....とは思いませんそれが可能だ。 – James

+0

さて、私は少し不明だったかもしれないが、状況は私はコントロールを継承しているDataGridViewコントロール私はCellPaintイベントのイベントハンドラを添付している。私のコントロールを使用する人がこのイベントに別のイベントハンドラを添付して、さまざまな問題を引き起こす可能性があることをメッセージで伝えたい場合 よろしくお願いします。 Iordan – IordanTanev

2
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--; 
     } 
    } 
} 

が公にイベントを公開いけません。それをプロパティとして公開します。これにより、外部クラスがハンドラをアタッチしているときを制御できます。

クラス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

+0

これは彼が探していたものだと思います。ニース、あなたはC#でこの種のことをすることができることを認識していませんでした。 – James

関連する問題