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 :

Rétablir la valeur d'une cellule de DataGridView après CellValueChanged


Sujet :

Windows Forms

  1. #1
    Membre habitué Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Points : 131
    Points
    131
    Par défaut Rétablir la valeur d'une cellule de DataGridView après CellValueChanged
    Bonjour,

    Dans mon application, un utilisateur dispose d'un DataGridView. Dans ce DataGridView, il a une colonne éditable où il doit strictement saisir un décimal.

    Afin de vérifier cette saisie, j'ai inscris mon DataGridView à l'évènement CellValueChanged. A chaque modification de valeur, je vérifie via une expression régulière si la saisie est correcte.

    Si ce n'est pas le cas, je souhaiterais rétablir la situation initiale en annulant la saisie de l'utilisateur (son caractère qui ne répond pas aux critères de mon expression régulière). Le problème est que je n'arrive pas à modifier la valeur de ma cellule dynamiquement.

    Je précise que mon DataGridView est relié à un DataTable.

    Voici mon code actuel dans l'évènement CellValueChanged (je ne vous met pas tout) :

    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
     
    coeff = dgvr.Cells[3].Value.ToString();
    if (!System.Text.RegularExpressions.Regex.IsMatch(coeff, @"^\d{1,5}\,?\d{0,2}$"))
    {
    	_FragmentDataGridView.CellValueChanged -= _FragmentDataGridView_CellValueChanged;
     
    	// Suppression du dernier caractère
    	if (coeff.Length > 1)
    		dgvr.Cells[3].Value = coeff.Substring(0, coeff.Length - 1);
    	else
    		dgvr.Cells[3].Value = "";
     
    	// Tentative de refraichissement du DataGridView en veillant a desinscrire le composant à mon evenement
    	dgvr.Cells[3].DataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
    	dgvr.Cells[3].DataGridView.RefreshEdit();
    	_FragmentDataGridView.CellValueChanged += _FragmentDataGridView_CellValueChanged;
     
    	return;
    }
    dgvr est ma cellule concernée dans mon DataGridView.

    Merci pour vos réponses!

  2. #2
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut

    Tu dois utiliser les event cellBeginedit et cellendedit plutot que valuechanged
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    L'évènement CellValidating sert justement à gérer ce genre de choses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private void _FragmentDataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
    {
        if (!IsValid(e.FormattedValue))
        {
            e.Cancel = true;
        }
    }
    L'évènement se produit lors de la validation de la saisie, par exemple lorsque la cellule perd le focus, avant que la valeur ne soit effectivement modifiée dans la DataTable. Le fait de mettre e.Cancel à true invalide la valeur saisie, et le focus reste sur la cellule.

  4. #4
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci Tomlev

    Bon a savoir !
    J'avais toujours utilisé les begin edit et endedit pour faire ca !
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  5. #5
    Membre habitué Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Points : 131
    Points
    131
    Par défaut
    Alors le CellValidating répond en partie à ma question car il empêche bien l'utilisateur de sortir de la cellule du DataGridView avant d'avoir la bonne saisie, c'est déjà un bon point.

    Cependant, le e.cancel n'annule pas la saisie. Savez-vous comment modifier la saisie à la volée dans la cellule du DataGridView?

    Merci pour vos retours.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Tu peux appeler la méthode CancelEdit sur le DGV. Par contre ça met aussi fin au mode d'édition, je sais pas si c'est ce que tu veux...

  7. #7
    Membre habitué Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Points : 131
    Points
    131
    Par défaut
    Nan mais ta solution a été largement suffisante, je n'ai pas utilisé de CancelEdit.

    Le plus important était de bloquer l'utilisateur totalement.

    S'il saisit n'importe quoi, il assume et doit effacer manuellement. lol C'est une manière de ne pas le désorienter en supprimant sa saisie automatiquement.

    Merci encore pour vos réponses!

  8. #8
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut Pour TomLev le specialiste
    Bonjour TomLev

    Sais tu si lors de EndEdit la valeur est DEJA changée dans la datatable ?

    D'une maniere générale sais tu ou l'on peut trouver la chronologie des evenement pour ce genre de questions ?

    Merci à toi
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par olibara Voir le message
    Sais tu si lors de EndEdit la valeur est DEJA changée dans la datatable ?

    D'une maniere générale sais tu ou l'on peut trouver la chronologie des evenement pour ce genre de questions ?
    Je ne connais pas la chronologie exacte des évènements, mais il me semble que c'est l'appel à EndEdit qui applique la modif dans le DataTable. Avant l'appel à EndEdit, la nouvelle valeur n'existe que dans l'éditeur de la cellule. Mais c'est assez facile à vérifier de toute façon...

  10. #10
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Mais c'est assez facile à vérifier de toute façon...
    Oui mais quand on peut s'épagner ce genre de verif a priori on gagne quand meme beaucoup de temps en DEV et parfois en DEBUG !
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  11. #11
    Membre habitué Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Points : 131
    Points
    131
    Par défaut
    Allez travaillons notre culture gé .NET! ^^

    Bonne initiative olibara!

    Si quelqu'un aurait de la doc sur l'enchainement des évènements sur un DataGridView, ça serait assez intéressant en effet.

    Cela participerait à mieux maitriser ce composant parfois obscure pour bon nombre de développeurs. ^^

  12. #12
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci !

    Et c'est vrai que le DataGridview est un composant tres puissant qui gagne a etre connu !

    Je suis tombé dedans quand j'ai commencé la POO avec csharp

    Et franchement c'est incontournable !
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par olibara Voir le message
    Et franchement c'est incontournable !
    C'est clair... mais c'est dommage qu'il soit si "moche", et qu'il ait pas plus de fonctionnalités... Quand tu vois les grid genre DevExpress, Infragistics et cie, le DataGridView parait un peu "cheap" à côté. Heureusement il y a moyen de faire beaucoup mieux en WPF...

  14. #14
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    mais c'est dommage qu'il soit si "moche",

    Je n'osais pas le dire mais tu a raison !
    Cela etant j'ai aussi utilisé le Gridex de Janus

    C'est veaiment tres joli mais franchement rien a voir avec la souplesse d'utilisation du datagridview et TRES cher aussi
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

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

Discussions similaires

  1. je veux récupérer la valeur d'une cellule dans datagridview
    Par yassine-art dans le forum Windows Forms
    Réponses: 2
    Dernier message: 17/04/2013, 10h27
  2. Réponses: 2
    Dernier message: 29/07/2010, 20h51
  3. DataGridView changer la valeur d'une cellule vb2008
    Par chahinaz21 dans le forum VB.NET
    Réponses: 1
    Dernier message: 04/11/2009, 16h56
  4. Réponses: 1
    Dernier message: 06/06/2009, 22h35
  5. [vb2005]Tester la valeur d'une cellule d'un datagridview
    Par stargates dans le forum Windows Forms
    Réponses: 5
    Dernier message: 13/07/2006, 10h09

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