Close all open forms except the main menu in C#

前端 未结 8 1830
终归单人心
终归单人心 2020-12-16 14:27

Trying to close all forms except for the main menu using

FormCollection formsList = Application.OpenForms;

with a foreach loop and saying,

相关标签:
8条回答
  • 2020-12-16 15:07

    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();
    }
    
    0 讨论(0)
  • 2020-12-16 15:08

    That happens when the collection is changed inside a foreach loop that uses it. You are removing an item from formsList inside the loop.

    Try this:

    for (int i = formsList.Count-1; i > 0; i--)
    {
        if (formsList[i].Name != "Menu")
        {
            formsList[i].Close();
        }
    }
    
    0 讨论(0)
  • 2020-12-16 15:08

    Collection was modified; enumeration operation may not execute.

    FormCollection formsList = Application.OpenForms;
                //for (int i = 0; i < formsList.Count; i++)
                foreach(Form  f in formsList )
                {
                    if (f.Name != "Form1" || f.Name != "Home" || f.Name != "AdminHome")
                        f.Close();
                }
                this.Close();
    
    0 讨论(0)
  • 2020-12-16 15:09

    I know this is old but I needed to perform this same scenario and came up with a elegant and simple way to achieve this as follows

            Form[] formsList = Application.OpenForms.Cast<Form>().Where(x => x.Name == "Form1").ToArray();
            foreach (Form openForm in formsList)
            {                
                openForm.Close();
            }
    

    This will close ALL windows that where opened called Form1

    0 讨论(0)
  • 2020-12-16 15:12

    To Close all forms :

            for (int i = Application.OpenForms.Count - 1; i >= 0; i--)
            {
                if (Application.OpenForms[i].Name != "Menu")
                    Application.OpenForms[i].Close();
            }
    
    0 讨论(0)
  • 2020-12-16 15:20

    As the error states, you can't modify a collection in its foreach.

    Instead, you can use a backwards for loop.

    0 讨论(0)
提交回复
热议问题