C#: atestat și pregătire ONTI

C#: validarea formularului cu ErrorProvider

Validează datele introduse într-un formular C# fără pierderea valorilor. Folosește ErrorProvider și păstrează aceeași regulă pentru afișare și salvare.

Un TextBox permite text, nu garantează că utilizatorul a introdus un număr potrivit. Formularul nostru acceptă o cantitate între 1 și 100. Erorile apar lângă control, iar datele deja tastate rămân disponibile pentru corectare. Salvarea folosește aceeași metodă de validare ca verificarea vizuală, evitând două reguli contradictorii.

Cum lucrezi cu exemplul

Exemplul complet se compilează ca Windows Forms App pe .NET Framework 4.8, cu C# 7.3. Deschide Lesson.csproj din arhivă în Visual Studio pe Windows. Rulează scenariile descrise mai jos; verificarea compilării nu înlocuiește testarea ferestrei și a dispozitivelor folosite.

Descarcă sursele și instrucțiunile.

Ideea și pașii de implementare

ErrorProvider asociază un mesaj unui control. SetError cu text gol elimină mesajul precedent. TryParse verifică reprezentarea numerică, iar comparațiile verifică intervalul de domeniu. Dacă oricare pas eșuează, metoda întoarce false și handler-ul de salvare se oprește înainte de actualizare.

Componenta ErrorProvider nu este un control copil obișnuit; în exemplul construit manual o eliberăm în Dispose. Pe lângă indicatorul vizual, mesajul de stare oferă feedback textual. În aplicația finală poți adăuga validare la părăsirea câmpului, dar butonul Salvează trebuie să verifice datele chiar dacă utilizatorul nu a schimbat focalizarea.

Exemplu și rezultat așteptat

Pentru abc, salvarea este refuzată cu mesajul despre un întreg între 1 și 100. Pentru 0 și 101 obții același refuz de domeniu. Pentru 25, eroarea dispare și apare Salvat: 25. O încercare invalidă după un succes nu trebuie să fie prezentată drept o nouă salvare.

Schemă pentru lecția 12: Text: 101; TryParse: reușit; Interval 1..100: refuz; Modelul rămâne neschimbat.Text: 101 → TryParse: reușit → Interval 1..100: refuz → Modelul rămâne neschimbat.Mărește schema ↗

Codul complet

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Windows.Forms;

static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new LessonForm());
    }
}

class LessonForm : Form
{
readonly TextBox input=new TextBox { Left=20,Top=35,Width=180,AccessibleName="Cantitate" };
    readonly Label status=new Label { Left=20,Top=110,Width=320,Height=50 };
    readonly ErrorProvider errors=new ErrorProvider();
    public LessonForm() {
        Text="Validare"; ClientSize=new Size(380,180); errors.ContainerControl=this;
        var label=new Label { Left=20,Top=10,Width=250,Text="Cantitate intre 1 si 100" };
        var save=new Button { Left=20,Top=70,Text="Salveaza",Width=120 };
        save.Click += (sender,e) => {
            int value;
            bool ok=int.TryParse(input.Text,out value) && value>=1 && value<=100;
            string message=ok ? "" : "Introdu un intreg intre 1 si 100.";
            errors.SetError(input,message);
            status.Text=ok ? "Salvat: " + value : message;
            if(!ok) input.Focus();
        };
        Controls.AddRange(new Control[] {label,input,save,status});
    }
    protected override void Dispose(bool disposing) {
        if(disposing) errors.Dispose(); base.Dispose(disposing);
    }
}

Greșeli și limite

Nu te baza numai pe evenimentul KeyPress: lipirea textului și alte metode de introducere îl pot ocoli. Nu considera un câmp cu spații drept valoare completată. Nu închide formularul imediat după un eșec; mută focalizarea la câmpul care trebuie corectat. Mesajul trebuie să explice intervalul permis, nu să spună doar „Eroare”.

Exersează

Testează șirul gol, spații, 1, 100, 101 și un număr foarte mare. Doar 1 și 100 sunt acceptate dintre valorile de frontieră enumerate. Adaugă un al doilea câmp pentru denumire, cu limita 80 de caractere, și verifică ambele câmpuri înainte de salvare. Niciun eșec nu trebuie să modifice modelul salvat.

Continuă parcursul

Parcursul complet de 50 de lecții

Bazele C#

Lecția precedentă: C#: primul formular și ciclul evenimentelor

Lecția următoare: C#: layout adaptabil cu Dock, Anchor și panouri.

Referință: documentația Microsoft.

Întrebări frecvente

TryParse verifică și intervalul 1–100?

Nu. Conversia și regula domeniului sunt două verificări separate.

Cum șterg o eroare veche?

Apelezi SetError pentru același control cu un mesaj gol după o validare reușită.

Este suficientă filtrarea tastelor?

Nu. Validează valoarea completă și la salvare, inclusiv după lipire.

Un pas mai departe

Autentifică-te pentru a păstra progresul în cont.

Exersează cu o problemă →