我在Form上动态创建控件(checkBoxes,listBox,trackBar ...),然后使用编辑器放置menuStrip。我想删除所有控件,我想保留菜单。 当我使用这一行时:
this.Controls.Clear();
它删除了菜单以及控件,但是据我所知,菜单项不是控件,它们直接在表单上(如果我写“this”并按一个点,我可以看到它们)。 我试图循环控件并仅在类型是控件之一时移除,但是一些控件保留,而一些控件被移除。我使用controls.Count循环。我尝试将整个循环放到另一个while()并退出,如果Controls.Count> 1像这样:
while( this.Controls.Count > 1 )
{
for (int i = 0; i < this.Controls.Count; i++ )
{
if ((this.Controls[i].GetType() != typeof(MenuStrip)) )
{
this.Controls.RemoveAt(i);
}
}
}
它删除了控件并单独保留菜单,但是消失的项目在同一时间内没有消失,但是一段时间之后,我想这是因为while运行了不止一次。
我的问题:
1.为什么不能一次性删除所有控件,而我使用controls.count作为上限迭代整个事件。
2.当toolStripMenuItmes不是控件时,menuStrip作为控件有什么意义。
答案 0 :(得分:1)
这是修改您正在迭代的集合的经典错误。当你这样做时,大多数集合类都会生成异常,但不幸的是ControlCollection没有。它只是行为不端,你将删除后删除的下一个控件。还有另一个令人讨厌的错误,Controls.RemoveAt()方法没有处理你删除的控件,它会永远泄漏。
通过向后迭代避免迭代错误。并妥善处理,如下:
for (int i = this.Controls.Count-1; i >= 0; i--) {
if (this.Controls[i].GetType() != typeof(MenuStrip)) {
this.Controls[i].Dispose();
}
}