Home Page Home Page Tips & Tricks Creare una TextBox che accetti solo numeri

Creare una TextBox che accetti solo numeri


Spesso e volentieri capita di dover creare delle maschere Windows in cui inserire dei TextBox leggermente diversi al tipo Standard offerto dal .NET Framework.
Seppur abbastanza completo il Framework non offre controlli molto evoluti (ad eccezione per esempio della DataGrid).
Nasce quindi l'esigenza di modificare il comportamento di alcuni controlli. Vedremo in questo breve Tip come vincolare l'inserimento di soli numeri in un semplice TextBox.



Se in VB.NET il percorso è abbastanza agevole grazie ad una funzione ad-hoc IsNumeric() in C# bisogna ovviare diversamente implementando il corrispettivo di questa funzione che manca.

Per arrivare alla soluzione è necessario fare leva sull'evento KeyPress del TextBox che viene ereditato dalla classe superiore Control. Andremo quindi ad inserire nell'evento KeyPress il seguente codice:

VB.NET
Codice .NET n°1
If (Not IsNumeric(e.KeyChar)) And (Asc(e.KeyChar) <> 8) Then
e.Handled = True
End If


Il codice è molto semplice, ad ogni pressione di un tasto, viene verificato tramite la funzione IsNumeric() se è un numero oppure no. Se è qualcosa diverso da un numero settiamo e.Handled a true; questo permette di notificare alla nostra applicazione che la gestione della pressione del tasto è già stata fatta e di non preoccuparsi più.
C'è un però! Infatti se ci limitassimo solo a verificare questa condizione di "Non Numero" tutti gli altri tasti non darebbero nessun effetto una volta premuti, compreso il DEL utilizzato per cancellare i caratteri.
Avremmo come risultato un TextBox che accetta solo numeri ma se sbagliamo a digitare non si può più tornare indietro. Per risolvere anche questo piccolo problemino verifichiamo inoltre (nell'If) che il tasto premuto non sia il DEL (Codice ASCII 8).
A questo punto siamo a cavallo.

Come anticipato precedentemente il discorso è un po' diverso con il linguaggio C#. Qui infatti non è disponibile la funzione IsNumeric e bisogna scrivere alcune righe in più di codice. Le soluzioni in questo caso sono molteplici, infatti si potevano usare le Regular Expressions o degli IF nested o altro. Abbiamo deciso di provare a fare un parsing del testo/carattere e abbiamo gestito l'eventuale eccezione:

C#
Codice .NET n°2
public bool IsNumeric (string numero) 
{
try
{
Int32.Parse (numero);
return true;
}
catch (FormatException)
{
return false;
}
}


Ora inserendo questa funzione nel codice C# è possibile andare a richiamarla nell'evento KeyPress come fatto in VB.NET in questo modo:

Codice .NET n°3
if (!IsNumeric(e.KeyChar.ToString()) && (((int)e.KeyChar)!=8))  
e.Handled = true;


Copyright © dotNetHell.it 2002-2014
Running on Windows Server 2008 R2 Enterprise, SQL Server 2008 & ASP.NET 3.5