Witaj
Problem leży w tym że w przypadku gdy funkcja równa się DialogResoult.No (klikniesz krzyżyk) wykonuje się kolejny if który ponownie wykonuje tą metodę.
Tu może troche jaśniej:
WYWOŁANIE NR. 1:
if (MessageBox.Show("Czy chcesz zapisać zmiany?", "Komunikat", MessageBoxButtons.YesNoCancel) == DialogResult.Yes)
{
//bla bla bla
}
JEŻELI RÓWNA SIĘ DialogResult.NO (warunek nie jest spełniony) TO NASTĘPUJE WYWOŁANIE NR. 2
else if (MessageBox.Show("Czy chcesz zapisać zmiany?", "Komunikat", MessageBoxButtons.YesNoCancel) == DialogResult.No)
{
bla bla bla
}
Dlatego też po kliknięciu krzyżyka wyświetla się jeszcze raz.