web-dev-qa-db-fra.com

Création d'un événement personnalisé

Un événement personnalisé peut-il être créé pour n'importe quelle méthode d'objet?
Pour ce faire, j'utilise simplement la syntaxe suivante?:

myObject.myMethod +=new EventHandler(myNameEvent);

Le code suivant a posé cette question:

   private void btRunProcessAndRefresh_Click(object sender,EventArgs e)
    {
        myProcess =new Process();
        myProcess.StartInfo.FileName = @"c:\ConsoleApplication4.exe";
        myProcess.Exited += new EventHandler(MyProcessExited);
        myProcess.EnableRaisingEvents =true;
        myProcess.SynchronizingObject =this;
        btRunProcessAndRefresh.Enabled =false;
        myProcess.Start();
    }
28
whytheq

Oui, vous pouvez faire comme ça:

Création d'événements personnalisés C # avancés

ou

L'exemple d'événements C # le plus simple imaginable

public class Metronome
{
    public event TickHandler Tick;
    public EventArgs e = null;
    public delegate void TickHandler(Metronome m, EventArgs e);
    public void Start()
    {
        while (true)
        {
            System.Threading.Thread.Sleep(3000);
            if (Tick != null)
            {
                Tick(this, e);
            }
        }
    }
}
public class Listener
{
    public void Subscribe(Metronome m)
    {
        m.Tick += new Metronome.TickHandler(HeardIt);
    }

    private void HeardIt(Metronome m, EventArgs e)
    {
        System.Console.WriteLine("HEARD IT");
    }
}
class Test
{
    static void Main()
    {
        Metronome m = new Metronome();
        Listener l = new Listener();
        l.Subscribe(m);
        m.Start();
    }
}
32
Pranay Rana

Déclarez la classe contenant l'événement:

class MyClass {
    public event EventHandler MyEvent;

    public void Method() {
        OnEvent();
    }

    private void OnEvent() {
        if (MyEvent != null) {
            MyEvent(this, EventArgs.Empty);
        }
    }
}

Utilisez-le comme ceci:

MyClass myObject = new MyClass();
myObject.MyEvent += new EventHandler(myObject_MyEvent);
myObject.Method();
38
ionden

Oui, vous pouvez créer des événements sur des objets, voici un exemple;

public class Foo
{
    public delegate void MyEvent(object sender, object param);
    event MyEvent OnMyEvent;

    public Foo()
    {
        this.OnMyEvent += new MyEvent(Foo_OnMyEvent);
    }

    void Foo_OnMyEvent(object sender, object param)
    {
        if (this.OnMyEvent != null)
        {
            //do something
        }
    }



    void RaiseEvent()
    {
        object param = new object();
        this.OnMyEvent(this,param);
    }
}
14
daryal

Oui, à condition d'avoir accès à la définition d'objet et de la modifier pour déclarer l'événement personnalisé

public event EventHandler<EventArgs> ModelChanged;

Et normalement, vous sauvegarderiez cela avec une méthode privée utilisée en interne pour appeler l'événement:

private void OnModelChanged(EventArgs e)
{
    if (ModelChanged != null)
        ModelChanged(this, e);
}

Votre code déclare simplement un gestionnaire pour l'événement myMethod déclaré (vous pouvez également supprimer le constructeur), qui serait invoqué à chaque fois que l'objet déclenche l'événement.

myObject.myMethod += myNameEvent;

De même, vous pouvez détacher un gestionnaire en utilisant

myObject.myMethod -= myNameEvent;

Vous pouvez également écrire votre propre sous-classe de EventArgs pour fournir des données spécifiques lorsque votre événement se déclenche.

6
Strillo

Sur la base de la réponse de @ ionden, l'appel au délégué pourrait être simplifié en utilisant propagation nulle depuis C # 6.0.

Votre code serait simplement:

class MyClass {
    public event EventHandler MyEvent;

    public void Method() {
        MyEvent?.Invoke(this, EventArgs.Empty);
    }
}

Utilisez-le comme ceci:

MyClass myObject = new MyClass();
myObject.MyEvent += new EventHandler(myObject_MyEvent);
myObject.Method();
5
Antoine C.

Vous devez déclarer votre événement dans la classe de myObject:

public event EventHandler<EventArgs> myMethod; //you should name it as an event, like ObjectChanged.

alors myNameEvent est le rappel pour gérer l'événement, et il peut être dans n'importe quelle autre classe

3
MBen