29 mar 2010

C# Custom Controls: NumericTextBox

In questo post vedremo come creare una TextBox personalizzata che accetti in input solo caratteri di tipo numerico, completamente riutilizzabile.

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