Dalla raccolta dati alla visualizzazione: crea form interattivi professionali.
Cosa Imparerai in Questa Lezione
Hai già creato un bottone con MessageBox, hai imparato variabili e operatori e come far decidere il programma con if e switch. Ora è il momento di far parlare l'utente con la tua app! Imparerai a raccogliere input, validarli e mostrare risultati dinamici.
✨ Il Salto di Qualità
❌ Prima:
MessageBox con testo fisso che dice sempre la stessa cosa
✅ Ora:
Form che chiede il nome e risponde "Ciao Mario!" personalizzato
📚 Controlli che Padroneggerai
- ✅ 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!")
🎯 Quando Usare una Label
📌 Etichette
Dare nomi ai campi: "Nome:", "Email:", "Password:"
📊 Risultati
Mostrare output: "Totale: € 150,00", "IMC: 22.5"
💬 Messaggi
Feedback all'utente: "Caricamento...", "Salvato!"
🎨 Titoli
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) |
Esempio: Cambiare il Testo di una Label nel Codice
// 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.
🎯 Analogia: La TextBox è come un modulo cartaceo dove scrivi a mano. Invece della penna, usi la tastiera!
🔑 Concetto FONDAMENTALE: La Proprietà .Text
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..." |
Esempi Pratici di Configurazione TextBox
// 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
⚠️ IMPORTANTE: Text è Sempre una Stringa!
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).
💥 Esempio di Crash:
// 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
- Controllo Campo Vuoto
string.IsNullOrEmpty()
// 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
- Conversione Sicura con TryParse
int.TryParse() - NON va in errore!
// ✅ 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
- Validazione con Contains (per Email, ecc.)
Controllo Caratteri Specifici
// 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-Catch: Gestione Errori Generica
Cattura Qualsiasi Errore
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!
- Interfaccia da Creare
| 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 |
- Il Codice Completo con Commenti
Form1.cs
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);
}
}
}
- 🎨 Miglioramento: Evento KeyPress per Premere Invio
Permetti all'utente di premere Invio invece di cliccare il bottone:
Evento KeyPress della TextBox
// 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;
}
}
💡 Come collegare l'evento:
- 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!
- Interfaccia
- 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)
- Codice con Validazione Completa
CalcolatoreEta.cs
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.
- Interfaccia
- Label: lblTitolo (testo: "Scrivi il tuo messaggio:")
- TextBox: txtMessaggio (Multiline: true, Size: 350x150)
- Label: lblContatore (testo: "Caratteri: 0", font grande, bold)
- Codice con Feedback Visivo
ContatoreCaratteri.cs
// ========================================
// 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!";
}
}
💡 Come Collegare l'Evento TextChanged
- Seleziona txtMessaggio nel Designer
- F4 → Icona fulmine ⚡
- Trova TextChanged
- Doppio click per creare il metodo
Riepilogo: Cosa Hai Imparato
✅ Competenze Acquisite
📝 Label
- Mostrare testo statico e dinamico
- Cambiare Text, ForeColor nel codice
- Usare per istruzioni e risultati
✏️ TextBox
- Raccogliere input dall'utente
- Leggere/scrivere proprietà .Text
- MaxLength, Multiline, PasswordChar
✅ Validazione
- string.IsNullOrEmpty()
- int.TryParse(), double.TryParse()
- Try-Catch per errori
⚡ Eventi
- Click per azioni immediate
- TextChanged per aggiornamenti real-time
- KeyPress per intercettare Invio
Prossimi Passi
Nella Prossima Lezione:
- 🧮 Primi esercizi completi: calcolatrice, pari/dispari, voti con switch, convertitore di temperatura
- 🛡️ Input sicuro: TryParse, Convert e try/catch messi in pratica
- 🎨 Feedback visivo: colori e messaggi in base al risultato
🎯 Metterai insieme TextBox, variabili, if/switch e validazione in piccoli programmi veri!
💪 Esercizi Prima della Prossima Lezione
- 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
📚 Teoria collegata (percorso C# – il linguaggio, esempi in console): Stringhe, date e input utente.