Creative Commons BY-NC-ND 2.5Questo sito e tutto il suo contenuto sono distribuiti sotto la licenza Creative Commons Attribuzione - Non Commerciale - Non opere derivate 2.5 Italia e con le condizioni d'uso definite nel disclaimer: siete pregati di leggere entrambi questi documenti prima di usufruire dei contenuti di questo sito. Per alcuni contenuti è necessaria una registrazione gratuita: non è necessario pagare e non è necessario accumulare punteggi per accedere agli articoli e scaricare i sorgenti. Basta solo essere onesti. Se volete che questo sito continui a rimanere attivo, a contribuire ogni giorno alla diffusione della cultura libera, non copiate il materiale per ripubblicarlo in altri luoghi : chi fa questo è solo un miserabile e un perdente. Se volete partecipare su settorezero e rendere le vostre idee, i vostri progetti, fruibili da tutti senza limitazioni, come dovrebbe essere in un paese civile e acculturato, potete farlo tranquillamente.

VB.NET – Accettare in una TextBox soltanto numeri o caratteri predefiniti

Autore: Giovanni Bernardo | Data pubblicazione: 18 dicembre 2008
Categorie: VB.NET

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 Ascii rientra tra quelli consentiti, viene restituito tal quale, se invece il codice Ascii appartiene ad un carattere non ammesso, viene impostato a zero (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).

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

E’ possibile scaricare il codice sorgente degli esempi da questo file:
TextBoxObbligate (626)

textboxobbligate

Articoli che potrebbero interessarti

L'articolo ti è piaciuto o ti è stato utile per risolvere un problema? Supporta e mantieni in vita questo sito, ci basta soltanto un caffè o una birra.
Se desiderate che settorezero continui a rimanere gratuito e fruibile da tutti, non copiate il nostro materiale e segnalateci se qualcuno lo fa

Puoi lasciare un commento, o un trackback dal tuo sito.

  1. Ancora nessun commento.

Devi essere collegato per lasciare un commento.

  1. Ancora nessun trackback
settorezero.com e il logo Zroid™ ©2007÷2012 Giovanni Bernardo - E' vietata la copia e la distribuzione anche parziale dei contenuti di questo sito web senza l'esplicito consenso dell'autore.
I contenuti di settorezero.com sono distribuiti sotto una licenza Creative Commons Attribuzione-Non Commerciale-Non Opere derivate 2.5 Italia a cui vanno aggiunte le condizioni d'uso definite nel disclaimer.
settorezero.com e tutti i suoi contenuti sono tutelati dalla legge sul diritto d'autore per cui i trasgressori sono perseguibili a norma di legge.
Creative Commons BY-NC-ND 2.5
Il tema di questo sito è basato sul tema Fusion per wordpress, realizzato originariamente da digitalnature e fa uso del plugin Wassup per il computo delle statistiche. Per contattare l'autore siete pregati di utilizzare la sezione contatti.
Per essere aggiornato con tutte le novità di settorezero.com seguici anche anche su Facebook Twitter Tumblr Blogspot Youtube.