VB.NET : Gestire l’evento di pressione dei tasti nelle celle di una DataGridView- Un “CellKeyPress” fatto in casa
Lavorando sulle DataGridView, i più attenti si saranno accorti che tale componente, pur avendo una quantità interminabile di eventi, manca di un evento di tipo “CellKeyPress”, ovvero il gestore di evento relativo alla pressione dei tasti su di una cella.
Tale evento probabilmente non sarà stato inserito dal momento che le celle in una DataGridView possono essere di vari tipi (textbox, checkbox, combobox ecc) e sarebbe stato complicato gestire tale evento per vari tipi di celle. Fortunatamente a tale mancanza si può sopperire creando un gestore d’evento ad-hoc con un paio di procedure.
Supponiamo che la nostra DataGridView si chiami DataGridView1, innanzitutto nell’evento Load del Form definiamo il nostro nuovo gestore d’evento:
AddHandler DataGridView1.EditingControlShowing, AddressOf DataGridView1_EditingControlShowing |
In pratica “dirottiamo” il normale gestore d’evento EditingControlShowing, che si verifica quando viene visualizzato un controllo per la modifica di una cella, su una nostra procedura personalizzata, che abbiamo chiamato DataGridView1_EditingControlShowing.
Definiamo quindi la nostra procedura personalizzata:
Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) ' Trasformo il controllo che ha scatenato l'evento in una textbox Dim txtbox As TextBox = CType(e.Control, TextBox) ' Se c'è un controllo, aggiungo un gestore d'evento If Not (txtbox Is Nothing) Then AddHandler txtbox.KeyPress, AddressOf txtbox_KeyPress End If End Sub |
In questa procedura stiamo intercettando un evento di modifica, dopodichè “convertiamo” il controllo (e.Control) che ha scatenato l’evento in una TextBox, dichiarata tale TextBox, aggiungiamo un gestore d’evento per essa. Il gestore d’evento appena creato, può essere quindi utile per intercettare l’evento KeyPress in una cella di una DataGridView:
Private Sub txtbox_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) ' Questa sub viene richiamata alla pressione di un tasto in una cella ' della nostra datagridview1 MessageBox.Show(e.KeyChar.ToString()) End Sub |
Il valore e in questa sub contiene tutte le proprietà dell’evento KeyPress, la proprietà KeyChar contiene il tasto premuto, e lo si può utilizzare ad esempio per fare in modo che un utente non possa digitare determinati caratteri in una cella, sfruttando le routine già illustrate in un precedente articolo. Quando dichiariamo la textbox nella sub DataGridView1_EditingControlShowing, possiamo addirittura impostarne la proprietà MaxLength in maniera tale che l’utente non possa digitare più di un determinato numero di caratteri nella cella della DataGridView. E’ ovvio che con un codice fatto in questa maniera è possibile sfruttare tutti i normali eventi di una textbox per poterli utilizzare con le celle di una DataGridView.