Pouquoi mon addition ne fonctionne pas ? [Résolu]

Messages postés
409
Date d'inscription
jeudi 30 juin 2005
Dernière intervention
21 novembre 2013
- - Dernière réponse : cs_casy
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
- 26 févr. 2011 à 14:36
Bonjour,
Plus que novice en vb.net, je me heurte a un souci bien simple mais que je n'arrive pas a résoudre :
il s'agit de l'addition de 2 valeurs d'une textbox
en gros :
le contenu est de type double limité a 2 chiffres après la virgule
Je veux
TextboxC = TextboxA + TextboxB

En VB6, si je fais
 Val(TextboxA) + Val (TextboxB)
, je n'ai pas de souci
en VB.NET (sous VB 2010Express edition), il n'en est pas de même, cela ne fonctionne pas du tout (Val(TextboxA) non déclarée .....
en essayant pour voir
TextboxA.Text + TextboxB.Text
, les 2 valeurs se placent l'une a cote de l'autre sans s'additionner ce qui est logique.
Que se passe t'il ??
Merci bien
Afficher la suite 

Votre réponse

19 réponses

Meilleure réponse
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
3
Merci
tchconst > Vision de VB quelque peu restrictive. Les problèmes évoqués ne sont pas inhérant à VB mais à la programmation en général. Une saisie devrait toujours être controlée, un code devrait toujours être blindé, et ce quelque soit le langage.

Bref c'est un autre débat que l'on ne va pas entamer ici, c'est pas le sujet du fil.

Attila54 >
Voila un code pour la seconde partie de ton problème, et qui du coup va aussi t'expliquer comment résoudre la première partie.
Pour les puristes, c'est un peu du bricolage car le controle de saisie effectué là, est d'une part incomplet et devrait normalement être fait à la saisie
		QNBR.Text = Double.Parse(LstNBR.SelectedItem.ToString().Replace(".", ",")).ToString("0.00")

TextboxNBR2.Text = (Double.Parse(QNBR.Text) + Double.Parse(TextBoxZ.Text.Replace(".", ","))).ToString("0.00")

- 1ere ligne : On prend la valeur sélectionnée dans la listbox sous sa représentation en String, dans laquelle on replace tous les points, symbole décimal américain par des virgules, symbole décimal français.
- On convertie le tout en Double, pour le reconvertir en string avec le format désiré.
- On met le tout dans QNBR
Il va s'en dire que si les valeurs de la listbox sont déjà formatées comme souhaité et qu'il n'y a aucun risque qu'un mauvais symbole décimal soit rencontré, il est inutile de faire tout cela, il suffit de prendre la valeur sélectionné de la listbox sous forme de string et la mettre dans QNBR

- 2eme ligne : Je pars du principe que QNBR ne peut pas être saisi ni modifié par l'utilisateur et qu'il contient un nombre déjà correctement formaté. Je le converti donc simplement en double.
- Pour TextboxZ, je considère qu'il est saisie donc je prend les précaution précédentes avant de convertir en double.
- Une fois l'addition faite, on reconverti le résultat en string au format voulu et on met le tout dans textboxNBR2

Enjoy.

[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 98 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_casy
Messages postés
14323
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
15 décembre 2018
3
Merci
Bonjour,

J'en profite pour préciser qu'il y a aussi TryParse

Dim lValue as Double=0

If Double.TryParse(TextBox1.Text,lValue) Then
'lValue contient la valeur convertie
Else
'Erreur de conversion
End If

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 98 internautes nous ont dit merci ce mois-ci

Commenter la réponse de NHenry
Messages postés
14323
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
15 décembre 2018
3
Merci
Bonjour,

Pour les cases à cocher (option et checkbutton), c'est la touche "espace" qu'il faut utiliser, sinon intercepte la touche "Entrée" du clavier (Event KeyPress)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 98 internautes nous ont dit merci ce mois-ci

Commenter la réponse de NHenry
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
0
Merci
TextboxC.Text = (Double.Parse(TextboxA.Text) + Double.Parse(TextboxB.Text)).ToString


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Commenter la réponse de cs_casy
Messages postés
14323
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
15 décembre 2018
0
Merci
Bonjour,

en .NET, évite les reliquats de VB6, préfères passer par les procédures .NET :
TextBoxResultat.Text=(Double.parse(TextBox1.Text)+Double.parse(TextBox1.Text)).ToString()

Commenter la réponse de NHenry
Messages postés
14323
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
15 décembre 2018
0
Merci
Bonjour,

Casy m'a grillé de 1 seconde mais la réponse est la même, c'est un signe :)

