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.NETIf (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#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:
if (!IsNumeric(e.KeyChar.ToString()) && (((int)e.KeyChar)!=8))
e.Handled = true;