VB.NET – Accettare in una TextBox soltanto numeri o caratteri predefiniti
Si verifica spesso durante la stesura di un programma, la necessità di fare in modo che un utente in una data TextBox sia in grado di digitare soltanto numeri interi, soltanto lettere ecc. Anche se in effetti il controllo sul testo immesso può essere effettuato successivamente, è più comodo limitare direttamente la scelta nella TextBox. In questo articolo spiego l’espediente che utilizzo io nei miei programmi, tra l’altro molto semplice da implementare e molto versatile dal momento che permette di fare in modo da accettare in una TextBox soltanto ciò che vogliamo. Per far questo utilizzo l’evento KeyPress della textbox, e l’oggetto System.Windows.Forms.KeyPressEventArgs, e più precisamente la sua proprietà KeyChar che contiene il tasto digitato, per controllare il tasto digitato faccio riferimento al suo codice ASCII: se il codice rientra tra quelli consentiti, viene restituito tal quale, se invece il codice appartiene ad un carattere non ammesso, viene impostato a NULL in maniera tale che nella TextBox non appaia nulla. Passiamo subito agli esempi pratici, il funzionamento è illustrato nei commenti del codice, ho messo la massima cura nella realizzazione prevedendo tutte le cose che non si possono fare (esempio: nel digitare un numero decimale, non è possibile digitare il punto più di una volta).
Indice dei contenuti
Consentire la sola immissione di numeri interi
Private Sub txtOnlyInteger_KeyPress(ByVal sender As Object, _ ByVal e As System.Windows.Forms.KeyPressEventArgs) _ Handles txtOnlyInteger.KeyPress ' Accetto solo l'immissione di numeri interi ' Recupero il codice ascii del tasto digitato ' il tasto digitato è memorizzato nella proprietà "KeyChar" ' dell'oggetto System.Windows.Forms.KeyPressEventArgs Dim KeyAscii As Short = Asc(e.KeyChar) ' I numeri interi hanno il codice ascii compreso tra ' 48 e 57. Devo comunque fare in modo che l'utente ' sia in grado di digitare anche il tasto BackSpace ' (ascii=8) e il tasto Canc (ascii=24), se il codice ' ascii non rientra in quelli ammessi, lo imposto io ' su Zero, che è il carattere nullo. If KeyAscii < 48 And KeyAscii <> 24 And KeyAscii <> 8 Then KeyAscii = 0 ElseIf KeyAscii > 57 Then KeyAscii = 0 End If ' Aggiungo un'ulteriore finezza facendo in modo che lo ' zero sia ammesso, ma non come primo carattere, lo faccio ' controllando la lunghezza del testo If e.KeyChar = "0" And txtOnlyInteger.TextLength = 0 Then KeyAscii = 0 End If ' Alla fine reimposto il KeyChar, che sarà uguale a zero ' per i caratteri non consentiti (e quindi nella TextBox ' non comparirà nulla) e.KeyChar = Chr(KeyAscii) End Sub |
Consentire la sola immissione di numeri interi e numeri decimali
Private Sub txtOnlyDecimal_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtOnlyDecimal.KeyPress ' Accetto solo l'immissione di numeri interi e decimali ' Recupero il codice ascii del tasto digitato ' il tasto digitato è memorizzato nella proprietà "KeyChar" ' dell'oggetto System.Windows.Forms.KeyPressEventArgs Dim KeyAscii As Short = Asc(e.KeyChar) ' In questo caso oltre a consentire numeri, tasto Canc ' e tasto BackSpace, devo consentire anche l'immissione ' del punto e della virgola If KeyAscii < 48 And KeyAscii <> 24 And KeyAscii <> 8 And e.KeyChar <> "." And e.KeyChar <> "," Then KeyAscii = 0 ElseIf KeyAscii > 57 Then KeyAscii = 0 End If ' Faccio in modo che se l'utente digita la virgola ' mi appaia il punto If e.KeyChar = "," Then KeyAscii = 46 ' 46 è il codice ascii del punto End If ' Il punto è si consentito ' ma non come primo carattere If txtOnlyDecimal.TextLength = 0 And KeyAscii = 46 Then KeyAscii = 0 End If ' ovviamente se c'è già un punto ' non è consentito digitarne altri If (KeyAscii = 46) And _ txtOnlyDecimal.Text.IndexOf(".") > 0 Then KeyAscii = 0 End If ' Reimposto il keychar e.KeyChar = Chr(KeyAscii) End Sub |
Consentire la sola immissione di lettere
Private Sub txtOnlyLetters_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtOnlyLetters.KeyPress ' Accetto solo l'immissione di lettere Dim KeyAscii As Short = Asc(e.KeyChar) ' Le lettere maiuscole hanno i codici ascii tra ' 65 e 90, quelle minuscole tra 97 e 122. ' Devo comunque fare in modo che l'utente ' sia in grado di digitare anche il tasto BackSpace ' (ascii=8) e il tasto Canc (ascii=24) If KeyAscii < 65 And KeyAscii <> 24 And KeyAscii <> 8 Then KeyAscii = 0 ElseIf KeyAscii > 90 And KeyAscii < 97 Then KeyAscii = 0 ElseIf KeyAscii > 122 Then KeyAscii = 0 End If ' Reimposto il KeyChar e.KeyChar = Chr(KeyAscii) End Sub |
Di esempi è possibile farne a miliardi, ma dal momento che il meccanismo penso l’abbiate capito, ognuno sarà in grado di personalizzare le sub come meglio crede, magari avendo a portata di mano una tabella con i codici ascii