Pouquoi mon addition ne fonctionne pas ?

Résolu
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 - 24 févr. 2011 à 21:10
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre 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

19 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
25 févr. 2011 à 16:12
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
3
NHenry Messages postés 15116 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 9 mai 2024 159
25 févr. 2011 à 19:27
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

3
NHenry Messages postés 15116 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 9 mai 2024 159
25 févr. 2011 à 20:13
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)

3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
24 févr. 2011 à 21:22
TextboxC.Text = (Double.Parse(TextboxA.Text) + Double.Parse(TextboxB.Text)).ToString


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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
NHenry Messages postés 15116 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 9 mai 2024 159
24 févr. 2011 à 21:22
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()

0
NHenry Messages postés 15116 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 9 mai 2024 159
24 févr. 2011 à 21:23
Bonjour,

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

0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
24 févr. 2011 à 21:25
[i][b]---- Sevyc64 (alias Casy) ----
[hr]# LE PARTAGE EST NOTRE FORCE #/b/i
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
25 févr. 2011 à 10:52
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 ......
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
25 févr. 2011 à 11:00
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
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
25 févr. 2011 à 11:39
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 ....
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
25 févr. 2011 à 11:41
ps : je t'ai ecouté casy, j'ai décoché ..... et je suis dans le vent .....
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
25 févr. 2011 à 12:01
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
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
25 févr. 2011 à 12:58
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 ????
0
tchconst Messages postés 10 Date d'inscription lundi 15 septembre 2008 Statut Membre Dernière intervention 11 octobre 2011
25 févr. 2011 à 15:45
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
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
25 févr. 2011 à 20:11
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
0
Attila54 Messages postés 409 Date d'inscription jeudi 30 juin 2005 Statut Membre Dernière intervention 21 novembre 2013 1
26 févr. 2011 à 13:46
Impeccable, merci bien pour ta réponse, je teste également ceci des lundi ...
0
chaudakh Messages postés 8 Date d'inscription vendredi 17 novembre 2000 Statut Membre Dernière intervention 10 mars 2011
26 févr. 2011 à 14:01
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 ?
0
NHenry Messages postés 15116 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 9 mai 2024 159
26 févr. 2011 à 14:05
Bonjour,

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

0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
26 févr. 2011 à 14:36
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
0
Rejoignez-nous