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。