tags:

views:

460

answers:

3

Hello!

I want to set the CloseReason of a form after I call This.Close() inside the form.

Usually, this forms is closed by itself calling This.Close(), but I want to ask the user if they REALLY want to close the form, and send a mbox with some info. But I have this:

protected override void OnFormClosing(FormClosingEventArgs e)
    {
        if (e.CloseReason == CloseReason.UserClosing)
        {
            if (MessageBox.Show("¿Desea Salir realmente?\nLa factura aun no ha sido pagada por lo que volverá a la pantalla anterior y podrá seguir agregando productos") == DialogResult.No)
            {
                e.Cancel = true;
            }
        }
        base.OnFormClosing(e);
    }

But everytime I call This.Close(); the CloseReason is always UserClosing.

Can I set it after the call or I have to handle the OnFormClosing diferent?

Thanks in advance

+3  A: 

I don't think you can do that, what i always do is to use a flag

appClosing = true;
this.Close();

And then check for that:

protected override void OnFormClosing(FormClosingEventArgs e)
    {
        if (e.CloseReason == CloseReason.UserClosing && !appClosing)
        {
            if (MessageBox.Show("¿Desea Salir realmente?\nLa factura aun no ha sido pagada por lo que volverá a la pantalla anterior y podrá seguir agregando productos") == DialogResult.No)
            {
                e.Cancel = true;
            }
        }
        base.OnFormClosing(e);
    }
AlbertEin
Seems like is the only Option... It's working now how i wanted so I'll keep it that way... Thanks!
josecortesp
+3  A: 

CloseReason is an enum with the following members:

None
WindowsShutDown
MdiFormClosing
UserClosing
TaskManagerClosing
FormOwnerClosing
ApplicationExitCall

Which leads me to believe that it is dependent on conditions related to the behavior of forms in general (ex. closing a parent form closes it's childs). So in order for the arg to have say, the CloseReason.ApplicationExitCall, the event must be triggered from a Application.Exit call.

Same with say a CloseReason.FormOwnerClosing, assuming your child forms are called using form.Show(Parent)

If your goal is to simply have extra information of why the form is closing, you can simply store it inside the form object as a public attribute or property to access it later, assuming said form wasn't disposed.

Providing what was your motivation in changing the CloseReason would probably help, as well.

CloseReason msdn page for reference http://msdn.microsoft.com/en-us/library/system.windows.forms.closereason.aspx

Dynami Le Savard
+2  A: 

Rather than creating the extra variable:

appClosing = true; 
this.Close();

You can call:

Application.Exit();

And then e.CloseReason will equal

CloseReason.ApplicationExitCall

Which might be what you're after.

Leon Bambrick
Nice, Thanks! Too bad that this project is already finished (It was for a University work). But is really good to know
josecortesp