Bonjour,
Je suis dans une datagrid.
J'aimerai que quand j'edit dans un cellule, quand je tape un point '.' (depuis le pavé numérique) que ce soit la virgule qui soit affichée ','
J'ai déjà passé plusieurs heure de recherche, mais rien de concluant.
Bonjour,
Je suis dans une datagrid.
J'aimerai que quand j'edit dans un cellule, quand je tape un point '.' (depuis le pavé numérique) que ce soit la virgule qui soit affichée ','
J'ai déjà passé plusieurs heure de recherche, mais rien de concluant.
Est ce que tu as créé un événement lié à l’édition des cellules?
Du style : cellule_TextChanged.
Difficile à dire sans connaitre ton projet, mais si tu gères l'evenement de changement de texte, tu pourras dedans ajouter, sur la case en cours de modification un.replace(".",",");

Bonjour,
La solution de Dynamès fonctionne parfaitement, mais ne résout pas le fond du problème. Avec cette solution, si tu dois ajouter d'autres cellules, il faudrait alors remodifier le code pour prendre en compte les nouvelles positions de cellules, etc... De plus, si tu as d'autres champs de type décimales ou double, je suppose que tu aimerais que les mêmes politiques s'appliquent.
Il faut savoir que l'affichage lié à la culture est régi par la propriété CurrentUICulture de la propriété statique Thread.CurrentThread.
La propriété CurrentUICulture est de type CultureInfo. Dedans, on trouve notamment la propriété NumberFormat qui est de type NumberFormatInfo qui contient les politiques d'affichages des nombres comme par exemple, quel est le séparateur des milliers ou encore justement quel est le symbole d'affichage des virgules. Ce paramètre qui t'intéresse est donc NumberDecimalSeparator.
Normalement, par défaut, sur un poste Windows en culture française, ce paramètre est censé être la virgule sauf si dans les paramètres de région du PC on a défini "." au lieu de "," et dans ce cas on se retrouve avec un point au lieu d'une virgule dans NumberDecimalSeparator.
Tu parlais d'une datagrid mais je ne sais pas s'il s'agit de celle de WPF ou de winforms... Après il y a un format à appliquer dans la colonne en fonction de ce que tu veux pour bien faire comprendre au datagrid qu'il s'agit d'un nombre et qu'il doit donc l'afficher selon la politique de la culture de l'UI actuelle. Dans le cas où tu es en WPF, le databinding de la colonne avec une propriété de type double ou decimal résout ce problème direct...
Bonjour,
J'ai oublié de préciser, je suis en WPF sur du databinding (mvvm).
Le replace() pose problème. Je dois le faire durant la validation des données sinon mon curseur se retrouve n'importe ou dans la cellule (mais je ne suis pas contre de l'utiliser :-) ), voici une classe que j'ai récupéré sur le web et adaptée :
et est appliquée de cette manière sur chaque cellule de ma datagrid :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91 using Microsoft.Windows.Controls; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Data; using System.Windows.Input; using System.Windows.Media; namespace GestionGrues.Classe { public static class InputBindingsManager { static InputBindingsManager() { } public static readonly DependencyProperty UpdatePropertySourceWhenEnterPressedProperty = DependencyProperty.RegisterAttached( "UpdatePropertySourceWhenEnterPressed", typeof(DependencyProperty), typeof(InputBindingsManager), new PropertyMetadata(null, OnUpdatePropertySourceWhenEnterPressedPropertyChanged)); public static void SetUpdatePropertySourceWhenEnterPressed(DependencyObject dp, DependencyProperty value) { dp.SetValue(UpdatePropertySourceWhenEnterPressedProperty, value); } public static DependencyProperty GetUpdatePropertySourceWhenEnterPressed(DependencyObject dp) { return (DependencyProperty)dp.GetValue(UpdatePropertySourceWhenEnterPressedProperty); } private static void OnUpdatePropertySourceWhenEnterPressedPropertyChanged(DependencyObject dp, DependencyPropertyChangedEventArgs e) { UIElement element = dp as UIElement; if (element == null) { return; } if (e.OldValue != null) { element.PreviewKeyDown -= element_PreviewKeyDown; element.LostFocus -= element_LostFocus; } if (e.NewValue != null) { element.PreviewKeyDown += element_PreviewKeyDown; element.LostFocus += element_LostFocus; } } static void element_PreviewKeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Enter) { AdapteComma(sender); } static void element_LostFocus(object sender, RoutedEventArgs e) { AdapteComma(sender); } private static void AdapteComma(object sender) { if (sender.GetType() == typeof(System.Windows.Controls.DataGridCell)) { System.Windows.Controls.DataGridCell dtc = (System.Windows.Controls.DataGridCell)sender; dtc.AllowDrop = false; if (((System.Windows.Controls.ContentControl)(dtc)).Content.GetType() == typeof(System.Windows.Controls.TextBlock)) { System.Windows.Controls.TextBlock control = ((System.Windows.Controls.TextBlock)dtc.Content); control.Text = control.Text.Replace(".", ","); } else if (((System.Windows.Controls.ContentControl)(dtc)).Content.GetType() == typeof(System.Windows.Controls.TextBox)) { System.Windows.Controls.TextBox control = ((System.Windows.Controls.TextBox)dtc.Content); control.Text = control.Text.Replace(".", ","); } } else if (sender.GetType() == typeof(System.Windows.Controls.TextBox)) { System.Windows.Controls.TextBox control = (System.Windows.Controls.TextBox)sender; control .Text = control .Text.Replace(".", ","); } } } }
la culture du binding est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7<DataGrid.CellStyle> <Style TargetType="{x:Type DataGridCell}"> <Setter Property="GestionGrue_Classe:InputBindingsManager.UpdatePropertySourceWhenEnterPressed" Value="TextBox.Text" /> </Style> </DataGrid.CellStyle>
Code : Sélectionner tout - Visualiser dans une fenêtre à part Binding="{Binding LPaTot, ConverterCulture=fr-FR}"
J'ai déjà régler le format de la cellule sur "StringFormat=N2", tout ce que ca fait, c'est obliger l'utilisateur à encoder une virgule plutot qu'un point ==> S'il clique sur le point, cela affiche une erreur. il faut donc que l'user la modifie (ca ne va pas).
Ce que je fais actuellement : j'encode une valeur dans la cellule 1 , et la cellule 2 recoit : (cellule1)*2.
Avec la classe ci dessus, cela fonctionne parfaitement, à la validation il me remplace bien le point pas une virgule et la 2 ème cellule est bien modifiée
Comportement étrange : si je clique sur la cellule 2, les valeurs ne sont plus mise à jour lorsque j'encode des valeur dans la cellule 1. En mode débugage la valeur de la cellule 2 à bien été mise à jour.
Lorsqu'on clique UNE PREMIERE FOIS sur une cellule d'une datagrid ==> Il s'agit d'un textblock
Une 2 ème fois ==> il se cast en TEXBOX (mode édition).
si je rentre en mode édition de la cellule 2, je vois bien ma valeur calculée (elle à été mise à jour dans le textbox mais pas le textblock de la cellule de datagrid).
Pouvez-vous m'aider ? je désespère.
J'ai résolé mon problème en modifiant :
par
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6<DataGrid.CellStyle> <Style TargetType="{x:Type DataGridCell}"> <Setter Property="GestionGrue_Classe:InputBindingsManager.UpdatePropertySourceWhenEnterPressed" Value="TextBox.Text" /> </Style> </DataGrid.CellStyle>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6<DataGridTextColumn.CellStyle> <Style TargetType="{x:Type DataGridCell}"> <Setter Property="GestionGrue_Classe:InputBindingsManager.UpdatePropertySourceWhenEnterPressed" Value="TextBox.Text" /> </Style> </DataGridTextColumn.CellStyle>
Au lieu d'attribuer ma classe à l'ensemble des cellule, j'ai tout simplement attribuer cette classe au cellule qui peuvent passer en mode édition et le tour est joué !
Merci à vous pour votre aide ;-)
Partager