Procediamo aggiungendo al nostro progetto una nuova classe di nome "NumericTextBox" e facendo in modo che erediti dalla classe TextBox:
namespace CustomControl
{
public class NumericTextBox : TextBox
{ }
}
Inseriamo una property di tipo bool che indicherà se sono permessi o meno numeri negativi:
public bool AllowNegative { get; set; }
Ora nel costruttore della nostra classe intercettiamo l'evento KeyPress:
public NumericTextBox()
{
this.KeyPress += new KeyPressEventHandler(NumericTextBox_KeyPress);
}
Infine andiamo ad implementare il metodo NumericTextBox_KeyPress, nel quale grazie alla classe NumberFormatInfo andremo a discriminare i caratteri del separatore decimale e dei segni positivo/negativo della cultura correntemente impostata:
void NumericTextBox_KeyPress(object sender, KeyPressEventArgs e)
{
string decimalSeparator = NumberFormatInfo.CurrentInfo.NumberDecimalSeparator;
string negativeSign = NumberFormatInfo.CurrentInfo.NegativeSign;
string positiveSign = 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() == negativeSign && ((TextBox)sender).Text == string.Empty)
return;
//se è il segno positivo
else if (e.KeyChar.ToString() == positiveSign && ((TextBox)sender).Text == string.Empty)
return;
//se è il carattere di separatore decimale e questo non è già presente
else if (e.KeyChar.ToString() == decimalSeparator && !((TextBox)sender).Text.Contains(decimalSeparator))
return;
//se è un carattere numerico
else if (char.IsNumber(e.KeyChar))
return;
//in tutti gli altri casi
else
e.Handled = true;
}
A questo punto è possibile inserire la nostra NumeriTextBox nella barra degli strumenti e trascinarla sulla form come un normale controllo:

Selezionando la NumericTextBox, nel tab delle proprietà sarà possibile valorizzare la proprietà AllowNegative precedentemente inserita in modo da permettere o meno l'inserimento di numeri con segno negativo:
Nessun commento:
Posta un commento