TextBox e Label: Interazione con l’Utente
Dalla raccolta dati alla visualizzazione: crea form interattivi professionali
🎯 Cosa Imparerai in Questa Lezione
Nella Lezione 1 hai creato un semplice bottone con MessageBox. Nella Lezione 2 hai imparato
variabili e operatori. Ora è il momento di far parlare l’utente con la tua app!
Imparerai a raccogliere input, validarli e mostrare risultati dinamici.
MessageBox con testo fisso che dice sempre la stessa cosa
Form che chiede il nome e risponde “Ciao Mario!” personalizzato
- ✅ Label: Mostrare testo statico e dinamico (istruzioni, risultati)
- ✅ TextBox: Raccogliere input dall’utente (nomi, numeri, email)
- ✅ Button: Attivare azioni con eventi Click (già visto, ora approfondiamo)
- ✅ Validazione: Controllare che l’utente inserisca dati corretti
📝 Teoria: Il Controllo Label
🤔 Cos’è una Label?
Una Label è come un’etichetta adesiva che metti sul form per mostrare del testo.
Può essere:
- Statica: Testo che non cambia (es: “Inserisci il tuo nome:”)
- Dinamica: Testo che cambia in base al programma (es: “Benvenuto Mario!”)
Dare nomi ai campi: “Nome:”, “Email:”, “Password:”
Mostrare output: “Totale: € 150,00”, “IMC: 22.5”
Feedback all’utente: “Caricamento…”, “Salvato!”
Intestazioni: “Benvenuto nella mia App”, “Risultati”
📋 Proprietà Principali della Label
| Proprietà | Cosa Fa | Esempio |
|---|---|---|
| Name | Nome per identificare la Label nel codice | lblRisultato, lblTitolo |
| Text | Il testo visualizzato (puoi cambiarlo nel codice!) | "Benvenuto!", "" (vuoto) |
| Font | Tipo, dimensione e stile del carattere | Arial 12pt Bold, Times 16pt Italic |
| ForeColor | Colore del testo | Red, Blue, Green, Color.FromArgb(…) |
| BackColor | Colore di sfondo della Label | Yellow, Transparent, LightGray |
| TextAlign | Allineamento del testo | MiddleCenter, TopLeft, BottomRight |
| AutoSize | Ridimensiona automaticamente per contenere il testo | true (default), false (dimensione fissa) |
// All'inizio la Label dice "Benvenuto!"
lblMessaggio.Text = "Benvenuto!";
// Dopo che l'utente inserisce il nome, cambia
string nome = txtNome.Text;
lblMessaggio.Text = "Ciao " + nome + "!";
// Oppure con interpolazione (più moderno)
lblMessaggio.Text = $"Ciao {nome}!";
✏️ Teoria: Il Controllo TextBox
🤔 Cos’è una TextBox?
Una TextBox è una “scatola di testo” dove l’utente può scrivere.
È il controllo fondamentale per raccogliere dati dall’utente.
Invece della penna, usi la tastiera!
La proprietà .Text è la più importante di tutti i controlli Windows Forms.
Puoi sia leggerla (vedere cosa c’è scritto) che scriverla
(modificare il contenuto).
// LEGGERE cosa ha scritto l'utente string nome = txtNome.Text; // Prende il testo dalla TextBox // SCRIVERE nella TextBox (modificare il contenuto) txtNome.Text = "Mario"; // Mette "Mario" nella TextBox // SVUOTARE la TextBox txtNome.Text = ""; // Stringa vuota = TextBox pulita // Oppure txtNome.Clear(); // Metodo dedicato per pulire
📋 Proprietà Principali della TextBox
| Proprietà | Cosa Fa | Esempio/Note |
|---|---|---|
| Name | Nome per identificare la TextBox nel codice | txtNome, txtEmail, txtPassword |
| Text | Il testo contenuto (SEMPRE una stringa!) | Anche se scrivi “123”, è la stringa “123” |
| MaxLength | Numero massimo di caratteri accettati | 50 (limite ragionevole), 0 = nessun limite |
| Multiline | Permette più righe di testo (con Invio) | true = textarea, false = singola riga (default) |
| ScrollBars | Barre scorrimento (solo se Multiline = true) | Vertical, Horizontal, Both, None |
| PasswordChar | Nasconde il testo (per password) | ‘*’ o ‘●’ nasconde i caratteri |
| ReadOnly | L’utente può solo leggere, non scrivere | true = solo lettura, false = modificabile |
| PlaceholderText | Testo di suggerimento (grigio chiaro) | “Inserisci il tuo nome…” |
// TextBox per nome (massimo 50 caratteri) txtNome.MaxLength = 50; txtNome.PlaceholderText = "Es: Mario Rossi"; // TextBox per password (nasconde i caratteri) txtPassword.PasswordChar = '●'; txtPassword.MaxLength = 20; // TextBox per commenti (più righe con scroll) txtCommenti.Multiline = true; txtCommenti.ScrollBars = ScrollBars.Vertical; txtCommenti.Size = new Size(300, 150); // Più alta per vedere più righe // TextBox di sola lettura (mostra risultato non modificabile) txtRisultato.ReadOnly = true; txtRisultato.BackColor = Color.LightGray; // Visivamente distinta
Anche se l’utente scrive un numero come “123” nella TextBox, la proprietà .Text
restituisce la stringa “123”, non il numero 123!
// ❌ SBAGLIATO - Text è una stringa, non un numero! int eta = txtEta.Text; // ERRORE DI COMPILAZIONE! // ✅ CORRETTO - Devi convertire la stringa in numero string testoEta = txtEta.Text; // "25" (stringa) int eta = Convert.ToInt32(testoEta); // 25 (numero intero) // Oppure in una riga sola int eta = Convert.ToInt32(txtEta.Text);
✅ Teoria: Validazione dell’Input
🤔 Perché la Validazione è FONDAMENTALE?
L’utente può scrivere qualsiasi cosa in una TextBox: numeri, lettere, simboli,
anche lasciare il campo vuoto! Se non controlli, il programma può crashare (andare in errore).
// Utente scrive "ciao" invece di un numero int eta = Convert.ToInt32(txtEta.Text); // 💥 CRASH! FormatException!
Il programma va in errore perché “ciao” non è un numero!
🛡️ Tecniche di Validazione
// Controlla se la TextBox è vuota
if (string.IsNullOrEmpty(txtNome.Text))
{
MessageBox.Show("Per favore inserisci il tuo nome!",
"Campo Obbligatorio",
MessageBoxButtons.OK,
MessageBoxIcon.Warning);
txtNome.Focus(); // Mette il cursore nella TextBox
return; // Esce dal metodo senza continuare
}
💡 string.IsNullOrEmpty() restituisce true se la stringa è vuota (“”) o null
// ✅ MODO SICURO - Se la conversione fallisce, non crasha
if (int.TryParse(txtEta.Text, out int eta))
{
// Conversione riuscita! Usa la variabile "eta"
MessageBox.Show($"Hai {eta} anni");
}
else
{
// Conversione fallita (utente ha scritto testo)
MessageBox.Show("Inserisci un numero valido per l'età!",
"Errore",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
💡 TryParse restituisce true se riesce a convertire, false altrimenti
// Controlla che l'email contenga @ e punto
string email = txtEmail.Text;
if (!email.Contains("@") || !email.Contains("."))
{
MessageBox.Show("Inserisci un'email valida (deve contenere @ e .)",
"Email Non Valida",
MessageBoxButtons.OK,
MessageBoxIcon.Warning);
return;
}
// Se arriviamo qui, l'email è (probabilmente) valida
try
{
// Codice che potrebbe andare in errore
int numero = Convert.ToInt32(txtNumero.Text);
int risultato = 100 / numero; // Potrebbe dividere per 0!
lblRisultato.Text = $"Risultato: {risultato}";
}
catch (FormatException)
{
// Errore di formato (non è un numero)
MessageBox.Show("Inserisci un numero valido!");
}
catch (DivideByZeroException)
{
// Errore di divisione per zero
MessageBox.Show("Non puoi dividere per zero!");
}
catch (Exception ex)
{
// Qualsiasi altro errore
MessageBox.Show($"Errore imprevisto: {ex.Message}");
}
💡 Try-Catch è più “pesante” di TryParse. Usa TryParse quando possibile!
👋 Progetto 1: Saluto Personalizzato
Crea un’applicazione che chiede il nome dell’utente e mostra un messaggio di benvenuto personalizzato.
Imparerai validazione, concatenazione stringhe e feedback visivo!
| Controllo | Name | Text/Proprietà |
|---|---|---|
| Label | lblTitolo | Text: “Benvenuto nella mia App!”, Font: 16pt Bold, ForeColor: DarkBlue |
| Label | lblIstruzione | Text: “Inserisci il tuo nome qui sotto:” |
| TextBox | txtNome | Text: (vuoto), MaxLength: 50 |
| Button | btnSaluta | Text: “Salutami!”, BackColor: LightGreen |
| Label | lblRisposta | Text: (vuoto), Font: 12pt Italic, ForeColor: DarkGreen |
using System;
using System.Windows.Forms;
namespace SalutoPersonalizzato
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
// ========================================
// EVENTO CLICK del Button
// ========================================
private void btnSaluta_Click(object sender, EventArgs e)
{
// 1️⃣ Leggi il testo dalla TextBox
string nomeUtente = txtNome.Text;
// 2️⃣ VALIDAZIONE: Controlla se è vuoto
if (string.IsNullOrEmpty(nomeUtente))
{
// Campo vuoto! Mostra errore
MessageBox.Show("Per favore inserisci il tuo nome!",
"Campo Vuoto",
MessageBoxButtons.OK,
MessageBoxIcon.Warning);
// Metti il cursore nella TextBox per facilitare l'utente
txtNome.Focus();
// Esci dal metodo senza fare altro
return;
}
// 3️⃣ Se arriviamo qui, il nome c'è! Crea il messaggio
string messaggioBenvenuto = $"Ciao {nomeUtente}! Benvenuto nella mia applicazione!";
// 4️⃣ Mostra il messaggio nella Label
lblRisposta.Text = messaggioBenvenuto;
// 5️⃣ Mostra anche un MessageBox
MessageBox.Show(messaggioBenvenuto,
"Benvenuto!",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
}
}
Permetti all’utente di premere Invio invece di cliccare il bottone:
// Evento che si attiva quando premi un tasto nella TextBox
private void txtNome_KeyPress(object sender, KeyPressEventArgs e)
{
// Controlla se il tasto premuto è Invio
if (e.KeyChar == (char)Keys.Enter)
{
// Simula il click del bottone
btnSaluta_Click(sender, e);
// Impedisce il "beep" del sistema
e.Handled = true;
}
}
- Seleziona txtNome nel Designer
- F4 → Icona fulmine ⚡ (Eventi)
- Trova KeyPress
- Doppio click per creare il metodo
🎂 Progetto 2: Calcolatore di Età
Crea un’app che calcola l’età in base all’anno di nascita. Imparerai conversione stringa→numero,
validazione numerica e calcoli con DateTime!
- Label: lblTitolo (testo: “Calcola la Tua Età”)
- Label: lblAnno (testo: “Anno di nascita:”)
- TextBox: txtAnnoNascita
- Button: btnCalcola (testo: “Calcola Età”)
- Label: lblRisultato (vuoto, font grande)
private void btnCalcola_Click(object sender, EventArgs e)
{
// 1️⃣ Leggi l'input
string testoAnno = txtAnnoNascita.Text;
// 2️⃣ Controllo campo vuoto
if (string.IsNullOrEmpty(testoAnno))
{
MessageBox.Show("Inserisci l'anno di nascita!",
"Attenzione",
MessageBoxButtons.OK,
MessageBoxIcon.Warning);
txtAnnoNascita.Focus();
return;
}
// 3️⃣ Conversione SICURA con TryParse
if (!int.TryParse(testoAnno, out int annoNascita))
{
MessageBox.Show("Inserisci un numero valido!",
"Errore",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
txtAnnoNascita.Focus();
return;
}
// 4️⃣ Validazione range (anno sensato)
int annoCorrente = DateTime.Now.Year;
if (annoNascita > annoCorrente)
{
MessageBox.Show("Non puoi essere nato nel futuro!",
"Errore",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
return;
}
if (annoNascita < (annoCorrente - 120))
{
MessageBox.Show("Età non realistica (oltre 120 anni)!",
"Errore",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
return;
}
// 5️⃣ Calcola l'età
int età = annoCorrente - annoNascita;
// 6️⃣ Mostra risultato con messaggio personalizzato
lblRisultato.Text = $"Hai {età} anni!";
string messaggio;
if (età < 18)
{
messaggio = $"Hai {età} anni. Sei minorenne!";
lblRisultato.ForeColor = Color.Orange;
}
else if (età < 65)
{
messaggio = $"Hai {età} anni. Sei nel fiore degli anni!";
lblRisultato.ForeColor = Color.Green;
}
else
{
messaggio = $"Hai {età} anni. Saggezza e esperienza!";
lblRisultato.ForeColor = Color.Blue;
}
MessageBox.Show(messaggio,
"La Tua Età",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
📏 Progetto 3: Contatore Caratteri in Tempo Reale
Crea un'app come Twitter che conta i caratteri mentre scrivi! Imparerai l'evento TextChanged
e la proprietà .Length delle stringhe.
- Label: lblTitolo (testo: "Scrivi il tuo messaggio:")
- TextBox: txtMessaggio (Multiline: true, Size: 350x150)
- Label: lblContatore (testo: "Caratteri: 0", font grande, bold)
// ========================================
// EVENTO TextChanged - Si attiva OGNI volta che scrivi
// ========================================
private void txtMessaggio_TextChanged(object sender, EventArgs e)
{
// 1️⃣ Leggi il testo corrente
string testo = txtMessaggio.Text;
// 2️⃣ Conta i caratteri
int numeroCaratteri = testo.Length;
// 3️⃣ Aggiorna il contatore
lblContatore.Text = $"Caratteri: {numeroCaratteri}";
// 4️⃣ Cambia colore in base al numero di caratteri
if (numeroCaratteri == 0)
{
lblContatore.ForeColor = Color.Gray;
}
else if (numeroCaratteri < 100)
{
lblContatore.ForeColor = Color.Green;
}
else if (numeroCaratteri < 200)
{
lblContatore.ForeColor = Color.Orange;
}
else if (numeroCaratteri < 280)
{
lblContatore.ForeColor = Color.Red;
}
else
{
// Oltre 280 (limite Twitter)
lblContatore.ForeColor = Color.DarkRed;
lblContatore.Text = $"Caratteri: {numeroCaratteri} - LIMITE SUPERATO!";
}
}
- Seleziona txtMessaggio nel Designer
- F4 → Icona fulmine ⚡
- Trova TextChanged
- Doppio click per creare il metodo
🎓 Riepilogo: Cosa Hai Imparato
- Mostrare testo statico e dinamico
- Cambiare Text, ForeColor nel codice
- Usare per istruzioni e risultati
- Raccogliere input dall'utente
- Leggere/scrivere proprietà .Text
- MaxLength, Multiline, PasswordChar
- string.IsNullOrEmpty()
- int.TryParse(), double.TryParse()
- Try-Catch per errori
- Click per azioni immediate
- TextChanged per aggiornamenti real-time
- KeyPress per intercettare Invio
🚀 Prossimi Passi
📖 Nella Lezione 4 Imparerai:
- 📋 ListBox e ComboBox: Lavorare con liste di elementi
- ➕ Aggiungere/Rimuovere Items: Gestire dinamicamente le liste
- 🔍 SelectedItem e SelectedIndex: Capire quale elemento è selezionato
- 💼 Progetto Completo: Gestionale Inventario con categorie e filtri
🎯 Con ListBox e ComboBox potrai gestire ELENCHI di dati, non solo singoli valori!
- Calcolatore IMC: 2 TextBox (peso, altezza), calcola IMC, mostra categoria
- Convertitore Temperatura: TextBox Celsius, Button converti, Label Fahrenheit
- Generatore Username: TextBox nome+cognome, genera username, mostra in Label
- Password Validator: TextBox password, verifica lunghezza min 8 caratteri
Lezione 3 - TextBox e Label per l'Input Utente
Corso C# Completo con Interfaccia Grafica - Da Zero a Esperto