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 :

Controler la saisie dans un dataGridView


Sujet :

C#

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 241
    Points : 132
    Points
    132
    Par défaut Controler la saisie dans un dataGridView
    Bonjour,
    J'utilise un dataGridVieW, pour afficher et modifier des données. Comme je dois controler la validité de la saisie ( données appartement à une certaine fourchette, saisie de référence existant dans une autre table, etc ), j'ai effectué un controle sur l'évenement CellLeave. J'arrive bien à mettre en évidence l'erreur de saisie, le probleme est que dans ce cas là, il faut replacer la celulle active sur la celulle quittée ( dataGrid.CurrentCel == xxxx ). Je tombe sur un bug insoluble, car l'évenement CellLeave est suivi de l'évenement CellEnter sur la celulle suivante, et entre temps j'ai assigné dataGrid.CurrentCell à la celulle qui vient d'etre quittée. Je reçois une erreur "Appel à une procedure réentrante". je comprends à peu prés ce qu'il se passe. Avant de faire exécuter dataGrid.CurrentCell = "retour à la celulle d'origine", il faudrait que l'évenement CellLeave soit entièrement traité, et que l'évenement CellEnter sur la celulle suivante soit lui aussi terminé. Comme je n'ai pas trouvé d'évenement CellFocus, je ne vois vraiment pas ou placer ma ligne de commande pour un retour à la celulle de départ. Sinon existe il un moyen de vider la file d'attente des évenements, pour supprimer l'éxécution du CellEnter ? Mais là comme solution ça me parait scabreux.
    Merci pour le coup de main.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    s'il te manque la touche la plus importante du clavier, tu devrais quand meme en racheter un ! parce que c'est illisible ...


    sinon il existe une autre méthode pour la saisie dans un grid
    il est possible de lui dire qu'on veut gérer soit meme le déclenchement de l'édition
    via l'instruction beginedit (cherche dans l'aide pour comprendre le mécanisme)

    ensuite on se prend un evenement à la fin de l'édition


    sinon tu mets des flag (valeurs booléennes)
    qui servent à dire que t'es en train de faire un truc et que faut pas que tu fasses tel autre tant que c'est pas fini

  3. #3
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    J'utilise un dataGridVieW, pour modifier des données.
    J'ai aussi essayé et finalement renoncé : trop mal foutu pour une saisie avec des contrôles utilisateurs.
    Maintenant, je bascule sur un formulaire de saisie classique pour l'ajout et la modification.

  4. #4
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 241
    Points : 132
    Points
    132
    Par défaut
    Bonsoir,

    Pour sperot51,

    J'ai essayé, bien sur, de passer par le BeginEdit EndEdit, cela ne change rien au probleme. Pour qu'une saisie soit testée, il faut que l'utilisateur ait terminé sa saisie, donc qu'il quitte la celulle.

    D'ou enchainement des événements CellLeave, CellEnter

    Que l'on place le teste en EndEdit, en CellLeave ou un CellEnter le probleme reste le même. Visual C# n'admet pas que l'on change par programme la celulle active au moment d'un changement de celulle.

    Mettre des flags n'apporte rien non plus pour les mêmes raisons.

    Pour Graffito,

    Comme tu as l'air d'avoir rencontré les mêmes problèmes que moi, autant utiliser ta solution.
    Maintenant, qu'est ce que tu entends par formulaire de saisie classique ?
    J'ai besoin de faire de la saisie en ligne-colonne, comme dans un tableau excel par exemple.
    C'est pour de la saisie de lignes de commande.

    Merci.

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    il est possible de tester la saisie pendant que l'utilisateur saisie
    le datagridview nous donne accès via editcontrol je crois
    il suffit ensuite de le caster sur un textbox pour handler keypress par exemple


    sinon la solution de graffito ne t'irais pas je pense car il doit ouvrir un genre d'inputbox par double clic sur une cellule, donc plutot lent pour un truc genre excel


    mais sinon j'ai pas trop compris ou ca coince ton histoire, donc je vois pas trop pour l'instant d'autres solutions
    si tu pouvais nous remettre le pavé avec un peu de formatage et en explicitant 1 ou 2 points ...

  6. #6
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Maintenant, qu'est ce que tu entends par formulaire de saisie classique ?
    Une forme modale avec boutons [OK] et [Cancel], avec TextBox pour chaque champ.

    En fait, j'ai aussi une forme par défaut, qui est une deuxiéme DataGridView avec une seule ligne de saisie validée par OK/Cancel et dont le contenu est reporté dans le DataGridView de Visualisation qui est Read-only.

  7. #7
    Membre averti Avatar de Contrec
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations forums :
    Inscription : Mars 2005
    Messages : 597
    Points : 342
    Points
    342
    Par défaut
    Tu peux utiliser l'event CellValidating

    Si la cellule correspond au format que tu veux, rien ne se passe. Au contraire, si tu trouve une erreur tu peux annuler la validation de cette cellule et le focus restera dans cette cellule jusqu'a la validation correcte.

    J'utilise principalement les DataGridView et je n'ai aucun probleme. Certes il faut implementer un certain nombre d'event mais c'est comme ca...

  8. #8
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 241
    Points : 132
    Points
    132
    Par défaut Et voici la solution
    Apres beaucoup d'interrogation j'ai fini par trouver.
    D'abord comprendre le phénomene.

    Pour controler une saisie, il faut etre certain que l'utilisateur a terminee sa saisie, donc qu'il a quitté la celulle.
    Il faut donc faire le controle au moment ou il entre d

  9. #9
    Membre habitué
    Inscrit en
    Janvier 2005
    Messages
    241
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 241
    Points : 132
    Points
    132
    Par défaut Et j'ai enfin trouvè !!
    Apres beaucoup d'interrogation j'ai fini par trouver.

    D'abord comprendre le phénomene.

    Pour controler une saisie, il faut etre certain que l'utilisateur a terminee sa saisie, donc qu'il a quitté la celulle.

    Il faut donc faire le controle au moment ou il entre dans une autre celulle.
    Le programme plante lorsqu'aprés detection d'une mauvaise saisie, on change la celulle active ( currentCell) dans l'évenement OnEnter_Cell.
    Il nous sort un message d'erreur du style ' appel reentrant de procedure ..'
    Ce que j'ai fini par interpreter par : "le systeme n'apprécie pas qu'on lui demande de changer de celulle, alors qu'il n'a pas fini de traiter l'évenement OnEnter_Cell".

    L'astuce pour contourner le probleme consiste donc à renvoyer l'utilisateur sur la celulle mal saisie non pas par CurrentCell = ..., mais par envoi de touche clavier
    ( SendKeys.Send("{UP}");SendKeys.Send("+{TAB}");SendKeys.Send("{DOWN}");SendKeys.Send("{TAB}")).
    A traiter selon que l'on est positionner plus haut, plus bas, plus à gauche ou plus à droite de la celulle à atteindre.

    Ces évenements sont placés dans la file d'attente des évenements et traités APRES, que le systeme aura fini de traiter OnEnterCell, et là plus de plantage.

    Ceci nécessite quelques outils:
    Garder bien sur en mémoire la celulle d'où l'on vient.
    Ne pas traiter par un booleen quelconque, l'évenement ONEnter_Cell, dés que l'on commence à envoyer des SendKeys TAB et tant qu'on est pas fini de retourner sur la celulle origine.

    Ce qui peut se résumer par:

    OnEnter_Cell
    {
    if ( !m_bModeSimulationClavier)
    {
    //Controle de la saisie
    Si (saisie mauvaise)
    {
    m_bModeSimulationClavier = true;
    RetourCelulleOrigine();
    }
    }
    else
    {
    Si CelulleActive = CelulleOrigine -> m_bModeSimulationClavier = false;
    }
    }

  10. #10
    Membre averti Avatar de Contrec
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations forums :
    Inscription : Mars 2005
    Messages : 597
    Points : 342
    Points
    342
    Par défaut
    Cela me parait extremement complique pour un simple controle de saisie de valeur dans une cellule...

    Es-tu sur qu'avec les evenements CellVadidating, CellValidated ou CellEndEdit, tu ne peux pas faire ce que tu veux ?

  11. #11
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 346
    Points : 252
    Points
    252
    Par défaut
    Oui je suis d'accord avec Contrec, utilises l'évenement Cellvalidating.
    Voici le lien MSDN qui présente ce que tu souhaites faire:

    Procédure pas à pas : validation des données dans le contrôle DataGridView Windows Forms

    Il y a tout dans la MSDN.
    Bye

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

Discussions similaires

  1. controle de saisie dans une modalPanel
    Par ng.phung dans le forum JSF
    Réponses: 6
    Dernier message: 29/05/2009, 09h21
  2. Controler la saisie dans des textbox
    Par Msysteme dans le forum ASP.NET
    Réponses: 20
    Dernier message: 25/02/2009, 14h56
  3. controler les saisies dans une cellule
    Par lecaire dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/05/2008, 19h14
  4. controle de saisie dans un formulaire
    Par pat06 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 09/12/2007, 17h11
  5. [VBA-E]controle de saisie dans une cellule
    Par greg778 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 03/03/2006, 16h43

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