2009-05-27 11 views
17

Uno scenario semplice: una classe personalizzata che genera un evento. Desidero consumare questo evento all'interno di un modulo e reagire ad esso. Come lo faccio? Esempi di codice, per favore!Come iscriversi ad altri eventi di classe in C#?

Si noti che il modulo e la classe personalizzata sono classi separate.

risposta

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

Grazie per l'ottima soluzione. L'ho capito subito dopo aver postato una domanda e la mia soluzione è molto simile alla tua. – sarsnake

+0

http://stackoverflow.com/questions/8335131/winform-events-in-another-class-net2-simplify-delegate per un'implementazione in .NET2 –

+0

@CSgarpAtl Vedo che questo è selezionato come risposta corretta. Purtroppo non riesco a farlo funzionare anche se ho seguito ogni passaggio. Sto cercando di rendere il mio modulo principale consapevole del metodo che è successo nel mio controllo utente. – Disasterkid

6

All'interno del vostro modulo:

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

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

Basta iscriversi a tale evento sul altra classe nello stesso modo si farebbe a un evento nella tua forma. Le tre cose importanti da ricordare:

1) È necessario assicurarsi che il proprio metodo (gestore di eventi) abbia la dichiarazione appropriata per abbinarsi al tipo di delegato dell'evento sull'altra classe.

2) L'evento sull'altra classe deve essere visibile all'utente (ad esempio: pubblico o interno).

3) Iscriviti su un'istanza valida della classe, non sulla classe stessa.

+0

@Reed_Copsey Può Oyu fornire un po 'di codice, in qualche modo il mio evento non sarà accettata dal gestore – Gobliins

+0

@Gobliins Non so che cosa il vostro problema è - mi sento di raccomandare a chiedere alla tua domanda con tutti i dettagli. –

+0

Ha lo stesso problema dell'argomento, ma nvm l'ho già risolto. – Gobliins

0

Assumendo che il vostro evento è gestito da EventHandler, questo codice funziona:

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 
} 

Se il vostro "evento personalizzato" richiede qualche altra firma per gestire, avrete bisogno di utilizzare quella invece.

Problemi correlati