Commenter la réponse de NHenry
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
0
Merci
[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Commenter la réponse de cs_casy
Messages postés
409
Date d'inscription
jeudi 30 juin 2005
Dernière intervention
21 novembre 2013
0
Merci
merci bien a vous 2, je teste cela de suite, j'essaye d'oublier les reliquats mais au debut, ce n'est pas facile de tirer un trait ......
Commenter la réponse de Attila54
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
0
Merci
Pour le oublier plus facilement, tu peux prendre l'habitude de systématiquement décocher la référence Microsoft Visual Basic dans les propriétés de tes projets.

Ne t'inquiète pas, ça va faire mal au début, mais avec le temps ça passe.
Puis le forum sera toujours là pour t'aider.


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Commenter la réponse de cs_casy
Messages postés
409
Date d'inscription
jeudi 30 juin 2005
Dernière intervention
21 novembre 2013
0
Merci
Bon alors le calcul fonctionne mais il m'affiche cette erreur




EXCEPTION NON GEREE
Consultez la fin de ce message pour plus de détails sur l'appel du débogage
juste-à-temps (JIT) à la place de cette boîte de dialogue.

************** Texte de l'exception **************
System.FormatException: Le format de la chaîne d'entrée est incorrect.
à System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt)
à System.Convert.ToDouble(String value)
à Calculateur.visiondepres.ListQ_Click1(Object sender, EventArgs e) dans X:\LOGICIELS\MEDICAUX\CALCULATEUR\VB.NET\projet brut\5\Calculateur vb net avec QFU\Calculateur\visionpres.vb:ligne 387
à System.Windows.Forms.Control.OnClick(EventArgs e)
à System.Windows.Forms.ListBox.WndProc(Message& m)
à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
à System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** Assemblys chargés **************
mscorlib
Version de l'assembly : 4.0.0.0
Version Win32 : 4.0.30319.1 (RTMRel.030319-0100)
CodeBase : file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
----------------------------------------
Calculateur
Version de l'assembly : 1.0.0.0
Version Win32 : 1.0.0.0
CodeBase : file:///X:/LOGICIELS/MEDICAUX/CALCULATEUR/VB.NET/projet%20brut/5/Calculateur%20vb%20net%20avec%20QFU/Calculateur/bin/Debug/Calculateur.exe
----------------------------------------
Microsoft.VisualBasic
Version de l'assembly : 10.0.0.0
Version Win32 : 10.0.30319.1 built by: RTMRel
CodeBase : file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/Microsoft.VisualBasic/v4.0_10.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll
----------------------------------------
System
Version de l'assembly : 4.0.0.0
Version Win32 : 4.0.30319.1 built by: RTMRel
CodeBase : file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Core
Version de l'assembly : 4.0.0.0
Version Win32 : 4.0.30319.1 built by: RTMRel
CodeBase : file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
----------------------------------------
System.Windows.Forms
Version de l'assembly : 4.0.0.0
Version Win32 : 4.0.30319.1 built by: RTMRel
CodeBase : file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
Version de l'assembly : 4.0.0.0
Version Win32 : 4.0.30319.1 built by: RTMRel
CodeBase : file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System.Configuration
Version de l'assembly : 4.0.0.0
Version Win32 : 4.0.30319.1 (RTMRel.030319-0100)
CodeBase : file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Xml
Version de l'assembly : 4.0.0.0
Version Win32 : 4.0.30319.1 built by: RTMRel
CodeBase : file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
System.Runtime.Remoting
Version de l'assembly : 4.0.0.0
Version Win32 : 4.0.30319.1 (RTMRel.030319-0100)
CodeBase : file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Runtime.Remoting/v4.0_4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll
----------------------------------------
mscorlib.resources
Version de l'assembly : 4.0.0.0
Version Win32 : 4.0.30319.1 (RTMRel.030319-0100)
CodeBase : file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_fr_b77a5c561934e089/mscorlib.resources.dll
----------------------------------------
WindowsBase
Version de l'assembly : 4.0.0.0
Version Win32 : 4.0.30319.1 built by: RTMRel
CodeBase : file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/WindowsBase/v4.0_4.0.0.0__31bf3856ad364e35/WindowsBase.dll
----------------------------------------
Microsoft.VisualBasic.PowerPacks.Vs
Version de l'assembly : 10.0.0.0
Version Win32 : 10.0.30319.1
CodeBase : file:///C:/WINDOWS/assembly/GAC_MSIL/Microsoft.VisualBasic.PowerPacks.Vs/10.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.PowerPacks.Vs.dll
----------------------------------------
System.Windows.Forms.resources
Version de l'assembly : 4.0.0.0
Version Win32 : 4.0.30319.1 built by: RTMRel
CodeBase : file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_fr_b77a5c561934e089/System.Windows.Forms.resources.dll
----------------------------------------

