2009-06-18 16 views
5

Tengo dos objetos: uno que contiene algún código disparará un evento y otro que contiene el controlador para ese evento. No puedo "AddHandler" en la carga del primer objeto, porque una instancia del segundo objeto aún no existe. Cuando planteo mi evento, quiero verificar si una copia de object2 ha sido instanciada (es fácil de hacer), y si todavía se ha adjuntado un controlador al evento (no estoy seguro de cómo hacerlo).Determine si un evento se ha adjuntado aún

También estoy abierto a otra recomendación sobre cómo hacer esto en su lugar. Si hago mi AddHandler en Object1.Load, y Object2 aún no existe, entonces nunca manejará mi evento, incluso si lo creo más tarde. En este momento, en el código que desencadena el evento, acabo de utilizar un RemoveHandler y luego un AddHandler cada vez que se genera el evento, y luego sé que me adjuntaré cuando el objeto finalmente exista, pero sé esto es un método horrible

Vi un artículo sobre algo similar (Determine list of event handlers bound to event), y tal vez me falta algo en la traducción, pero no puedo obtener el código para trabajar en mi evento personalizado en VB.NET.

+1

¿Por qué no se puede utilizar ¿conventos? – chrissie1

+0

No estoy seguro de cómo el uso de WithEvents podría afectar mi situación; no se trata de que el evento no se haya planteado o de que el controlador no funcione correctamente; ambos están bien. Es solo que no puedo adjuntar el controlador hasta que tenga una instancia del objeto que manejará el evento, por lo que no estoy seguro del mejor lugar para verificarlo. – SqlRyan

Respuesta

1

También puedes, simplemente tener un campo bool que compruebe antes de enganchar el evento.

if not eventHooked then 
addhandler 
eventHooked = true 
end if 

Además, si se necesita una buena C# para convertidor de vb http://www.tangiblesoftwaresolutions.com/ tiene uno que puede traducir a 100 líneas sobre la marcha o menos para o bien, traduce un proyecto de las 1000 líneas de forma gratuita. Más que eso, tienes que comprarlo, pero generalmente esos límites funcionarán bien. No, no estoy tratando de publicitar para ellos :-)

+0

Lo he considerado, y probablemente sea con lo que iré. Acabo de imaginar que podría haber una manera fácil de detectar si el evento ya está enganchado, pero si no lo hay, este es mi método preferido. – SqlRyan

+0

Aunque esperaba evitar esta solución, soluciona mi problema y funciona como un campeón. Gracias por tu ayuda. – SqlRyan

0

Si solo quiere saber si se ha conectado algún controlador, debería poder comprobar si el evento es nulo.

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

(Voy a dejar que traducir eso en VB)

+0

Esto no funcionará si ya se ha agregado algún otro evento. – ChrisF

+0

Estoy haciendo esto para un evento personalizado, no uno estándar, y este código no parece funcionar en este caso - al verificar el valor de MyEvent falla la sintaxis, diciéndome "Esto es un evento, y no puede ser llamado directamente ", por lo que ni siquiera puedo compilar. Supongo que esto es algo que C# maneja de forma diferente a VB ... – SqlRyan

+0

@ChrisF: Es por eso que me preguntaba si él quiere saber si * cualquier * manejador se adjuntó (frente a un controlador específico). Quizás él sabe que él es el único que lo tocará. @rwmnau: Según entiendo, los eventos solo pueden ser accedidos directamente por su clase declarante, por lo que este código debería incluirse en la clase misma. – StriplingWarrior

16

VB.Net crea una variable de miembro privada especial en el patrón <YourEvent>Event que luego puede usar para probar en contra de 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

De acuerdo con las respuestas aquí: http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/9ec8ff1c-eb9b-4cb3-8960-9cd4b25434f2 (que parece funcionar de acuerdo con mis pruebas), un cheque por controladores de eventos existentes se realiza al llamar RaiseEvent. Si no desea elevar un evento y sólo tiene que comprobar para ver si hay algún manipuladores están unidos, se puede comprobar el valor de una variable oculta llamada <your_event_name> evento como:

Public Event Foo As ActionFoo 

If FooEvent IsNot Nothing Then... 
Cuestiones relacionadas