Comment remplacer le point par une virgule quand un nombre décimal est saisie avec le pavé numérique dans une cellule d'un DataGridView ?
Merci
Version imprimable
Comment remplacer le point par une virgule quand un nombre décimal est saisie avec le pavé numérique dans une cellule d'un DataGridView ?
Merci
Un peu de recherche et de débrouillardise ?
Code:
1
2
3
4
5 private void dataGridView1_CellValidated(object sender, DataGridViewCellEventArgs e) { dataGridView1[e.ColumnIndex, e.RowIndex].Value = dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString().Replace(".", ","); }
ce n'est pas plutot un probleme de globalisation ?
L'idée de shwin est bonne mais elle ne fonctionne pas puisque j'obtiens toujours l'erreur "Le format de la chaîne d'entrée est incorrect" que ce soit avec l'événement CellValidated ou CellValidating. Pour que ça marche il faudrait que l'événement se produise avant la validation hors je n'ai trouvé aucun événement Cell qui semble se produire avant la validation.
Je pense effectivement que la solution serait du coté de la Globalization. Mon application est pourtant en culture Française mais rien n'y fait.
J'ai également essayé avec l'événement KeyDown du datatgridview pour remplacer le point par une virgule au moment de la saisie mais sans succès.
J'ai un code qui me permettrait d'utiliser les API windows pour capturer la saisie du point pour le remplacer par une virgule mais je pense qu'il doit y avoir plus simple quand même.
Personne ne peut me mettre sur la voie ? :?
Après de longues recherches j'ai trouvé 3 solutions.
Je remercie au passage Tommy C. qui m'a envoyé un email à ce sujet. ;)
1 - Changer la culture du Thread
Le défaut de cette méthode c'est que l'on perd le symbole € (euros)Code:
1
2 Thread.CurrentThread.CurrentCulture=System.Globalization.CultureInfo.InvariantCulture
2- Modifier la base de registre pour changer la clef du séparateur décimal
Le défaut de cette méthode c'est qu'il faut redémarrer le PC et cela influence toutes les applications !Code:
1
2 Currentuse\Control Panel\International\sDecimal
3- Capturer la touche "." du pavé numérique (solution que j'ai choisie)
J'ai mis la propriété Keypreview de mon Winform principal sur True et je lui ai ajouté le code suivant :
Voilà, c'est simple et ça marche avec tous les datagridview de mon application.Code:
1
2
3
4
5
6
7 Private Sub formMain_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown If e.KeyData = Keys.Decimal AndAlso System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator = "," Then e.SuppressKeyPress = True My.Computer.Keyboard.SendKeys(","c) End If End Sub
:D
avec ta methode si je fait SHIFT+. j'obtiens le point voici une methode qui marche mieux
'si l'utilisateur clique sur le point on le remplace par une virgule, et oblige a ecrire du chiffre
If e.KeyChar = "." Then
e.KeyChar = ","
ElseIf e.KeyChar > "9" Or e.KeyChar < "0" Then 'si l'utilisateur clique sur une touche non numerique je bloque la saisie
e.Handled = True
End If
Le problème ce n'est pas trop l'interception du "." pour le transformer en virgule mais plutot de comment l'appliquer à une cellule du dataGridView.Citation:
Envoyé par chris81
Tu mettrais ton code dans quel événement du DataGridView ?
ben en fait la je suis en train de chercher comment faire pour capturer la pression d'une touche lorsque que l'on est dans une cellule du datagridview mais c'est galere
Je vois que tu as compris le problème :mrgreen:Citation:
Envoyé par chris81
Le soucis c'est qu'il n'y a pas non plus d'événement qui se produit avant la validation de la cellule. Si le DataGridView et lié à une datasource il y a une erreur généré par les nombres à virgules.
Il aurait été simple de remplacer le "." par une "," avant la validation et le tour était joué mais aucun événement du DataGridView semble se produire avant la validation.
J'ai essayé CellValidated, CellValidating et KeyDown sans succès. J'ai toujours l'erreur "Le format de la chaîne d'entrée est incorrect".
J'ai donc résolu le problème en capturant la touche "." du pavé numérique au niveau de l'application.
Solution complète :
http://cyrilhome.over-blog.net/article-12619641.html