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

ASP.NET Discussion :

EventHandler not set ?


Sujet :

ASP.NET

  1. #1
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 174
    Par défaut EventHandler not set ?


    J'utilise un EventHandler dans un setters pour propager un changement de valeur.

    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
     
    		public EventHandler OnTotalChanged;
     
    		private double _total;
    		public double Total
    		{
    			get
    			{
    				object o = _total;
    				return o == null?0:_total;
    			}
    			set
    			{
    				_total += value;	
    				//previent les abonnés que le total a ete modifie
    				OnTotalChanged(value,EventArgs.Empty);
    			}
    		}
    Seulement j'ai un plantage "Object reference not set to an instance of an object." ?!?

    le paramètre value est bien rempli et normalement je n'ai pas besoin d'initiliser un event ?

    What's matter ?

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 68
    Par défaut
    Dans le cas présent, tant qu'aucun évènement n'est attaché à OnTotalChange, le Handler est null. En effet, un EventHandler n'est rien d'autre qu'un délégué. Certe, une instance sera crée lors d'une première affectation d'un évènement, mais en attendant, dans le code il faut bel et bien s'assurer de l'existance d'une telle instance.

    Généralement on utiliserait plutôt un code qui ressemblerait au suivant :

    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
    publicclassTotalChangeEventArgs : EventArgs
    {
      publicdouble NewValue = 0;
    }
     
    publicdelegatevoidTotalChangeEventHandler(object Sender, TotalChangeEventArgs e);
     
     
    ...
     
     
    publicevent TotalChangeEventHandler OnTotalChanged;
     
    protectedvoid DoTotalChange()
    {
      if(OnTotalChanged!=null)
      {
           TotalChangeEventHandler e = new TotalChangeEventsArgs();
           e.NewValue = Total;
           OnTotalChanged(this,e); 
      }
    }
     
    privatedouble _total;
    publicdouble Total
    {
      get
      {
           object o = _total;
           return o == null?0:_total;
      }
      set
      {
           _total += value; 
           DoTotalChange();
      }
    }
    
    Au passage, il faut éviter d'utiliser le sender pour tansmetre des valeurs. Il vaut mieux respecter les conventions. Le sender permet de transmetre la référence de l'objet éméteur de l'évènement, l'EventArgs permet lui de transmettre tou le reste.

  3. #3
    Membre chevronné
    Inscrit en
    Juin 2007
    Messages
    459
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 459
    Par défaut
    Quand tu notes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public EventHandler OnTotalChanged;
    voulais-tu noter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public event EventHandler TotalChanged;
    Si oui, tu dois vérifier qu'une inscription a été faite sur ton événement en testant simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (this.TotalChanged!= null)
    {
       // une inscription existe. Il faut déclencher l'événement.
       this.TotalChanged(...)
    }
    Attention à tes nommages (réserve la notation OnTotalChanged pour la méthode surchargeable déclenchant l'événement). De plus, le premier argument de l'événement devrait être l'élément qui a déclenché l'événement (couramment nommé sender). Si tu veux envoyer ton total, définis alors un nouveau jeu d'argument TotalChangedEventArgs.

  4. #4
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 174
    Par défaut
    Merci pour ces réponses rapides

    J'ai utilisé la value à la place du sender car je ne voulais pas créer toute les fonctions délégués et utiliser ce que le frameworks me proposait ([Mode Fainéant : ON] )

    Visiblement, il faut, même pour un évènement avec juste un paramètre, recréer toute l'architecture de l'événement.

    C'est testé et maintenant ça marches au poil

  5. #5
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 174
    Par défaut
    Citation Envoyé par mlebreton Voir le message
    Dans le cas présent, tant qu'aucun évènement n'est attaché à OnTotalChange, le Handler est null. En effet, un EventHandler n'est rien d'autre qu'un délégué. Certe, une instance sera crée lors d'une première affectation d'un évènement, mais en attendant, dans le code il faut bel et bien s'assurer de l'existance d'une telle instance.

    Généralement on utiliserait plutôt un code qui ressemblerait au suivant :

    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
    publicclassTotalChangeEventArgs : EventArgs
    {
       publicdouble NewValue = 0;
    }
     
    publicdelegatevoidTotalChangeEventHandler(object Sender, TotalChangeEventArgs e);
     
     
    ...
     
     
    publicevent TotalChangeEventHandler OnTotalChanged;
     
    protectedvoid DoTotalChange()
    {
       if(OnTotalChanged!=null)
       {
            TotalChangeEventHandler e = new TotalChangeEventHandler();
            e.NewValue = Total;
            OnTotalChanged(this,e); 
       }
    }
     
    privatedouble _total;
    publicdouble Total
    {
       get
       {
            object o = _total;
            return o == null?0:_total;
       }
       set
       {
            _total += value; 
            DoTotalChange();
       }
    }
    
    Au passage, il faut éviter d'utiliser le sender pour tansmetre des valeurs. Il vaut mieux respecter les conventions. Le sender permet de transmetre la référence de l'objet éméteur de l'évènement, l'EventArgs permet lui de transmettre tou le reste.
    En relisant c'est TotalChangeEventsArgs e = new TotalChangeEventsArgs(); et non TotalChangeEventHandler sinon ça ira pas loin:p

  6. #6
    Membre chevronné
    Inscrit en
    Juin 2007
    Messages
    459
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 459
    Par défaut
    Evidemment, il y a souvent une charge importante de travail à respecter des "standards", des "bonnes pratiques". Mais il faut à mon avis toujours avoir la maintenance à l'esprit. Qui se souviendra dans ce cas particulier que le sender est ton total ? Dans un mois, pas même toi... Bon courage !

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 68
    Par défaut
    Citation Envoyé par User.Anonymous Voir le message
    En relisant c'est TotalChangeEventsArgs e = new TotalChangeEventsArgs(); et non TotalChangeEventHandler sinon ça ira pas loin:p
    merci User.Anonymous, j'ai corrigé cette faute d'inatention dans le post correspondant.

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

Discussions similaires

  1. [VBA-E] Erreur "Object variable or With block variable not set"
    Par @lex(is) dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 08/06/2006, 12h39
  2. Réponses: 1
    Dernier message: 20/04/2006, 12h09
  3. Eclipse + Birt = MOZILLA_FIVE_HOME not set
    Par n!co dans le forum BIRT
    Réponses: 2
    Dernier message: 13/03/2006, 15h10
  4. Réponses: 3
    Dernier message: 23/01/2006, 16h29
  5. [Génération] The dialect was not set
    Par sylvain_neus dans le forum Hibernate
    Réponses: 8
    Dernier message: 17/03/2004, 10h57

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