Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Windows窗体中关闭控件中的所有窗体_C#_Winforms - Fatal编程技术网

C# 在Windows窗体中关闭控件中的所有窗体

C# 在Windows窗体中关闭控件中的所有窗体,c#,winforms,C#,Winforms,我在一个面板上添加了几个表单。表单具有以下属性: form.TopLevel = false; form.Parent = pnlMain; 现在我想遍历pnlMain中的所有表单并关闭所有表单。为此,我有以下代码: private void CloseForms() { foreach(Form form in pnlMain.Controls.OfType<Form>()) form.Close(); } 我的问题是,并不是所有的表单都是封闭的 在一个

我在一个面板上添加了几个表单。表单具有以下属性:

form.TopLevel = false;
form.Parent = pnlMain;
现在我想遍历pnlMain中的所有表单并关闭所有表单。为此,我有以下代码:

private void CloseForms()
{
    foreach(Form form in pnlMain.Controls.OfType<Form>())
        form.Close();
}
我的问题是,并不是所有的表单都是封闭的

在一个有四个开放式表单的例子中:我计算了开放式表单

int count = pnlMain.Controls.OfType<Form>().Count();
当我调用CloseForms时,只有两个表单是关闭的。另外两个在CloseForms的另一个调用中关闭


如何仅通过一次调用关闭所有表单?

在对集合进行迭代时不要修改集合。试试这个

foreach(Form form in pnlMain.Controls.OfType<Form>().ToArray())

迭代集合时不要修改集合。试试这个

foreach(Form form in pnlMain.Controls.OfType<Form>().ToArray())

有什么东西在里面吗?或者onclose事件?OT:您不应该在面板中有表单。看看UserControls,我希望表单作为子对象出现在这个面板中。所以userconrol不合适。在onclosing中用forSomething向后迭代它?或者onclose事件?OT:您不应该在面板中有表单。看看UserControls,我希望表单作为子对象出现在这个面板中。所以userconrols不合适。用fora向后迭代它虽然ToArray可能会稍微更有效,但我仍然会使用ToList作为一般实践。这很有效。非常感谢。但是如果我不使用.ToArray,为什么要修改集合?就我所知:@Tomtom关闭表单会将其从容器中移除,在您的情况下,容器是pnlMain.Controls。虽然ToArray可能会稍微更有效一些,但我仍然会使用ToList作为常规做法。这很有效。非常感谢。但是如果我不使用.ToArray,为什么要修改集合?就我所知:@Tomtom关闭表单会将其从容器中移除,在您的情况下,容器是pnlMain.Controls。