************** Débogage JIT **************
Pour activer le débogage juste-à-temps (JIT), le fichier de configuration pour cette
application ou cet ordinateur (machine.config) doit avoir la valeur
jitDebugging définie dans la section system.windows.forms.
L'application doit également être compilée avec le débogage
activé.

Par exemple :

<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>

Lorsque le débogage juste-à-temps est activé, les exceptions non gérées
seront envoyées au débogueur JIT inscrit sur l'ordinateur
plutôt que d'être gérées par cette boîte de dialogue.


j'avoue être perdu la ...... cela veut dire quoi exactement et comment remedier ?

De plus je rencontre le même problème avec une addition mais d'un type un peu particulier
-J'ai une listbox contenant 60 valeurs, j'appelle cette liste LISTNBR
-je clique sur une de ces valeurs, celle ci me déclenche des calculs qui s'affichent dans plusieurs textbox, je veux que la valeur sur laquelle je clique s'affiche dans une textbox QNBR (2 chiffres après la virgule max)
j'ai fait
Private nombre As Double ' valeur choisie dans la Listbox
QNBR.Text = nombre.ToString("0.00")


Je veux ensuite une TextboxNBR2 telle que la valeur de TextboxNBR2 = valeur QNBR + valeur TextboxZ (textbox Z etant remplie par un nombre toujours a 2 decimales max)
QNBR.Text = nombre.ToString ne m'affiche rien je ne vois pas comment traduire en vb :
"Le contenu de QNBR = nombre choisi dans la listNBR"

Merci beaucoup, je dois "reprendre" du vb développé par beaucoup plus aguerri que moi, alors je rame un peu beaucoup ....
Commenter la réponse de Attila54
Messages postés
409
Date d'inscription
jeudi 30 juin 2005
Dernière intervention
21 novembre 2013
0
Merci
ps : je t'ai ecouté casy, j'ai décoché ..... et je suis dans le vent .....
Commenter la réponse de Attila54
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
0
Merci
EXCEPTION NON GEREE
Consultez la fin de ce message pour plus de détails sur l'appel du débogage
juste-à-temps (JIT) à la place de cette boîte de dialogue.

************** Texte de l'exception **************
System.FormatException: Le format de la chaîne d'entrée est incorrect.

Le texte saisie dans une des textbox n'est pas reconnu comme pouvant être converti en un nombre de type Double

Ca sent un problème de point à la place d'une virgule ou inversement.

ps : je t'ai ecouté casy, j'ai décoché ..... et je suis dans le vent .....

Je l'avais dit, ça fait mal au début.

Si tu es trop perdu, recoche. Tu décochera plus tard sur d'autres projets quand tu sera plus à l'aise.


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Commenter la réponse de cs_casy
Messages postés
409
Date d'inscription
jeudi 30 juin 2005
Dernière intervention
21 novembre 2013
0
Merci
Dac pour le probleme, merci de me dire de quoi il retourne, mais comment puis je regler cela ???
Cette boite est arrivée après mes deux additions foireuses


