Come prima cosa aggiungiamo al nostro progetto una nuova classe che chiameremo “NumericTextBox”  facendo in modo che la stessa  erediti dalla classe TextBox in questo modo :

namespace ControlliPersonalizzati
{
    public class NumericTextBox : TextBox{ }
}

Ora aggiungiamo una proprietà alla classe di tipo bool che ci servirà ad indicare se nella TextBox sono permessi o meno numeri negativi :

public bool AccettaNegativi { get; set; }

A questo punto dobbiamo intercettare l’evento KeyPress del textbox, e lo facciamo nel costruttore della nostra classe in questo modo :

public NumericTextBox()
{
   this.KeyPress += new KeyPressEventHandler(NumericTextBox_KeyPress);
}


Infine implementiamo il metodo NumericTextBox_KeyPress, nel quale grazie all’ aiuto  classe NumberFormatInfo andiamo a discriminare i caratteri del separatore decimale e dei segni positivo/negativo della cultura correntemente impostata:

void NumericTextBox_KeyPress(object sender, KeyPressEventArgs e)
{
            string separatoreDecimale = NumberFormatInfo.CurrentInfo.NumberDecimalSeparator;
            string segnoNegativo = NumberFormatInfo.CurrentInfo.NegativeSign;
            string segnoPositivo = NumberFormatInfo.CurrentInfo.PositiveSign;
            //se è un carattere di tipo controllo
            if (char.IsControl(e.KeyChar))
                return;
                //se è il segno negativo
            else if (AllowNegative && e.KeyChar.ToString() == segnoNegativo && ((TextBox)sender).Text == string.Empty)
                return;
                //se è il segno positivo
            else if (e.KeyChar.ToString() == segnoPositivo && ((TextBox)sender).Text == string.Empty)
                return;
                //se è il carattere di separatore decimale e questo non è già presente
            else if (e.KeyChar.ToString() == separatoreDecimale && !((TextBox)sender).Text.Contains(separatoreDecimale))
                return;
                //se non è un carattere numerico
            else if (char.IsNumber(e.KeyChar))
                return;
                //in tutti gli altri casi
            else
                e.Handled = true;
}


Ora, aggiungendo la nostra NumericTextBox alla barra degli strumenti, possiamo usarla come un qualsiasi componente.

last [C# Custom Controls] : Come creare una TextBox che accetti solo caratteri di tipo numerico