2009-08-12 8 views
0

la situation est comme ceci j'ai un contrôle et il a rendu l'événement dans la définition du contrôle, à cet événement est attaché gestionnaire je cherche un moyen de montrer une sorte de message si dans une classe qui utilise ce contrôle un autre gestionnaire est attaché à cet événement Cordialement, IordanÉvitez d'attacher à nouveau l'événement

Répondre

0

Cela ne me semble pas être une bonne approche. Lors de l'utilisation d'événements, le contrôle ne doit généralement pas dépendre du nombre de gestionnaires d'événements connectés. Cela devrait fonctionner indépendamment du fait qu'il y ait 0 ou 27 gestionnaires d'événements réagissant à l'événement. Si vous voulez avoir un mécanisme où vous avez plus de contrôle, vous devriez probablement envisager d'utiliser un délégué à la place. Si vous êtes limité pour utiliser le modèle d'événement et que vous souhaitez contrôler l'affectation des gestionnaires d'événements, vous pouvez hériter de la classe d'origine en créant un événement dans cette classe portant le même nom et la même signature. comme dans la classe de base (en utilisant le mot-clé new afin que l'événement d'origine est caché) et de garder trace de la façon dont les gestionnaires d'événements sont attachés et détachés:

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

Je suis confus.

Pouvez-vous détecter l'appel de '+ = new EventHandler (...)' et l'arrêter ... quoi?

Je pense que vous avez juste besoin d'organiser votre code mieux. Ou re-mot votre question.

+0

Tu crois qu'il cherche à montrer à un message lorsqu'un gestionnaire est abonné à l'événement rendu .... ne pense pas c'est possible. – James

+0

Eh bien peut-être j'étais un peu flou ici est la situation que j'ai mon contrôle qui hérite du contrôle DataGridView j'ai attaché Eventhandler pour l'événement CellPaint. Je veux si quelqu'un qui utilise mon contrôle attache un autre eventHandler à cet événement pour faire un message qui peut conduire à différents problèmes Cordialement, Iordan – IordanTanev

2

DonT exposer publiquement l'événement. l'exposer comme une propriété. cela vous donnera le contrôle lorsque des classes externes attachant des gestionnaires

classe 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); 
    } 
} 
... 

}

plus d'informations sur ce ici

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

+0

Pensez que c'était à peu près ce qu'il cherche. Nice, je ne savais pas que vous pouviez faire ce genre de chose en C# – James

Questions connexes