Et comment traduire "Le contenu de QNBR = nombre choisi dans la listNBR" en VB ????
Commenter la réponse de Attila54
Messages postés
10
Date d'inscription
lundi 15 septembre 2008
Dernière intervention
11 octobre 2011
0
Merci
en 2 mots, le message renvoyé est : "Fais gaffe !". Ouaip, chez VB ça veut simplement dire que le code doit être blindé partout et surtout du côté des types de valeurs employés ; il FAUT vérifier chaque type de valeur contenue dans chaque textBox, du genre
if isNumeric(chacun_de_mes_textbox.text) et seulement ensuite procéder aux opérations. Et même qu'un petit Trim() n'y ferait pas de mal. Ce qui fait la force de VB est qu'il gère très bien le doute et il est illusoire de changer les options de vérification de débogage. VB est toujours plus fort que toi. Enfin, plus il y aura de blocs Try mieux ce sera !
tchConst
Commenter la réponse de tchconst
Messages postés
409
Date d'inscription
jeudi 30 juin 2005
Dernière intervention
21 novembre 2013
0
Merci
merci beaucoup, je teste cela au boulot des lundi
eh puis ... si j'osais ..... j'ai un checkbox qui fonctionne parfaitement .. tant qu'on le sélectionne a la souris.
N'y a t'il pas possibilité de cocher la case avec la touche "enter du clavier "
Tks a lot
Commenter la réponse de Attila54
Messages postés
409
Date d'inscription
jeudi 30 juin 2005
Dernière intervention
21 novembre 2013
0
Merci
Impeccable, merci bien pour ta réponse, je teste également ceci des lundi ...
Commenter la réponse de Attila54
Messages postés
8
Date d'inscription
vendredi 17 novembre 2000
Dernière intervention
10 mars 2011
0
Merci
Comment gérer d'ailleurs ces problèmes récurrent de , à la place de . ... Quand même pas avec un Replace(MaString,",",".") systématique, si ? et ça dépend par de l'environnement linguistique de l'OS sur lequel tourne le code ?
Commenter la réponse de chaudakh
Messages postés
14323
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
15 décembre 2018
0
Merci
Bonjour,

Je pense qu'en regardant dans les surcharges de Parse, il y a la possibilité d'ajouter la localisation, regardes.

Commenter la réponse de NHenry
Messages postés
7745
Date d'inscription
mercredi 1 septembre 2004
Dernière intervention
24 septembre 2014
0
Merci
Comment gérer d'ailleurs ces problèmes récurrent de , à la place de . ... Quand même pas avec un Replace(MaString,",",".") systématique, si ? et ça dépend par de l'environnement linguistique de l'OS sur lequel tourne le code ?

Il est évident que, pour un contrôle de saisie "propre", celui-ci devrait être fait à la saisie, directement.

C'est à dire que pour un textbox devant recevoir uniquement un nombre de type double, il faudrait, dans un des évènements KeyDown, KeyUp ou KeyPress, regarder le caractère en cours de saisie et annuler tout ce qui n'est pas autorisé :
- caractère autre que chiffre, signe négatif, symbole décimal de culture actuelle
- signe négatif et symbole décimal s'ils sont déjà présents une fois
- signe négatif si le point d'insertion n'est pas avant le premier caractère du texte
et on peut rajouter si c'est pertinent, un contrôle de dépassement des limites autorisées

Tout ça devant être fait pour chacune des textbox (en adaptant évidemment le contrôle à ce qu'elles doivent contenir)

Une autre solution consiste à laisser une saisie libre, mais avant de lancer un calcul quelconque, procéder à une vérification de l'ensemble des saisies. Mais cette méthode exclue, de fait, des calcul intermédiaire automatiques sur simple saisie ou sélection.

D'autres solutions peuvent être aussi trouvé, mais un minimum de contrôle est nécessaire soit en préventif pour empêcher les erreurs (ce que je viens de décrire), soit en curatif pour corriger les erreurs (code que j'ai donné précédemment).
On peut aussi décider de ne rien faire et de générer une erreur pour l'utilisateur à condition d'intercepter les exceptions pour ne pas planter le logiciel.


[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
Commenter la réponse de cs_casy

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.