C# - Lavorare con i text box
C#
Alcune proprietà importanti
- CharacterCasing: per convertire i carattari inseriti in maiuscolo / minuscolo.
- PasswordChar: per nascondere i caratteri inseriti con un altro carattere, per esempio '*'.
- ReadOnly: per rendere la TextBox non editabile dall'utente.
- ShortcutsEnabled: per abilitare / disabilitare il funzionamento delle scorciatoie, tra cui Copia, Taglia, Incolla.
Conversione di caratteri
- Aggiungere il codice seguente nell'evento KeyPress del text box e modificare l'evento opportunamente. In questo esempio viene fatta una conversione in maiuscolo, anche se è meglio impostare la proprietà opportuna (vedi paragrafo precedente).
- L'esempio mostra anche come permettere all'utente la digitazione di certi caratteri (il Backspace e il Canc) e come impedire gli altri con la proprietà 'e.Handled = true'.
- Non dimenticare anche di impedire all'utente l'utilizzo del Copia / Taglia / Incolla con la proprietà del paragrafo precedente.
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (Char.IsLetter(e.KeyChar))
e.KeyChar = Char.ToUpper(e.KeyChar);
else if (e.KeyChar == (char)Keys.Back || e.KeyChar == (char)Keys.Clear)
{ }
else
e.Handled = true;
}
- Nel caso di conversioni in maiuscolo o minuscolo, impostare la proprietà 'CharacterCasing'.
Inserimento solo di cifre
- Aggiungere il codice seguente nell'evento KeyPress del text box.
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (Char.IsNumber(e.KeyChar))
{ }
else if (e.KeyChar == (char)Keys.Back || e.KeyChar == (char)Keys.Clear)
{ }
else
e.Handled = true;
}
Inserimento solo di numeri telefonici
- Aggiungere il codice seguente nell'evento KeyPress del text box.
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (Char.IsNumber(e.KeyChar))
{ }
else if (e.KeyChar == (char)Keys.Back || e.KeyChar == (char)Keys.Clear)
{ }
else if (e.KeyChar == '.')
{ }
else if (e.KeyChar == '/')
{ }
else if (e.KeyChar == '-')
{ }
else
e.Handled = true;
}
Intercettare la pressione di un tasto
- Per esempio, per intercettare il 'Return' aggiungere nell'evento KeyDown() del controllo:
if (e.KeyCode == Keys.Return)
{ }
Inserimento di un numero decimale
- Nei programmi di tipo gestionale, spesso è necessario introdurre un controllo TextBox che accetti l'inserimento di un numero decimale, magari controllando il numero di cifre intere e il numero di cifre decimali.
- Una prima soluzione può essere trovata utilizzando il controllo MaskedTextBox. Esso permette di definire una 'maschera' di inserimento ed è molto utile in tutti i casi dove la maschera è fissa (cioè il campo sia riempito esattamente senza spazi o vuoti). Il suo utilizzo per l'inserimenti di numeri decimali non è del tutto soddisfacente.
- La soluzione qua proposta utilizza invece il classico TextBox.
- In questo esempio:
- Si ha il TextBox txt1 e si vuole controllare che l'utente scriva:
- Si vuole che l'utente scriva al massimo 5 cifre intere e 2 cifre decimali.
- Si vuole che l'utente possa utilizzare indifferentemente come separatore decimale la virgola o il punto.
- Si definiscono le seguenti due variabili a livello di form:
int cifreIntere = 5;
int cifreDecimali = 2;
- Nell'evento Form_Load() o nelle proprietà del TextBox, si imposta:
private void Form1_Load(object sender, EventArgs e)
{
txt1.MaxLength = cifreIntere + cifreDecimali + 1;
}
- Si definisce la seguente funzione con due overload. Può essere definita in una classe pubblica oppure nella stessa classe del form dove è collocato il TextBox da controllare.
public static bool CheckDecimalNumber(string textActual, int selStart, int selLength,
char charToInsert, int maxIntegerDigits, int maxDecimalDigits)
{
// Restituisce true se si può inserire il carattere nel testo e rimane un numero decimale consentito.
// textActual: testo prima di inserire il carattere.
// selStart: punto di inserimento del cursore.
// selLength: lunghezza della selezione se presente.
// charToInsert: carattere da inserire.
// maxIntegerDigits: massimo numero di cifre intere consentite.
// maxDecimalDigits: massimo numero di cifre decimali consentite.
// Elimina la parte selezionata e inserisce il carattere in inserimento.
if (selLength > 0)
{
textActual = textActual.Remove(selStart, selLength).Insert(selStart, charToInsert.ToString());
}
else
{
textActual = textActual.Insert(selStart, charToInsert.ToString());
}
// Sostituisce la ',' con il '.'.
textActual = textActual.Replace(',', '.');
// Non più di un punto.
if (textActual.Count(p => p == '.') > 1)
return false;
// Non eccede il numero di cifre intere e decimali.
if (textActual.Contains('.'))
{
if (textActual.Substring(0, textActual.IndexOf('.')).Length > maxIntegerDigits)
{
return false;
}
if (textActual.Substring(textActual.IndexOf('.') + 1).Length > maxDecimalDigits)
{
return false;
}
}
else if (textActual.Length > maxIntegerDigits)
{
return false;
}
return true;
}
public static bool CheckDecimalNumber(string text, int maxIntegerDigits, int maxDecimalDigits)
{
// Restituisce true se il testo rappresenta un numero decimale consentito.
// text: testo da validare.
// maxIntegerDigits: massimo numero di cifre intere consentite.
// maxDecimalDigits: massimo numero di cifre decimali consentite.
// Sostituisce la ',' con il '.'.
text = text.Replace(',', '.');
// Non più di un punto.
if (text.Count(p => p == '.') > 1)
return false;
// Non eccede il numero di cifre intere e decimali.
if (text.Contains('.'))
{
if (text.Substring(0, text.IndexOf('.')).Length > maxIntegerDigits)
{
return false;
}
if (text.Substring(text.IndexOf('.') + 1).Length > maxDecimalDigits)
{
return false;
}
}
else if (text.Length > maxIntegerDigits)
{
return false;
}
return true;
}
- Il passo successivo, consiste nel controllare i tasti premuti dall'utente durante la digitazione.
- Lo si fa scrivendo il codice seguente nell'evento txt1_KeyPress().
private void txt1_KeyPress(object sender, KeyPressEventArgs e)
{
if (Char.IsDigit(e.KeyChar) || e.KeyChar == ',' || e.KeyChar == '.')
{
TextBox t = (TextBox)sender;
if (!CheckDecimalNumber(t.Text, t.SelectionStart, t.SelectionLength, e.KeyChar, cifreIntere, cifreDecimali))
{
e.Handled = true;
}
}
else if (e.KeyChar == (char)Keys.Back || e.KeyChar == (char)Keys.Clear)
{
}
else
e.Handled = true;
}
- Come si vede, si consente all'utente di digitare cifre, virgole e punti e questi caratteri vengono presi in carico dalla funzione CheckDecimalNumber().
- L'utente può anche cancellare caratteri con il Backspace e con il Canc. In questo caso i caratteri non vengono 'filtrati'.
- Gli altri caratteri non vengono accettati dall'evento.
- I controlli non sono ancora finiti. Rimangono altri casi da gestire:
- La cancellazione della virgola o del punto potrebbe rendere la parte intera troppo lunga.
- Il copia e incolla anche di caratteri non numerici, funziona e sul TextBox potrebbero esserci dei caratteri non validi.
- Gli ultimi controlli vanno inseriti nel codice che legge il TextBox per utilizzarne il valore, in questo esempio nell'evento Click() di un bottone: button1_Click().
private void button1_Click(object sender, EventArgs e)
{
txt1.Text = txt1.Text.Replace(',', '.');
// Verifiche parte 1.
if (!CheckDecimalNumber(txt1.Text, cifreIntere, cifreDecimali))
{
MessageBox.Show("Valore non corretto!", "Errore", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
txt1.Focus();
return;
}
// Prova a convertire in decimal.
decimal d = 0;
if (!decimal.TryParse(txt1.Text, System.Globalization.NumberStyles.Any,
System.Globalization.CultureInfo.InvariantCulture, out d))
{
MessageBox.Show("Valore non corretto!", "Errore", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
txt1.Focus();
return;
}
// Sembra tutto a posto.
MessageBox.Show("Valore OK! " + d.ToString(), "Messaggio", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
- In questo codice viene fatta nuovamente la verifica sul numero di cifre intere e decimali e sulla presenza di un eventuale separatore.
- Infine viene tentata la conversione con il TryParse().