IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[C#]Comment créer Evènement qui entraîne Enregistrement?


Sujet :

C#

  1. #1
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 61
    Points : 43
    Points
    43
    Par défaut [C#]Comment créer Evènement qui entraîne Enregistrement?
    Voilà, je débute en C# et j'aimerais créer un évènement qui entraîne un enregistrement.

    Pour cela, j'ai tout d'abord défini une classe qui me permet d,émettre l'évènement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public class emetteur_evenement
    	{
    		public emetteur_evenement()
    		{
    			//
    			// TODO: Add constructor logic here
    			//
    		}
     
    		public delegate void _evtHandler(object sender, evenement_miseajour evt);
     
    		public event _evtHandler eventhandler;
     
    		public virtual void envoyer_evenement(evenement_miseajour even)
    		{
    			 eventhandler(this,even);}
    	}
    Ensuite, j'ai implémenté une classe qui décrit mon évènement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    	public class evenement_miseajour:EventArgs
    	{	private probe changement;
     
    		public evenement_miseajour()
    		{
    		}
     
    		public evenement_miseajour(probe courant)
    		{	changement=courant;
    			//
    			// TODO: Add constructor logic here
    			//
    		}
     
    		//Fonction permettant d'ajouter le nom du probe à l'arbre et le probe ä un objet de stockage 
    		public void diffusion(TreeNode noeud,Stockage stock )
    		{	noeud.Text=changement.lire_nom();
    			stock.ajoute(changement);
    		}
     
    	}
    Enfin, dans une autre classe, j'ai défini mon pool d'évènement et le traitement de l'évènement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    emis.eventhandler+=new emetteur_evenement._evtHandler(traitement_evenement);
     
    public void traitement_evenement(object emis, evenement_miseajour evt)
    		{//evt.diffusion(arbre,tab);
    		treeView1.Nodes.Add(arbre);
    	}
    Le programme passe à la compil mais lors de l'exécution, un message d'erreur indiquant que l'objet n'est pas instancié à la ligne suivante de ma classe émettrice d'évènement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eventhandler(this,even);}
    Si quelqu'un pouvait m'aider, ce serait sympa.

  2. #2
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Bonjour.

    il y a le tutoriel sur les evements qui peux vous aider .
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  3. #3
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    Bonjour,

    J'ai bien regardé le tutoriel mais je ne vois pas mon problème.

    Pour moi, mon objet est biem instancié.

  4. #4
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Normalement en C#, la programmation est ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public virtual void envoyer_evenement(evenement_miseajour even) 
    {
       if( this._eventhandler != null)
       { this._eventhandler(this, even);}
    }
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  5. #5
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    En fait, apparemment mon objet de type
    event
    n'est jamais instancié mais dans aucun exemple traitant des évènements en C#, je n'ai vu une instanciation d'une fonction déléguuée. Je ne comprens pas

  6. #6
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par guillaume16
    En fait, apparemment mon objet de type
    event
    n'est jamais instancié mais dans aucun exemple traitant des évènements en C#, je n'ai vu une instanciation d'une fonction déléguuée. Je ne comprens pas
    C'est pourtant ce que réalise ceci:
    MonInstance.MonEvent += new MonEventHandler(MaMethode);


    Commence par declarer ton Handler en dehors d'une classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    public declare void MonEventHandler(object sender, MonEventArgs e)
    public class MonEventArgs{}
    public class MaClasseQuiUtiliseMonEventHandler
    {
       public MonEventHandler monEvent;
     
       public void Add(//...)
       {
          //effectuer l'opération
          //instancier/initialiser MonEventArgs e avec données à transmettre
          //appeler la procedure qui déclenche l'évènement
          this.OnMonEvent(e);
       }
       //idem pour un Remove ou autre...
     
       public virtual void OnMonEvent(MonEventArgs e) 
       { 
          if(this.monEvent != null) 
          { this.monEvent (this, e);}
       } 
    }
     
     
    //maintenant la consommation de l'évènement
    public class MonApplication
    {
        private MaClasseQuiUtiliseMonEventHandler truc;
        //...
            truc = new MaClasseQuiUtiliseMonEventHandler()
            //...etc...
            truc.MonEvent += new MonEventHandler(truc_MonEvent);
        //...
     
        private void truc_MonEvent(object sender, MonEventArgs  e)
        {
           Console.Write("çà marche! j'ai capturé " + e.ToString());
        }
    }
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  7. #7
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    Voilà, depuis tout à l'heure, je bidouille, je recherche des exemples d'utilisation d'évènement et mon implémentation à l'air bonne. Ce qui ne fonctionne pas est dans cette classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public class emetteur_evenement
    	{
     
     
    		public emetteur_evenement()
    		{
    			//
    			// TODO: Add constructor logic here
    			//
    		}
     
    		public delegate void _evtHandler(object sender, evenement_miseajour evt);
     
    		public event EventHandler eventhandler;
     
    		public virtual void envoyer_evenement(evenement_miseajour even)
    		{	int i;
    			if (eventhandler!=null)
    				eventhandler(this,even);
    			else
    				 i=45;
    				Application.Exit();
    		}
    	}
    }
    eventhandler mon évènement est un objet null. Dans mon cas, mon application est stoppé. J'ai trouvé quelque part :

    Une fois qu'une classe a déclaré un événement, elle peut traiter cet événement exactement comme un champ du type délégué indiqué. Le champ sera null si le client a raccordé un délégué à l'événement ;
    Serait-ce pour cela que ça ne fonctionne pas? Dans le client , je suis bien obligé de raccordé un délégué à mon évènement pour lié le client de mon évènement à l'émetteur, non?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut Re: [C#]Comment créer Evènement qui entraîne Enregistrement?
    Citation Envoyé par guillaume16
    Le programme passe à la compil mais lors de l'exécution, un message d'erreur indiquant que l'objet n'est pas instancié à la ligne suivante de ma classe émettrice d'évènement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eventhandler(this,even);}
    L'objet non instancié est peut-être even et non eventhandler. Ca expliquerais le problème.

    Dans le framework 2, plus besoin de tester si un event est null avant de l'utiliser comme le suggère neguib.

    Une remarque plus générale sur les notations :

    - Toutes les classes du framework commencent par une majuscule, il est plus cohérent de faire de même.
    - Il faut choisir entre souligné et majuscule pour séparer les mots : EvenementMiseAJour ou Evenement_mise_a_jour mais pas evenement_miseajour
    - les mots clés commençant par un souligné désignent en général des membres privés : le nom _evtHandler est déconseillé,

    par exemple MiseAJourHandler serait le delegate de l'événement MiseAJour (le même nom sans 'Handler').
    Mieux vaux utiliser un nom plus explicite que MiseAJour mais à toi de voir

    Je m'arrête là mais tu devrais copier les notations du framework, cela facilite la lecture.
    On ne peut pas faire boire un âne qui n'a pas soif.

  9. #9
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    Salut,

    J'instancie bien even lorsque j'appelle ma fonction envoyer_evenement de ma classe "emmetteur_evenement".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    em.envoyer_evenement(new evenement_miseajour(probe_courant));
    En plus, pour vérifier, je fais un test sur eventhandler et c'est la que l'objet est NULL.


    Une remarque plus générale sur les notations :

    - Toutes les classes du framework commencent par une majuscule, il est plus cohérent de faire de même.
    - Il faut choisir entre souligné et majuscule pour séparer les mots : EvenementMiseAJour ou Evenement_mise_a_jour mais pas evenement_miseajour
    - les mots clés commençant par un souligné désignent en général des membres privés : le nom _evtHandler est déconseillé,

    par exemple MiseAJourHandler serait le delegate de l'événement MiseAJour (le même nom sans 'Handler').
    Mieux vaux utiliser un nom plus explicite que MiseAJour mais à toi de voir
    Désolé, mais je débute avec ce Framework et même em applications de si haut niveau. Je ferais plus attention dorénavant.

  10. #10
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    J'ai un gros doute. Je fais des recherches, je modifie mon code et cela ne fonctionne toujours. Je crois avoir compris pourquoi.

    Est-il possible avec un évènement de mettre à jour les champs d'un objet d'une classe avec les champs d'un objet de même type d'une autre classe?

    Sinon, qu'est qui peut me permettre de faire cela?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 08/05/2013, 11h23
  2. Réponses: 5
    Dernier message: 07/09/2011, 14h12
  3. comment créer une macro d'enregistrements
    Par zalino dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/07/2008, 08h44
  4. [C#] Comment créer une clé d'enregistrement
    Par Oberown dans le forum C#
    Réponses: 21
    Dernier message: 31/10/2007, 16h13
  5. Comment créer un bouton ajouter enregistrement ?
    Par deuval dans le forum VBA Access
    Réponses: 5
    Dernier message: 31/05/2007, 18h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo