2009-05-27 37 views
17

Un escenario simple: una clase personalizada que genera un evento. Deseo consumir este evento dentro de un formulario y reaccionar ante él. ¿Cómo puedo hacer eso? Ejemplos de código, por favor!¿Cómo suscribirse a otros eventos de clase en C#?

Tenga en cuenta que el formulario y la clase personalizada son clases separadas.

Respuesta

24
 public class EventThrower 
     { 
      public delegate void EventHandler(object sender, EventArgs args) ; 
      public event EventHandler ThrowEvent = delegate{}; 

      public void SomethingHappened() 
      { 
       ThrowEvent(this, new EventArgs()); 
      } 
     } 

     public class EventSubscriber 
     { 
      private EventThrower _Thrower; 

      public EventSubscriber() 
      { 
       _Thrower = new EventThrower(); 
       //using lambda expression..could use method like other answers on here 
       _Thrower.ThrowEvent += (sender, args) => { DoSomething(); }; 
      } 

      private void DoSomething() 
      { 
       //Handle event..... 
      } 
     } 
+0

Gracias por una gran solución. Lo he descubierto justo después de publicar una pregunta, y mi solución es muy similar a la tuya. – sarsnake

+0

http://stackoverflow.com/questions/8335131/winform-events-in-another-class-net2-simplify-delegate para una implementación en .NET2 –

+0

@CSgarpAtl Veo que esta opción está seleccionada como la respuesta correcta. Desafortunadamente no puedo hacer que funcione aunque he seguido cada paso. Estoy intentando que mi formulario principal conozca el método que ha sucedido en mi Control de usuario. – Disasterkid

6

Dentro de su forma:

void SubscribeToEvent(OtherClass theInstance) 
{ 
    theInstance.SomeEvent += this.MyEventHandler; 
} 

void MyEventHandler(object sender, EventArgs args) 
{ 
    // Do something on the event 
} 

Sólo suscribirse al evento por otra clase de la misma manera que lo haría para un evento en su forma. Las tres cosas importantes que debe recordar:

1) Debe asegurarse de que su método (controlador de eventos) tenga la declaración adecuada para que coincida con el tipo de delegado del evento en la otra clase.

2) El evento en la otra clase debe estar visible para usted (es decir, público o interno).

3) Suscríbete en una instancia válida de la clase, no en la propia clase.

+0

@Reed_Copsey Puede Oyu proporcionar algo más de código, de alguna manera mi caso no será aceptado por el manejador – Gobliins

+0

@Gobliins No sé lo que el problema es - recomendaría pedir a su propia pregunta con más detalles. –

+0

Es el mismo problema que el tema, pero nvm ya lo resolví. – Gobliins

0

Asumiendo que su caso está en manos de manejador de sucesos, este código funciona:

protected void Page_Load(object sender, EventArgs e) 
{ 
    MyClass myObj = new MyClass(); 
    myObj.MyEvent += new EventHandler(this.HandleCustomEvent); 
} 

private void HandleCustomEvent(object sender, EventArgs e) 
{ 
    //handle the event 
} 

Si su "evento personalizado" requiere alguna otra firma para manejar, que necesitará para el uso que uno en su lugar.

Cuestiones relacionadas