Magazine Internet

Evénements en 5 minutes

Publié le 26 janvier 2010 par Davidyannick

Suite à des questions posées lors de formations que je dispense, la question de la mise en place d’évènements est récurrente.

Afin de répondre d’une manière simple je vais écrire un exemple “from scratch” , l’objectif de cet exemple est de renvoyer des nombres pairs et de les afficher dans une listbox.

Nous allons commencer par nous débarrasser du plus simple, à savoir l’IHM, en effet c’est pour voir le principe et non la beauté :)

Donc voici un exemple simpliste à souhait :

 

Evénements en 5 minutes

Ceci fait nous allons créer une classe MyNumberEventArgs dérivée de EventArgs, celle ci nous permettra de renvoyer les nombres pairs :

   1:  using System;
   2:   
   3:  namespace testEvents
   4:  {
   5:      class MyNumberEventArgs:EventArgs
   6:      {
   7:          public int numReached { get; set; }
   8:   
   9:          public MyNumberEventArgs(int ii)
  10:          {
  11:              this.numReached = ii;
  12:          }
  13:      }
  14:  }

Maintenant créons la classe qui va faire “défiler” les nombres de 0 à 255 " et renvoyer les nombres pairs via un évènement.

Pour commencer nous créons un delegate :

   1:      delegate void NumberReachedEventHandler(object sender, MyNumberEventArgs e);
  Maintenant créons l’event idoine :  
   1:          public event NumberReachedEventHandler NumberReached = null;

Maintenant nous créons une fonction CountIt() qui se compose uniquement d’une boucle qui déclenchera l’évènement quand le nombre sera pair :

   1:          public void CountIt()
   2:          {
   3:              for (int i = 0; i < 255; i++)
   4:              {
   5:                  if (i % 2 == 0)
   6:                  {
   7:                      NumberReached(this, new MyNumberEventArgs(i));
   8:                  }
   9:              }
  10:          }

Ce qui nous donne in fine une classe NumberReached.cs :

   1:  namespace testEvents
   2:  {
   3:      delegate void NumberReachedEventHandler(object sender, MyNumberEventArgs e);
   4:   
   5:      class NumbersReached
   6:      {
   7:          public event NumberReachedEventHandler NumberReached = null;
   8:   
   9:          public void CountIt()
  10:          {
  11:              for (int i = 0; i < 255; i++)
  12:              {
  13:                  if (i % 2 == 0)
  14:                  {
  15:                      NumberReached(this, new MyNumberEventArgs(i));
  16:                  }
  17:              }
  18:          }
  19:      }
  20:  }

Jusque là rien de difficile et pourtant c’est là que beaucoup de personnes bloquent, maintenant nous nous rendons dans le code behind du formulaire, nous commencons par créer une instance de la classe précédente :

   1:          NumbersReached n = new NumbersReached();

Ensuite nous nous abonnons à l’évènement :

   1:              n.NumberReached += new NumberReachedEventHandler(n_NumberReached);

Maintenant pour commencer le décompte il faut appuyer sur le bouton, on écrit simplement :

   1:          private void button1_Click(object sender, EventArgs e)
   2:          {
   3:              n.CountIt();    
   4:          }

Et nous gérons ce qui se passe lorsque l’évènement est déclenché :

   1:          void n_NumberReached(object sender, MyNumberEventArgs e)
   2:          {
   3:              label1.Text = e.numReached.ToString() ;
   4:              label1.Refresh();
   5:              listBox1.Items.Add(e.numReached);
   6:              listBox1.SelectedItem = e.numReached;
   7:              listBox1.Refresh();
   8:          }

Ce qui nous donne un code behind pour le formulaire :

   1:  using System;
   2:  using System.Windows.Forms;
   3:   
   4:  namespace testEvents
   5:  {
   6:      public partial class Form1 : Form
   7:      {
   8:          NumbersReached n = new NumbersReached();
   9:   
  10:          public Form1()
  11:          {
  12:              InitializeComponent();
  13:              n.NumberReached += new NumberReachedEventHandler(n_NumberReached);
  14:          }
  15:   
  16:          void n_NumberReached(object sender, MyNumberEventArgs e)
  17:          {
  18:              label1.Text = e.numReached.ToString() ;
  19:              label1.Refresh();
  20:              listBox1.Items.Add(e.numReached);
  21:              listBox1.SelectedItem = e.numReached;
  22:              listBox1.Refresh();
  23:          }
  24:   
  25:          private void button1_Click(object sender, EventArgs e)
  26:          {
  27:              n.CountIt();    
  28:              
  29:          }
  30:      }
  31:  }

Et voilà, ce n’est pas compliqué du tout, pour les puristes je sais que les noms sont mal choisis, mais j’ai promis en moins de 5 minutes :) et from scratch …

Bon code

PS : si vous préférez les méthodes anonymes, les lambdas, vous pouvez écrire le code behind du formulaire de la sorte :

   1:  using System;
   2:  using System.Windows.Forms;
   3:   
   4:  namespace testEvents
   5:  {
   6:      public partial class Form1 : Form
   7:      {
   8:          NumbersReached n = new NumbersReached();
   9:   
  10:          public Form1()
  11:          {
  12:              InitializeComponent();
  13:   
  14:              n.NumberReached+=(s,e)=>{
  15:                  label1.Text = e.numReached.ToString();
  16:                  label1.Refresh();
  17:                  listBox1.Items.Add(e.numReached);
  18:                  listBox1.SelectedItem = e.numReached;
  19:                  listBox1.Refresh();
  20:              };
  21:          }
  22:   
  23:          private void button1_Click(object sender, EventArgs e)
  24:          {
  25:              n.CountIt();    
  26:              
  27:          }
  28:      }
  29:  }

Voilà amusez vous bien :)


Retour à La Une de Logo Paperblog

A propos de l’auteur


Davidyannick 18 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte

Magazine