2009-06-18 6 views
5

J'ai deux objets - un qui contient du code avec déclencher un événement, et un qui contient le gestionnaire pour cet événement. Je ne peux pas "AddHandler" dans la charge du premier objet, car une instance du deuxième objet n'existe pas encore. Quand je lève mon événement, je veux vérifier si une copie d'object2 a été instanciée (facile à faire), et si un gestionnaire a été attaché à l'événement encore (pas sûr comment faire ceci).Déterminez si un événement a déjà été attaché

Je suis également ouvert à une autre recommandation sur la façon de faire à la place. Si je fais mon AddHandler dans Object1.Load, et que Object2 n'existe pas encore, il ne gérera jamais mon événement, même si je le crée plus tard. À l'heure actuelle, dans le code qui déclenche l'événement, je viens de faire un RemoveHandler puis un AddHandler à chaque fois que l'événement est déclenché, et je sais que je vais attacher quand l'objet existe enfin, mais je le sais est une méthode merdique.

J'ai vu un article sur quelque chose de similaire (Determine list of event handlers bound to event), et il me manque peut-être quelque chose dans la traduction, mais je ne peux pas obtenir le code pour travailler sur mon événement personnalisé dans VB.NET.

+1

Pourquoi ne pas utiliser withevents? – chrissie1

+0

Je ne sais pas comment l'utilisation de WithEvents affecterait ma situation - il ne s'agit pas d'un événement qui n'est pas soulevé, ou du fait que le gestionnaire ne fonctionne pas correctement - ils sont tous les deux très bien. C'est juste que je ne peux pas attacher le gestionnaire jusqu'à ce que j'ai une instance de l'objet qui va gérer l'événement, donc je ne suis pas sûr du meilleur endroit pour vérifier cela. – SqlRyan

Répondre

1

Vous pourriez aussi avoir juste un champ bool que vous vérifiez avant d'accrocher l'événement.

if not eventHooked then 
addhandler 
eventHooked = true 
end if 

Aussi, si vous avez besoin d'un bon C# pour vb convertisseur http://www.tangiblesoftwaresolutions.com/ a un qui peut se traduire par une 100 lignes à la volée ou moins pour ou traduire un projet de 1000 lignes gratuitement. Plus que cela, vous devez l'acheter, mais généralement ces limites fonctionneront très bien. Non, je n'essaie pas d'en faire la publicité :-)

+0

Je l'avais considéré, et c'est probablement ce que je vais faire avec. Je me suis juste dit qu'il pourrait y avoir un moyen facile de détecter si l'événement est déjà accroché, mais s'il n'y en a pas, alors c'est ma méthode préférée. – SqlRyan

+0

Bien que j'espérais éviter cette solution, elle résout mon problème et fonctionne comme un champion. Merci de votre aide. – SqlRyan

0

Si vous voulez juste savoir si un gestionnaire a été attaché, vous devriez être en mesure de vérifier si l'événement est nul.

if (MyButton.Click == null) 
{ 
    MyButton.Click += myEventHandler; 
} 

(je vous laisse traduire en VB)

+0

Cela ne fonctionnera pas si un autre événement a déjà été ajouté. – ChrisF

+0

Je le fais pour un événement personnalisé, pas un standard, et ce code ne semble pas fonctionner dans ce cas - vérifier la valeur de MyEvent échoue la syntaxe, en me disant "Ceci est un événement, et ne peut pas être appelé directement ", donc je ne peux même pas compiler. Je suppose que c'est quelque chose que C# gère juste différemment que VB ... – SqlRyan

+0

@ChrisF: C'est pourquoi je me demandais s'il voulait savoir si * aucun * gestionnaire était attaché (par rapport à un gestionnaire spécifique). Peut-être qu'il sait qu'il est le seul à le toucher. @rwmnau: Si je comprends bien, les événements ne peuvent être directement accessibles que par leur classe déclarante, donc ce code devrait être mis dans la classe elle-même. – StriplingWarrior

16

VB.Net crée une variable membre privée spéciale dans le modèle <YourEvent>Event que vous pouvez ensuite utiliser pour tester Nothing.

Public Event MyClick As EventHandler 

Private Sub OnMyClick() 
    If MyClickEvent IsNot Nothing Then 
     RaiseEvent MyClick(Me, New EventArgs()) 
    Else 
     ' No event handler has been set. 
     MsgBox("There is no event handler. That makes me sad.") 
    End If 
End Sub 

http://blogs.msdn.com/b/vbteam/archive/2009/09/25/testing-events-for-nothing-null-doug-rothaus.aspx

1

Selon les réponses ici: http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/9ec8ff1c-eb9b-4cb3-8960-9cd4b25434f2 (qui semblent fonctionner selon mes tests), se fait un chèque de gestionnaires d'événements existants sur l'appel RaiseEvent. Si vous ne voulez pas déclencher un événement et juste besoin de vérifier si tous les gestionnaires sont attachés, vous pouvez vérifier la valeur d'une variable cachée appelée <your_event_name> événement comme:

Public Event Foo As ActionFoo 

If FooEvent IsNot Nothing Then... 
Questions connexes