DataGridView ed evento KeyPress
Problema : in una griglia, in corrispondenza di una colonna di nome “descrizione”, devo, nel caso il primo carattere inserito nella cella corrisponda a uno dei caratteri presenti in una tabella del tipo
carattere - descrizione ,
sostituire il carattere con la descrizione corrispondente.
Es.
tabella A assegno
B bonifico
M mutuo
se nella griglia, in corrispondenza della colonna “descrizione”, come primo carattere si digita 'A', il carattere 'A' deve essere immediatamente(senza bisogno di premere il tasto INVIO) sostituito dalla parola “assegno”
Soluzione
griglia : controllo DataGridView di nome grdArchivio
1) Nell’evento Form.Load
AddHandler grdArchivio.EditingControlShowing, AddressOf grdArchivio_EditingControlShow
L’evento grdArchivio.EditingControlShowing, che si verifica quando viene visualizzato un controllo per la modifica di una cella, sarà gestito dalla procedura personalizzata grdArchivio_EditingControlShow.
2) Procedura personalizzata grdArchivio_EditingControlShow
Private Sub grdArchivio_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs)
With grdArchivio
If LCase(.Columns(.CurrentCell.ColumnIndex).Name) = "descrizione" Then
txtA = CType(e.Control, TextBox)
AddHandler txtA.KeyPress, AddressOf txtbox_keyPress
Else
RemoveHandler txtA.KeyPress, AddressOf txtbox_keyPress
End If
End With
End Sub
txtA = Ctype(e.Control, TextBox)
il controllo e.control, che ha scatenato l’evento, viene trasformato nella TextBox txta (che eventualmente può essere un controllo nascosto)
AddHandler txtA.KeyPress, AddressOf txtbox_keyPress
l’evento txtA.KeyPress viene gestito dalla procedura txtbox_keyPress
RemoveHandler txtA.KeyPress, AddressOf txtbox_keyPress
l’associazione fatta al punto precedente non vale se la cella non appartiene alla colonna di nome “descrizione”
3) procedura txtbox_keyPress personalizzata
Private Sub txtbox_keyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
Dim trovato As Boolean
Dim i As Integer
Dim x As CODICI
Dim str As String
str = e.KeyChar
trovato = False
If txtA.Text.Length = 0 And str = UCase(str) Then
For i = 0 To listaCodici.Count - 1
x = listaCodici.Item(i)
If str = Trim(x.carattere) Then
str = Trim(x.descrizione) & " "
trovato = True
Exit For
End If
Next
End If
If trovato Then
e.KeyChar = ""
txtA.Clear()
txtA.AppendText(str)
txtA.Refresh()
End If
End Sub
If txtA.Text.Length = 0 And str = UCase(str) Then 'Se il carattere inserito è il primo ed è maiuscolo
allora, se compare in un elenco(listaCodici) del tipo Carattere – descrizione, nella cella viene inserita la descrizione corrispondente
e.KeyChar = "" ‘ annulla il carattere
txtA.AppendText(str)