DialogResult este o enumerație care reprezintă răspunsul unui formular modal la întrebarea implicită pe care o pune utilizatorului: „confirmi sau anulezi?". Fiecare buton de pe formular poate fi configurat să seteze un anumit DialogResult la apăsare, ceea ce închide automat formularul și returnează valoarea respectivă apelantului.
// In Form1, dupa ShowDialog():using(FormAngajatf=newFormAngajat(null)){DialogResultrezultat=f.ShowDialog();if(rezultat==DialogResult.OK)angajati.Add(f.AngajatRezultat); // daca Cancel, nu facem nimic}
Valorile DialogResult
DialogResult.OK// utilizatorul a confirmatDialogResult.Cancel// utilizatorul a anulat sau a inchis cu XDialogResult.Yes// pentru YesNoDialogResult.No// pentru YesNoDialogResult.Retry// pentru RetryCancelDialogResult.Abort// pentru AbortRetryIgnoreDialogResult.Ignore// pentru AbortRetryIgnoreDialogResult.None// formularul nu a fost inca inchis
În aplicații cu formulare de adăugare/editare, OK și Cancel sunt suficiente în aproape toate cazurile.
Setarea DialogResult din cod
Atribuirea unui DialogResult pe formular îl închide automat:
Dacă utilizatorul închide fereastra cu butonul X din bara de titlu, DialogResult devine automat Cancel. Acest comportament implicit este exact ce vrem.
AcceptButton și CancelButton
Două proprietăți ale Form simplifică interacțiunea cu tastatura:
AcceptButton — butonul activat când utilizatorul apasă Enter, indiferent de controlul cu focus:
CancelButton — butonul activat când utilizatorul apasă Escape:
Se setează din fereastra Properties a formularului sau din cod după InitializeComponent(). Cu aceste două setate, utilizatorul poate confirma cu Enter și anula cu Escape fără să dea click pe butoane.
📸 SCREENSHOT: Fereastra Properties a FormAngajat cu proprietățile AcceptButton și CancelButton evidențiate și valorile btnOk și btnAnuleaza selectate din dropdown.
Un detaliu important: dacă btnOk are DialogResult = OK setat din Designer (în Properties → DialogResult), apăsarea lui închide formularul fără să treacă prin btnOk_Click. Acesta este comportamentul nedorit când ai validare — validarea nu ar mai rula.
Soluția: lasă btnOk.DialogResult = None în Designer și setează this.DialogResult = DialogResult.OK manual în handler, după validare:
📸 SCREENSHOT: Fereastra Properties a btnOk cu proprietatea DialogResult evidențiată și valoarea setată la None. Adaugă o notă că aceasta este setarea corectă când ai validare în handler.
Ciclul de viață al unui formular secundar
Un formular deschis cu ShowDialog() parcurge acești pași:
Un aspect important: după ce ShowDialog() returnează, obiectul formularului nu a dispărut — el există în memorie până la Dispose(). Poți accesa proprietăți publice ale lui, inclusiv AngajatRezultat, cât timp ești în blocul using:
FormClosing în formularul secundar
Dacă vrei să interzici închiderea cu X fără confirmare, te abonezi la FormClosing:
private void btnOk_Click(object sender, EventArgs e)
{
if (!Valideaza()) return; // validarea esueaza — formularul ramane deschis
AngajatRezultat = CitesteFormular();
this.DialogResult = DialogResult.OK; // inchide formularul
// nu mai e nevoie de this.Close() — setarea DialogResult il inchide automat
}
private void btnAnuleaza_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel; // inchide formularul
}
this.AcceptButton = btnOk;
this.CancelButton = btnAnuleaza;
// GRESIT — DialogResult setat in Designer pe buton
// Formularul se inchide la click, validarea nu ruleaza
// CORECT — DialogResult setat din cod, dupa validare
private void btnOk_Click(object sender, EventArgs e)
{
if (!Valideaza()) return;
AngajatRezultat = CitesteFormular();
this.DialogResult = DialogResult.OK; // validarea a trecut, acum inchidem
}
new FormAngajat(angajat)
-> constructor
-> InitializeComponent()
-> [FormAngajat_Load] — daca e abonat
-> fereastra apare pe ecran
-> utilizatorul interactioneaza
-> [btnOk_Click sau btnAnuleaza_Click]
-> this.DialogResult = OK / Cancel
-> fereastra dispare de pe ecran
-> ShowDialog() returneaza DialogResult
-> [using] Dispose() elibereaza resursele
using (FormAngajat f = new FormAngajat(null))
{
if (f.ShowDialog() == DialogResult.OK)
{
// f inca exista in memorie, AngajatRezultat este accesibil
Angajat nou = f.AngajatRezultat;
angajati.Add(nou);
}
}
// aici f.Dispose() a fost apelat, f nu mai e accesibil
private void FormAngajat_FormClosing(object sender, FormClosingEventArgs e)
{
// Daca utilizatorul a apasat OK, lasam sa se inchida
if (this.DialogResult == DialogResult.OK) return;
// Daca a apasat X sau Escape si are date introduse, cerem confirmare
if (!string.IsNullOrWhiteSpace(txtNume.Text))
{
DialogResult confirmare = MessageBox.Show(
"Ai date nesalvate. Inchizi fara sa salvezi?",
"Confirmare",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question);
if (confirmare == DialogResult.No)
e.Cancel = true; // anuleaza inchiderea
}
}