IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Remplacer le point par une virgule


Sujet :

C#

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur C#
    Inscrit en
    Avril 2011
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur C#
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 348
    Points : 191
    Points
    191
    Par défaut Remplacer le point par une virgule
    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.

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 116
    Points : 158
    Points
    158
    Par défaut
    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(".",",");

  3. #3
    Invité
    Invité(e)
    Par défaut
    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...

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur C#
    Inscrit en
    Avril 2011
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur C#
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 348
    Points : 191
    Points
    191
    Par défaut
    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 :


    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(".", ",");
                }
            }
        }
    }
    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
     
                        <DataGrid.CellStyle>
                            <Style TargetType="{x:Type DataGridCell}">
                                <Setter Property="GestionGrue_Classe:InputBindingsManager.UpdatePropertySourceWhenEnterPressed"
                                        Value="TextBox.Text" />
                            </Style>
                        </DataGrid.CellStyle>
    la culture du binding est :

    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.

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur C#
    Inscrit en
    Avril 2011
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur C#
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 348
    Points : 191
    Points
    191
    Par défaut
    J'ai résolé mon problème en modifiant :

    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>
    par


    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 ;-)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/12/2009, 21h35
  2. [PROC] Remplacer un point par une virgule dans une Proc Tabulate
    Par PAULOM dans le forum SAS Base
    Réponses: 2
    Dernier message: 20/08/2009, 08h36
  3. remplacement du point par une virgule
    Par thierry007 dans le forum Windows Forms
    Réponses: 13
    Dernier message: 13/05/2009, 20h11
  4. remplacer un point par une virgule
    Par paolo2002 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 25/04/2008, 09h43
  5. [C#] Remplacer un point par une virgule
    Par SLicTa dans le forum Windows Forms
    Réponses: 6
    Dernier message: 03/01/2008, 13h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo