Évènements dans un DataGridView - Problème [Résolu]

Signaler
Messages postés
121
Date d'inscription
samedi 4 novembre 2006
Statut
Membre
Dernière intervention
1 juillet 2015
-
Whismeril
Messages postés
14424
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 avril 2020
-
Bonjour à tous,

Je suis actuellement confronté à un petit problème (en fait mon appli ne servira pas si je n'arrive pas à le faire !)...

-J'utilise un contrôle DataGridView
-Les colonnes sont du type DataGridViewTextBoxColumn
-J'assigne un MaxInputLength par colonne

On va prendre par exemple MaxInputLength = 2
Donc je tape '1' puis '2' puis '3'. Le chiffre 3 n'apparait pas ce qui est logique. (Tout va bien jusqu'ici)

Par contre maintenant j'aimerais détecter automatiquement la taille actuelle de la cellule pendant son édition (afin de valider directement) !
Quand je tape '1' puis '2' il doit valider puis passer directement à la cellule suivante !!



En fait je ne suis pas sûr que cela soit possible. J'avoue avoir eu du mal à rechercher les informations qu'il me faut...
Merci si quelqu'un a une idée !

Sébastien

7 réponses

Messages postés
14424
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 avril 2020
365
Rebonjour,

tu peux dériver un datagridview et réécrire le processcomandkey, comme je l'ai fait .

J'ai fait un test on passe dedans en mode édition.


Whismeril
Messages postés
14424
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 avril 2020
365
Bonjour,

ça doit être possible avec les événements KeyDown, KeyPress ou KeyUp

Whismeril
Messages postés
121
Date d'inscription
samedi 4 novembre 2006
Statut
Membre
Dernière intervention
1 juillet 2015

Salut Whismeril,

J'y avait déjà pensé, mais malheuresement il n'existe aucun évènement KeyPress ou autre pour la cellule en mode édition...
L'évènement KeyPress du DataGridView par exemple n'est pas déclenché quand on est en mode édition...

D'où la difficulté !
Messages postés
14424
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 avril 2020
365
Ha j'avoue je n'ai pas essayé...


Whismeril
Messages postés
121
Date d'inscription
samedi 4 novembre 2006
Statut
Membre
Dernière intervention
1 juillet 2015

Merci Whismeril, il fallait y penser dis moi !!
J'ai réussi à faire ce que je voulais faire !


// Voici la dérivée
class Derived_DGV : DataGridView
    {
        public Derived_DGV()
        {
        }

        // Voici une propriété qui correspondra à la longueur actuelle de la cellule.
        protected int CurrentCellLength { get; set; }
        

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            try
            {
                // Si la cellule actuelle n'est pas en mode édition, on ne fait rien
                if (!base.CurrentCell.IsInEditMode)
                {
                    CurrentCellLength = 0;
                    return base.ProcessCmdKey(ref msg, keyData);
                }
                else
                {
                    switch (keyData)
                    {
                        // Pour le moment je catch que les chiffres du pavé numériques
                        case Keys.NumPad0:
                        case Keys.NumPad1:
                        case Keys.NumPad2:
                        case Keys.NumPad3:
                        case Keys.NumPad4:
                        case Keys.NumPad5:
                        case Keys.NumPad6:
                        case Keys.NumPad7:
                        case Keys.NumPad8:
                        case Keys.NumPad9:
                            { 
                                // Incrément par touche appuyée
                                CurrentCellLength += 1;
                                // Je cast en 'DataGridViewTextBoxColumn' pour obtenir le 'MaxInputLength' de la colonne.
                                DataGridViewTextBoxColumn tempDGV_TBC = (DataGridViewTextBoxColumn)base.Columns[base.CurrentCell.ColumnIndex];
                                if (CurrentCellLength == tempDGV_TBC.MaxInputLength)
                                {
                                    // J'arrête l'édition
                                    base.EndEdit();
                                    // Je sélectionne la cellule sur la droite
                                    base.Rows[base.CurrentCell.RowIndex].Cells[base.CurrentCell.ColumnIndex + 1].Selected = true;
                                    // On met la cellule suivante en mode édition
                                    base.BeginEdit(true);
                                    return base.ProcessCmdKey(ref msg, keyData);
                                }
                                else
                                {
                                    return base.ProcessCmdKey(ref msg, keyData);
                                }
                            }
                        default:
                            return base.ProcessCmdKey(ref msg, keyData);
                    }
                }
            }
            catch
            {
                return base.ProcessCmdKey(ref msg, keyData);
            }
        }
    }


Ce code va passer directement dans la cellule suivante.
Ce code n'est pas terminé mais c'est un minimum, grâce à toi (encore une fois) je vais pouvoir continuer (par exemple passer à une nouvelle ligne quand on passe la dernière colonne ;)

Merci beaucoup
Sébastien
Messages postés
14424
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 avril 2020
365
De rien, pense à valider ta réponse ;-).



Whismeril
Messages postés
14424
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 avril 2020
365
Ha ben le temps que je réponde, c'était fait!!!

Whismeril