Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Close all open forms except the main menu in C#

Tags:

c#

winforms

Trying to close all forms except for the main menu using

FormCollection formsList = Application.OpenForms;

with a foreach loop and saying,

if (thisForm.Name != "Menu") thisForm.Close();

Which works ok, it skips the menu, and closes the first, but it then errors:

Collection was modified; enumeration operation may not execute

and stops. I have tried a few places, and they all say that this foreach loop is the way to do it, and it is especially annoying as I am not updating my forms list after closing the forms, which I thought might work. The only thing I could think of was to start at the back and work forward using a while.

like image 857
Ryan Durrant Avatar asked Jan 27 '12 05:01

Ryan Durrant


People also ask

How do I close a Showdialog form?

You need to use the Show() command to use those event to close the opened Form.

How do I close a window in Winforms?

Form. Close() is one method in closing a winform. When 'Form. Close()' execute , all resources created in that form are destroyed.

How do you close a form in Visual Basic?

If you want to close the form then use Me. Close() instead. The Load event will fire again when you create the new instance.


1 Answers

If you use foreach to enumerate through a collection, it can't be modified (items added or removed) during the iteration. Try copying references to the forms to another collection, and then remove them by iterating through that collection.

In situations like this, you can use a list or a simple array, such as:

List<Form> openForms = new List<Form>();

foreach (Form f in Application.OpenForms)
    openForms.Add(f);

foreach (Form f in openForms)
{
    if (f.Name != "Menu")
        f.Close();
}

Or you can use a for loop:

for (int i = Application.OpenForms.Count - 1; i >= 0; i--)
{
    if (Application.OpenForms[i].Name != "Menu")
        Application.OpenForms[i].Close();
}

Or, my new and current favorite, you can use the Reverse() method:

foreach (Form f in Application.OpenForms.Reverse())
{
    if (f.Name != "Menu")
        f.Close();
}
like image 53
Trevor Elliott Avatar answered Oct 16 '22 19:10

Trevor Elliott