juin
2014
Gérer l’événement d’un contrôle est une chose basique à laquelle chaque débutant c’est un jour heurté. Une fois que le mécanisme est compris, la chose est en fait assez facile. Mais la chose est un peu moins triviale lorsqu’il s’agissait d’une cellule d’un DataGridView.
En effet, le contrôle DataGridView ne possède pas d’événement CellKeyPress vers lequel on serait tenté de se tourner (je n’entrerai pas dans les détails ici mais c’est en fait tout à fait normal que cet événement ne soit pas présent). Lorsque l’utilisateur édite une cellule, il n’édite en fait pas directement dans le DataGridView. En effet, ce dernier crée et affiche un contrôle en avant plan de la cellule pour permettre l’édition. Et c’est sûr ce contrôle qu’il faut gérer l’événement qui nous intéresse.
Voyons comment cela fonctionne concrètement.
Pour rester concis, disons que nous voulons empêcher toutes autres saisies qu’un nombre entier dans la cellule.
Commençons par écrire la procédure pour gérer la pression de touche proprement dite :
1 2 3 4 5 | Private Sub EditingControl_KeyPress(sender As System.Object, e As System.Windows.Forms.KeyPressEventArgs) If Not Char.IsNumber(e.KeyChar) Then e.Handled = True End If End Sub |
Cela se passe d’explication je pense.
L’astuce consiste maintenant à savoir comment ajouter la gestion de l’événement sur le contrôle d’édition afficher par notre DataGridView. C’est en fait assez simple mais il fallait le savoir. Ce contrôle nous est accessible très facilement via l’événement EditingControlShowing du DataGridView.
Nous pouvons donc maintenant écrire quelque chose dans ce goût-là :
1 2 3 4 5 6 7 8 | Private editingControl As Control Private Sub dgvExample_EditingControlShowing(sender As System.Object, e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles dgvExample.EditingControlShowing If dgvExample.CurrentCell.OwningColumn.Name = "Le nom de la colonne en question" Then editingControl = e.Control AddHandler editingControl.KeyPress, AddressOf EditingControl_KeyPress End If End Sub |
Ici, nous vérifions donc que la colonne que l’utilisateur édite est bien celle qui nous intéresse en vérifiant son nom et si le test est positif, nous nous abonnons donc à l’événement KeyPress de ce contrôle accessible via le paramètre e de l’événement. Et nous conservons une référence vers ce contrôle via la variable editingControl.
Il ne reste plus qu’à nous désabonner à l’événement contrôle une fois que l’édition est finie. Et c’est pour cela qu’il nous fallait garder une référence vers le contrôle en question. Car là, le framework ne nous donne pas « d’accès simplifié ».
1 2 3 4 5 | Private Sub dgvExample_CellEndEdit(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvExample.CellEndEdit If dgvExample.CurrentCell.OwningColumn.Name = "Le nom de la colonne en question" Then RemoveHandler editingControl.KeyPress, AddressOf EditingControl_KeyPress End If End Sub |
Et voilà, nous pouvons à présent empêcher les utilisateurs d’encoder n’importe quoi.