清除表单而不删除菜单



我在窗体上动态创建控件(复选框,列表框,跟踪栏...(,并使用编辑器放置menuStrip。我想删除所有控件,并想保留菜单。当我使用这一行时:

this.Controls.Clear();

它删除了菜单和控件,但是据我了解,菜单项不是控件,它们直接在窗体上(如果我写"this"并按一个点,我可以看到它们(。我尝试循环浏览控件,并且仅在类型是控件之一时才删除,但有些控件保留,而某些控件被删除。我使用控件骑自行车。计数。我试图将整个循环放到另一个 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);
        }
    }
}

它删除了控件并保留了菜单,但是消失的项目不会在同一时间消失,但是一段时间后,我想它会在同时运行不止一次。
我的问题:
1.为什么它不能一次删除所有控件,而我使用controls.count作为上限迭代整个控件。
2. 菜单条带作为控件而工具条形菜单Itmes不是控件有什么意义。

这是修改正在迭代的集合的经典错误。 大多数集合类会在您执行此操作时生成异常,遗憾的是 ControlCollection 不会。 它只是行为不端,您将跳过删除控件之后的下一个控件。 还有另一个令人讨厌的错误,Controls.RemoveAt(( 方法不会处理您删除的控件,它会永远泄漏。

通过向后迭代来避免迭代错误。 并正确处置,如下所示:

for (int i = this.Controls.Count-1; i >= 0; i--) {
    if (this.Controls[i].GetType() != typeof(MenuStrip)) {
        this.Controls[i].Dispose();
    }
}

相关内容

  • 没有找到相关文章

最新更新