Josephff
Josephff

Reputation: 99

Properly Closing Secondary Form VS Application Exit

This is probably going to be a standard question. I have read lots of articles on this but none point out the issue i am having specifically.

I am developing a WinForm and have a "Main Menu" form that is loaded on startup. Within this main are several buttons which open up individual modules (other forms) of the program.

I can open up the form no problem and can close it and re-show the main form no problem. The problem lies when a user hits the (X) in the control box, the application doesnt exit because the main form is still there, but hidden. I know that i could put an application.exit() in the close event of the form. However, then if i have a button that closes the form and wants to unhide the main form, the application will close due to the formclosing event.

Can someone help me understand this principle. I dont think it should be as hard as it seems to me and i dont really want to use Panels.

Thanks in advance.

-Joseph

the following code solved the issue based on the answer provided below

private void btnHome_Click(object sender, EventArgs e)
{
    Form f1 = Application.OpenForms[0];
    f1.Visible=true;

    this.Close();
}

private void frmCostControlMain_FormClosed(object sender, FormClosedEventArgs e)
{
    Form f = Application.OpenForms[0]; // The main form
    if (f.Visible==true)
    {
        f.BringToFront();
    }
    else
    {
        Application.Exit();
    }
}

Upvotes: 0

Views: 782

Answers (2)

Bongo
Bongo

Reputation: 3153

I still don't understand your question, but I guess you could use the Application.Exit(). You should then check the arguments of your FormClosed event. The Close reason is as follows:

Click on [X]: CloseReason = UserClosing

Application Exit: CloseReason = ApplicationExitCall

You could then handle it properly

private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
    if (e.CloseReason == CloseReason.ApplicationExitCall) 
    {
        //Application.Exit();
    }
    else if (e.CloseReason == CloseReason.UserClosing)
    {
        //[X] was pressed
    }
    else 
    {
        //Many other reasons
    }
}

I guess there is a much cleaner way of handling your problem. If you provide a bit more details, I think someone would be able to help you along.

Upvotes: 0

Olivier Jacot-Descombes
Olivier Jacot-Descombes

Reputation: 112712

You can check the Application.OpenForms and see whether some non-hidden forms other than the current form are around. If you only want to check the main form, you can check Application.OpenForms[0]. Since it was opened first, it will always be at index 0. From memory:

Form_Closed(object sender, EventArgs e)
{
    Form f = Application.OpenForms[0]; // The main form
    if (f.Visible) {
        f.BringToFront();
    } else {
        Application.Exit();
    }
}

When the close button is clicked you would first unhide the main form and then close the current form.

Upvotes: 3

Related Questions