82 votes

événement personnalisé simple

Je suis en train d'apprendre des événements personnalisés et j'ai essayé d'en créer un, mais il semble que j'ai un problème

J'ai créé un Formulaire statique de la classe et d'événements personnalisés. Ce que je suis en train de réaliser, c'est quand j'appuie sur le bouton Formulaire d'appel statique de la classe de fonction et la touche func, de temps en temps de montée d'un événement pour signaler l'état actuel. Form1 va diminuer si l'événement est déclenché et si elle est, elle va changer le Texte de label1

Voici ce que j'ai à ce jour

public partial class Form1 : Form
{
    public EventHandler<Progress> progress; 

    public Form1()
    {
        InitializeComponent();
        progress += SetStatus;
    }

    private void SetStatus(object sender, Progress e)
    {
        label1.Text = e.Status;
    }

    private void button1_Click_1(object sender, EventArgs e)
    {
         TestClass.Func();
    }

 }

Fichier 2

class TestClass
{
    public static void Func()
    {
        //time consuming code
        Report status 
        // time consuming code
        report status
    }
}

public class Progress : EventArgs
{
    public string Status { get; private set; }

    private Progress() {}

    public Progress(string status)
    {
        Status = status;
    }
}

Maintenant, ce que je ne comprends pas, comment puis-je hausse un événement de TestClass donc Form1 peut gérer l'événement et de modifier le libellé.Texte

150voto

themartinmcfly Points 759

C'est un moyen facile de créer des événements personnalisés et de les générer. Vous créez un délégué et un événement dans la classe à partir de laquelle vous lancez. Ensuite, abonnez-vous à l'événement à partir d'une autre partie de votre code. Vous avez déjà une classe d'argument d'événement personnalisée, vous pouvez donc vous en inspirer pour créer d'autres classes d'argument d'événement. NB: je n'ai pas compilé ce code.

 public partial class Form1 : Form
{
    private TestClass _testClass;
    public Form1()
    {
        InitializeComponent();
        _testClass = new TestClass();
        _testClass.OnUpdateStatus += new TestClass.StatusUpdateHandler(UpdateStatus);
    }

    private void UpdateStatus(object sender, ProgressEventArgs e)
    {
        SetStatus(e.Status);
    }

    private void SetStatus(string status)
    {
        label1.Text = status;
    }

    private void button1_Click_1(object sender, EventArgs e)
    {
         TestClass.Func();
    }

}

public class TestClass
{
    public delegate void StatusUpdateHandler(object sender, ProgressEventArgs e);
    public event StatusUpdateHandler OnUpdateStatus;

    public static void Func()
    {
        //time consuming code
        UpdateStatus(status);
        // time consuming code
        UpdateStatus(status);
    }

    private void UpdateStatus(string status)
    {
        // Make sure someone is listening to event
        if (OnUpdateStatus == null) return;

        ProgressEventArgs args = new ProgressEventArgs(status);
        OnUpdateStatus(this, args);
    }
}

public class ProgressEventArgs : EventArgs
{
    public string Status { get; private set; }

    public ProgressEventArgs(string status)
    {
        Status = status;
    }
}
 

21voto

svick Points 81772

Vous n'avez pas créé un événement. Pour cela, il faut écrire:

public event EventHandler<Progress> Progress;

Ensuite, vous pouvez appeler Progress à partir de l'intérieur de la classe où il a été déclaré comme une fonction normale ou son délégué:

Progress(this, new Progress("some status"));

Donc, si vous voulez faire rapport des progrès en TestClass, l'événement devrait être là aussi, et il devrait être aussi statique. Vous pouvez vous inscrire à partir de votre formulaire comme ceci:

TestClass.Progress += SetStatus;

Aussi, vous devriez probablement renommer Progress de ProgressEventArgs, de sorte qu'il est clair qu'il est.

9voto

Josh Russo Points 678

Comme cela a déjà été mentionné, le champ de progression a besoin du mot-clé event

 public event EventHandler<Progress> progress;
 

Mais je ne pense pas que ce soit là que vous souhaitiez réellement votre événement. Je pense que vous voulez réellement l’événement dans TestClass . A quoi ressemble ce qui suit? (Je n'ai jamais vraiment essayé de configurer des événements statiques, donc je ne sais pas si ce qui suit va compiler ou non, mais je pense que cela vous donne une idée du modèle que vous devriez viser.)

 public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        TestClass.progress += SetStatus;
    }

    private void SetStatus(object sender, Progress e)
    {
        label1.Text = e.Status;
    }

    private void button1_Click_1(object sender, EventArgs e)
    {
         TestClass.Func();
    }

 }

public class TestClass
{
    public static event EventHandler<Progress> progress; 

    public static void Func()
    {
        //time consuming code
        OnProgress(new Progress("current status"));
        // time consuming code
        OnProgress(new Progress("some new status"));            
    }

    private static void OnProgress(EventArgs e) 
    {
       if (progress != null)
          progress(this, e);
    }
}


public class Progress : EventArgs
{
    public string Status { get; private set; }

    private Progress() {}

    public Progress(string status)
    {
        Status = status;
    }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X