Meilleur auteur de réponses
NumericUpDown.valuechanged

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
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
-
> 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 traitementEnd IfTu n'affecterais la valeur True à cette variable qu'après le chargementde 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 asposté au départ.--Fredfoleide@free.fr
- Marqué comme réponse scalpa mercredi 16 mars 2011 18:30
-
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
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 codesinon 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 -
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
-
> 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 tuverras que l'initialisation du contrôle se traduit par une affectationde sa valeur donc un déclenchement de l'évènement.Tu peux jouer avec des flags, mais ne serait-il pas plus logique demodifier le traitement ?Pourquoi afficher le message systématiquement ? Ce n'est pas seulementquand le min devient supérieur au max ?--Fredfoleide@free.fr
-
Tu peux jouer avec des flags, mais ne serait-il pas plus logique demodifier le traitement ?Pourquoi afficher le message systématiquement ? Ce n'est pas seulementquand le min devient supérieur au max ?--Fredfoleide@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 -
> 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 traitementEnd IfTu n'affecterais la valeur True à cette variable qu'après le chargementde 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 asposté au départ.--Fredfoleide@free.fr
- Marqué comme réponse scalpa mercredi 16 mars 2011 18:30
-
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
-
-
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
-
-