none
NumericUpDown.valuechanged RRS feed

  • Question

  • Sur une form j'ai deux NumericUpDown et au chargement de celle-ci j'ai trois fois le messagebox qui apparait... sans intervention sur ceux-ci!? Comment l'empêcher?

     Private Sub nudNumMin_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles nudNumMin.ValueChanged
    
      NumberMin = CInt(nudNumMin.Value)
    
      VerifMinMax()
    
     End Sub
    
    
    
     Private Sub nudNumMax_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles nudNumMax.ValueChanged
    
      NumberMax = CInt(nudNumMax.Value)
    
      VerifMinMax()
    
     End Sub
    
     Private Sub VerifMinMax()
    
      Dim tmp As Integer
    
      MessageBox.Show("La valeur maximale doit être supérieure à la valeur minimale.", "Valeur invalide ", MessageBoxButtons.OK)
    
      If NumberMax <= NumberMin Then
    
       tmp = NumberMax
    
       NumberMax = NumberMin
    
       NumberMin = tmp
    
      End If
    
     End Sub
    Si je modifie le sub ainsi, le message n'apparait plus qu'une seule fois:
      Private Sub VerifMinMax()
        RemoveHandler nudNumMax.ValueChanged, AddressOf nudNumMax_ValueChanged
        RemoveHandler nudNumMin.ValueChanged, AddressOf nudNumMin_ValueChanged
        Dim tmp As Integer
        MessageBox.Show("La valeur maximale doit être supérieure à la valeur minimale.", "Valeur invalide ", MessageBoxButtons.OK)
        If NumberMax <= NumberMin Then
          tmp = NumberMax
          NumberMax = NumberMin
          NumberMin = tmp
        End If
      End Sub


    Cordialement Pascal

     http://www.scalpa.info

    • Modifié scalpa samedi 12 mars 2011 14:57 modification du code de verifMinMax
    samedi 12 mars 2011 14:51

Réponses

  • Une solution bien plus propre que des flags serait de ne s'abonner à l'évènement ValueChanged qu'après l'appel à InitializeComponent().

    Ca résoudrait votre problème car au moment de l'affectation de la valeur de départ aucun gestionnaire d'évènement n'existera encore pour le changement de valeur.


    Christophe Argento
    Architecte .Net/Consultant chez Ineat Conseil
    Blog: http://christopheargento.com
    • Marqué comme réponse scalpa mercredi 16 mars 2011 18:30
    mardi 15 mars 2011 01:54
  •  
    > Les flags je ne connais pas.
     
    Dans ton cas ce serait une variable booléenne de la Form, par exemple
    "Ev_actif" qui permettrait d'inhiber le traitement de l'évènement.
    if Ev_actif Then
        'Faire le traitement
    End If
    Tu n'affecterais la valeur True à cette variable qu'après le chargement
    de la Form (en fin de Load cela devrait faire l'affaire).
     > Je crois que mon code n'affiche le message que si Max<Min non?
     
    Le MessageBox.Show est avant le test. Du moins dans le code que tu as
    posté au départ.
     --
    Fred
    foleide@free.fr
     
    • Marqué comme réponse scalpa mercredi 16 mars 2011 18:30
    dimanche 13 mars 2011 12:57
  • InitializeComponent est appelé dans le constructeur de la Form.

    On le voit si on crée un Sub New dans la Form : une ligne d'appel à InitializeCOmponent est insérée automatiquement.

    Christophe propose de placer un AddHandler après cet appel (on peut ne pas le faire dans le New et préférer le Load).

    Donc, dans le code de la Form :

    Sub num_ValueChanged(sender as Object, e as EventArgs) 'SANS le Handles

        'Traitement ...

    End Sub

    et, après le InitializeComponent

    AddHandler num.ValueChanged AddressOf Me.num_ValueChanged

     

    • Marqué comme réponse scalpa mercredi 16 mars 2011 18:30
    mercredi 16 mars 2011 17:27

Toutes les réponses

  • Bonjour,

    c'est parce que vous avez du lui attribuer une valeur une valeur différente de zéro.
    dans form1.Designer.vb vous recherchez votre controle et rechercher la ligne "Me.nudNumMin.Value", vous l'effacer et tester a nouveau votre code

    sinon il faut mettre un flag pour ne pas avoir ce genre de probleme.

    je pense qu'il s'agit un bug sur le contrôle !?!


    Cordialement,
    Xavier
    Alias Troxsa My M@iL
    • Marqué comme réponse scalpa samedi 12 mars 2011 15:37
    • Non marqué comme réponse scalpa samedi 12 mars 2011 15:55
    • Proposé comme réponse supdate mercredi 16 mars 2011 12:04
    samedi 12 mars 2011 15:20
    Auteur de réponse
  • OOps, j'ai répondu trop vite et n'avais pas vu que mon code était aussi obsolète et ne gérait plus les handles des bons NupDown... Désolé.

    Dans le designer de la form j'ai bien mis une valeur de départ à 12 pour l'un et à 15 pour l'autre. Cela semble déclencher l'évènement ValueChanged dans le form Load....

    Arggh !

    Retour à la case départ !

    Mince !


    Cordialement Pascal http://www.scalpa.info
    • Modifié scalpa samedi 12 mars 2011 15:58 erreur
    samedi 12 mars 2011 15:39
  •  
    > Dans le designer de la form j'ai bien mis une valeur de départ à 12 pour
    > l'un et à 15 pour l'autre. Cela semble déclencher l'évènement ValueChanged
    > dans le form Load....
     
    C'est normal. Si tu regardes le contenu du fichier form.designer.vb tu
    verras que l'initialisation du contrôle se traduit par une affectation
    de sa valeur donc un déclenchement de l'évènement.
     
    Tu peux jouer avec des flags, mais ne serait-il pas plus logique de
    modifier le traitement ?
    Pourquoi afficher le message systématiquement ? Ce n'est pas seulement
    quand le min devient supérieur au max ?
     --
    Fred
    foleide@free.fr
     
    samedi 12 mars 2011 16:35
  • Tu peux jouer avec des flags, mais ne serait-il pas plus logique de
    modifier le traitement ?
    Pourquoi afficher le message systématiquement ? Ce n'est pas seulement
    quand le min devient supérieur au max ?
     --
    Fred
    foleide@free.fr
     

    Les flags je ne connais pas.

    Je crois que mon code n'affiche le message que si Max<Min non?


    Cordialement
    Pascal
    http://www.scalpa.info
    samedi 12 mars 2011 17:55
  •  
    > Les flags je ne connais pas.
     
    Dans ton cas ce serait une variable booléenne de la Form, par exemple
    "Ev_actif" qui permettrait d'inhiber le traitement de l'évènement.
    if Ev_actif Then
        'Faire le traitement
    End If
    Tu n'affecterais la valeur True à cette variable qu'après le chargement
    de la Form (en fin de Load cela devrait faire l'affaire).
     > Je crois que mon code n'affiche le message que si Max<Min non?
     
    Le MessageBox.Show est avant le test. Du moins dans le code que tu as
    posté au départ.
     --
    Fred
    foleide@free.fr
     
    • Marqué comme réponse scalpa mercredi 16 mars 2011 18:30
    dimanche 13 mars 2011 12:57
  • Une solution bien plus propre que des flags serait de ne s'abonner à l'évènement ValueChanged qu'après l'appel à InitializeComponent().

    Ca résoudrait votre problème car au moment de l'affectation de la valeur de départ aucun gestionnaire d'évènement n'existera encore pour le changement de valeur.


    Christophe Argento
    Architecte .Net/Consultant chez Ineat Conseil
    Blog: http://christopheargento.com
    • Marqué comme réponse scalpa mercredi 16 mars 2011 18:30
    mardi 15 mars 2011 01:54
  • Bonjour Christophe Argento,

     

    Juste pour savoir cas cela m’intéresse a ce que vous avez dit, comment procédez vous a cette abonnement a l’événement InitializeComponent ?

     

    merci


    Cordialement,
    Xavier
    Alias Troxsa My M@iL
    mercredi 16 mars 2011 17:15
    Auteur de réponse
  • InitializeComponent est appelé dans le constructeur de la Form.

    On le voit si on crée un Sub New dans la Form : une ligne d'appel à InitializeCOmponent est insérée automatiquement.

    Christophe propose de placer un AddHandler après cet appel (on peut ne pas le faire dans le New et préférer le Load).

    Donc, dans le code de la Form :

    Sub num_ValueChanged(sender as Object, e as EventArgs) 'SANS le Handles

        'Traitement ...

    End Sub

    et, après le InitializeComponent

    AddHandler num.ValueChanged AddressOf Me.num_ValueChanged

     

    • Marqué comme réponse scalpa mercredi 16 mars 2011 18:30
    mercredi 16 mars 2011 17:27
  • Houla la bête faute Le messageBox pas au bon endroit.... On va mettre ça sur le compte de la fatigue...;o)

    Merci pour votre aide très constructive à tous.


    Cordialement
    Pascal
    http://www.scalpa.info
    mercredi 16 mars 2011 18:32
  • Je vais donc revoir mon code à la lumière de tout ça; j'avais abandonné et m'étais rabattu sur des textbox numériques....

    Encore merci à tous.

     


    Cordialement
    Pascal
    http://www.scalpa.info
    mercredi 16 mars 2011 18:34