2017-06-09 1 views
0

J'apprends le délégué et l'événement hadler parce que j'ai besoin de mon code. Dans l'exemple, le test de classe génère le message Bonjour, je suis un événement!
De cette classe, j'ai besoin d'appeler la méthode Evento1 en classe Test1, pour générer le message Bonjour, je suis un autre événement! Mais je ne suis pas capable de le faire.
J'ai essayé d'instancier la classe Test1 et d'appeler la méthode. Le debuger compile mais le deuxième message n'apparaît pas.Gestionnaire de délégué et d'événement C# # entre deux classes

namespace Eventi1 
{ 
    // Delegate declaration 
    delegate void testEventHandler(object source, string message); 
    class Test 
    { 
     // Event 
     public event testEventHandler testEvento; 

     // Function that triggers the event 
     public void Evento(string message) 
     { 
      Console.WriteLine("Event!"); 
      if (testEvento != null) 
      { testEvento(this, message); } 

      Test1 evento = new Test1(); 
      evento.Evento1("Hello, i'm another event!"); 
     } 
    } 

    class Test1 
    { 
     // Event1 
     public event testEventHandler testEvento; 

     // Function that triggers the event 
     public void Evento1(string message) 
     { 
      Console.WriteLine("Event1!"); 
      if (testEvento != null) 
      { testEvento(this, message); } 
     } 
    } 

    public class EventSample 
    { 
     // Constructor 
     public EventSample() { } 
     static void Main() 
     { 
      // Classe instantiation 
      Test b = new Test(); 

      // Event handler 
      //b.testEvento += new testEventHandler(onTestAction); 
      b.testEvento += onTestAction; 

      // Event invocation 
      b.Evento("Hello, i'm an event!"); 
     } 

     // Function that triggers the event 
     public static void onTestAction(object source, string message) 
     { 
      Console.WriteLine("We're inside the event handler."); 
      Console.WriteLine("Messagge: " + message); 
      Console.ReadLine(); 
     } 
    } 
} 

PS seconde question Aansari

class Test 
{ 
    public delegate void testEventHandler(object source, string message); 
    public event testEventHandler testEvento; 

    // Function that triggers the event 
    public void Evento(string message) 
    { 
     Console.WriteLine("Event!"); 
     if (testEvento != null) 
     { testEvento(this, message); } 

     Test1 evento = new Test1(); 
     evento.testEvento += testEvento; 
     evento.Evento1(); 
    } 
} 

class Test1 
{ 
    public delegate void testEventHandler(object source, string message); 
    public event testEventHandler testEvento; 

    // Function that triggers the event1 
    public void Evento1() 
    { 
     Console.WriteLine("Event1!"); 
     if (testEvento != null) 
     { testEvento(this, "Hello, i'm another event!"); } 
    } 
} 

public class EventSample 
{ 
    public EventSample() { } 
    static void Main() 
    { 
     Test b = new Test(); 
     b.testEvento += onTestAction; 
     b.Evento("Hello, i'm an event!"); 
    } 

    // Function that triggers the event 
    public static void onTestAction(object source, string message) 
    { 
     Console.WriteLine("We're inside the event handler."); 
     Console.WriteLine("Messagge: " + message + "\n"); 
     Console.WriteLine("Press ENTER"); 
     Console.ReadLine(); 
    } 
} 
+2

_J'ai essayé d'instancier le test de classe1 et d'appeler la méthode. Le débugeur compile mais le second message n'apparaît pas. Correct, car vous n'êtes pas abonné à 'testEvento' dans la classe' Test1' (vous avez seulement souscrit à l'évènement dans la classe 'Test'). Notez que vous êtes abonné à un événement uniquement de cette instance particulière, pas à un "événement communément nommé entre classes" ou même à plusieurs instances de la même classe. –

+0

Je vous remercie mais malheureusement j'ai très peu compris ce que vous m'avez dit. Pouvez-vous s'il vous plaît expliquer de manière plus simple ou corriger le code? Merci encore –

Répondre

2

Incorporez le changement suivant et il vous donnera résultat escompté

Test1 evento = new Test1(); 
evento.testEvento += testEvento; 
evento.Evento1("Hello, i'm another event!"); 

Le problème dans votre code a été, si vous etiez l'attribution gestion des événements méthode au gestionnaire d'événements de classe Test, vous n'attribuez aucune méthode de gestion d'événements au gestionnaire d'événements de classe Test1.

+0

Merci cela a résolu mon problème –

+0

Et si je bouge 'delegate void testEventHandler (source d'objet, message de chaîne);' iside Class Test et Test1? 'evento.testEvento + = testEvento;' génère: Vous ne pouvez pas implicitement convertir le type 'Events1.Test.testEventHandler' en 'Events1.Test1.testEventHandler' –

+1

Il existe un concept de compatibilité de type de délégué. S'il vous plaît passer par ce [Compatibilité de type et la compatibilité des paramètres des délégués en C#] (http://www.dotnetfunda.com/articles/show/3016/type-compatibility-and-parameter-compatibility-of-delegates-in-csharp) – Aansari