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

Windows Forms Discussion :

[C#] DataError avec FormatedValue d'une cellule de DataGrigdView


Sujet :

Windows Forms

  1. #1
    Membre régulier Avatar de beren.kei
    Inscrit en
    Mai 2008
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Mai 2008
    Messages : 135
    Points : 123
    Points
    123
    Par défaut [C#] DataError avec DataGrigdView, problème de point / virgule comme séparateur décimal
    Bonjour à tous !

    Ca fait bien deux bonnes heures que je me bats avec mon dataGridView, alors je viens vers vous

    j'ai défini à ma colonne de mon DGV un Format de type Numérique à 2 décimales, l'affichage des valeurs se fait donc "xx,00" avec des valeurs "Decimal"... très bien, c'est ce que je veux ^^

    mon soucis... c'est que je veux que cette colonne soit modifiable par l'utilisateur, sauf que si il change les chiffres.... forcément, pour faire la virgule on utilise le point du pavé numérique, et la... J'ai une jolie erreur
    System.Format.exception...
    J'ai tenté de remplacer ce . par une , mais apparemment la propriété qui est utilisée pour le formatage est "FormattedValue" et cette propriété est en lecture seule... donc pas de .replace(".", ",") possible...

    j'ai testé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private void MonDgv_CellParsing(object sender, DataGridViewCellParsingEventArgs e)
            {
                DataGridViewCell uneCell = MonDgv.Rows[e.RowIndex].Cells[e.ColumnIndex];
                if (e.ColumnIndex == 4 || e.ColumnIndex == 5)
                {
                    if (uneCell.Value != null)
                    {
                        uneCell.Value = uneCell.EditedFormattedValue.ToString().Replace(".", ",");
                    }
                }
            }
    mais ca ne fonctionne pas mieux... au pas à pas, j'effectue ces action, mais l'erreur se fait après...

    si quelqu'un à une solution, je suis preneur de toute aide !!!


    edit : personne n'a de solutions ??

    "- Mais à quoi ça sert IE ?
    - à télécharger Firefox ! "

  2. #2
    Membre régulier Avatar de beren.kei
    Inscrit en
    Mai 2008
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Mai 2008
    Messages : 135
    Points : 123
    Points
    123
    Par défaut
    je reviens vers vous, parce qu'apparemment l'erreur ne viendrait même pas du formatage de la colonne !!!

    j'ai enlevé le formatage, re essayé de mettre un nombre à virgule (avec le point du pavé numérique... ) et j'ai quand même le droit à l'erreur !! xD
    donc je me demande... l'erreur peut-elle venir d' un "formatage imposé" par ma source de données ??

    merci de prendre le temps de me lire =)

    "- Mais à quoi ça sert IE ?
    - à télécharger Firefox ! "

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 23
    Points : 26
    Points
    26
    Par défaut
    Une méthode serait de redéfinir l'évènement OnKeyPress sur les cellules de tes colonnes concernées, et modifier le séparateur décimal. Celui-ci étant fonction de la culture courante, il vaut mieux utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                NumberFormatInfo nfi = CultureInfo.CurrentCulture.NumberFormat;
                string strSep = this.nfi.CurrencyDecimalSeparator;
    Ensuite tu surveilles l'arrivée d'un séparateur (virgule ou point) et tu le modifies si nécessaire en comparant avec strSep[0] (il est rare qu'un séparateur décimal fasse plus d'un caractère)

    De cette manière tu devrais traiter ton problème avant l'erreur.

  4. #4
    Membre régulier Avatar de beren.kei
    Inscrit en
    Mai 2008
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Mai 2008
    Messages : 135
    Points : 123
    Points
    123
    Par défaut
    merci pour la réponse ^^

    sauf que... marche pas xD
    en fait, la valeur de uneCell.EditedFormattedValue est en lecture seule, et la mise en forme de la valeur de la cellule se fait à partir de cette propriété...

    je me dis qu'il est quand même étonnant que le gridView n'accepte pas le point du pavé numérique comme séparateur décimal !!!
    N'y aurait-il pas une propriété (cachée ?) du DataGridView que j'aurai ratée malgré mes relectures ??

    j'ai testé de modifier sur le KeyPress, mais ... je rentre pas dans l'évènement keypress >< parce que, à ce moment la ce n'est pas le datagridView, mais la cellule qui as le focus... le truc con...

    "- Mais à quoi ça sert IE ?
    - à télécharger Firefox ! "

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 23
    Points : 26
    Points
    26
    Par défaut
    Ah exact, cela ne fonctionne pas, après une petite recherche, j'ai trouvé une fonction à redéfinir au niveau de tes cellules concernées :

    ParseFormattedValue(...)

    ci dessous le code pour redéfinir la colonne et ses cellules.

    Cette méthode fonctionne, mais je ne pense pas qu'elle soit très orthodoxe, il faudrait regarder ce que fait exactement TypeConverter et le modifier en conséquence, mais le principe est là.


    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
     
     
     
        class DataGridViewTextBoxNumberColumn : DataGridViewColumn
        {
            public DataGridViewTextBoxNumberColumn()
                : base(new DataGridViewTextBoxNumberCell())
            {
     
            }
     
            public override DataGridViewCell CellTemplate
            {
                get
                {
                    return base.CellTemplate;
                }
                set
                {
                    // Ensure that the cell used for the template is a correct Type of Cell.
                    if (value != null &&
                         !value.GetType().IsAssignableFrom(typeof(DataGridViewTextBoxNumberCell)))
                    {
                        throw new InvalidCastException("Must be a DataGridViewTextBoxNumberCell");
                    }
                    base.CellTemplate = value;
                }
            }
            private DataGridViewTextBoxCell TextBoxCellTemplate
            {
                get
                {
                    return (DataGridViewTextBoxNumberCell)this.CellTemplate;
                }
            }
        }
     
        class DataGridViewTextBoxNumberCell : DataGridViewTextBoxCell
        {
     
            public DataGridViewTextBoxNumberCell()
                : base()
            {
                this.Style.NullValue = string.Empty;
            }
     
            public override object Clone()
            {
                DataGridViewTextBoxNumberCell cell = base.Clone() as DataGridViewTextBoxNumberCell;
                return cell;
            }
     
            // Ajout du contrôle séparateur décimal
            public override object ParseFormattedValue(object formattedValue, DataGridViewCellStyle cellStyle, System.ComponentModel.TypeConverter formattedValueTypeConverter, System.ComponentModel.TypeConverter valueTypeConverter)
            {
                string strSep = CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator;
                bool boolAccept = false;
                if (strSep.Length > 0)
                {
                    if (Convert.ToString(formattedValue).Contains(".") == true || Convert.ToString(formattedValue).Contains(",") == true)
                    {
                        if (Convert.ToString(formattedValue).Contains(strSep) == false)
                        {
                            if (strSep == ",")
                            {
                                formattedValue = Convert.ToString(formattedValue).Replace(".", strSep);
                            }
                            else if (strSep == ".")
                            {
                                formattedValue = Convert.ToString(formattedValue).Replace(",", strSep);
                            }
                        }
                    }
                }
     
                return base.ParseFormattedValue(formattedValue, cellStyle, formattedValueTypeConverter, valueTypeConverter);
            }
        }

  6. #6
    Membre régulier Avatar de beren.kei
    Inscrit en
    Mai 2008
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Mai 2008
    Messages : 135
    Points : 123
    Points
    123
    Par défaut toujours coincé...
    merci pour la réponse Sthect !

    mais j'suis toujours bloqué... en fait, j'ai pas exactement tout compris dans ton exemple de code, d'autant plus que ca se trouve (si j'ai bien compris au moins ca !) dans des classes que je préfère éviter de toucher...

    j'ai trouvé un autre exemple de solution, mais en VB, donc j'ai essayé de traduire ca en C# mais je suis bloqué... voici mon code C# :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    private void dgv_Pièces_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
            {
                DataGridViewTextBoxEditingControl voControl = (DataGridViewTextBoxEditingControl)e.Control;
     
                EditingControl_KeyPress(sender, new KeyPressEventArgs(voControl.Text[voControl.Text.Length - 1]));
            }
     
            private void EditingControl_KeyPress(object sender, KeyPressEventArgs e)
            {
                string strSep = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
                if (e.KeyChar == '.' || e.KeyChar == ',')
                    e.KeyChar = strSep[0];
            }
    mais la ou je fait un "new KeyPressEventArgs" ca me va pas ce que j'aimerais avoir ici c'est avoir ceci issu de la touche sur laquelle j'ai appuyé... voilà, c'est encore en test divers et variés, mais je ram bien, donc si quelqu'un à une autre idée...


    une autre piste que j'ai eploré, c'est lors de la mise en forme de la cellue...
    j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private void MonDgv_CellParsing(object sender, DataGridViewCellParsingEventArgs e)
            {
                string strSep = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
                DataGridViewCell uneCell = MonDgv.Rows[e.RowIndex].Cells[e.ColumnIndex];
                if (e.ColumnIndex == 4 || e.ColumnIndex == 5)
                {
                    if (uneCell.Value != null)
                        uneCell.Value = uneCell.EditedFormattedValue.ToString().Replace(".", ",");
                }
            }
    ca fonctionne si je sors de la cellule par "Echap" mais pas par un clic ailleurs ou "entrée"...

    "- Mais à quoi ça sert IE ?
    - à télécharger Firefox ! "

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Février 2011
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Peu être une réponse ...
    Salut,
    Je sais que ça fait longtemps mais j'ai peu être une solution pour ceux à qui ça intéresse.
    Le code n'est peu être pas super propre mais ça marche ...

    Voici mon code pour mon cas particulier (à adapter selon la situation)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    private void dgUtilise_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
            {
                if ((e.ColumnIndex == 8) && (dgUtilise.CurrentCell.EditedFormattedValue.ToString().Contains('.')))
                {
                    string text = dgUtilise.CurrentCell.EditedFormattedValue.ToString().Replace('.', ',');
                    dgUtilise.CurrentCell.Value = text;
                }
            }
    Le principe :
    Sur l'évènement : "CellValidating",
    je remplace la valeur de la cellule : "CurrentCell.Value"
    par la valeur modifier de se que je suis en train d'écrire : CurrentCell.EditedFormattedValue.ToString().Replace('.', ',').

    Voilà

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/09/2014, 20h29
  2. [XL-2010] Insérer une forme géométrique avec texte dans une cellule excel
    Par stephJP dans le forum Excel
    Réponses: 2
    Dernier message: 23/05/2014, 09h31
  3. [XL-2007] Sauvgarde en PDF avec Nom d'une cellule
    Par malababar dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/08/2010, 16h08
  4. Lien hypertexte avec comme adresse une cellule
    Par Benjycool dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 20/01/2009, 12h37
  5. Réponses: 3
    Dernier message: 06/12/2006, 10h01

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