Reputation: 99
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
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
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