【问题标题】:Clear Form without remove menu清除表单而不删除菜单
【发布时间】:2013-10-05 16:47:13
【问题描述】:

我在窗体上动态创建控件(复选框、列表框、trackBar...),并使用编辑器放置 menuStrip。我想删除所有控件,并且我想保留菜单。 当我使用这条线时:

this.Controls.Clear();

它删除了菜单和控件,但是据我了解,菜单项不是控件,它们直接在表单上(如果我写“this”并按一个点,我可以看到它们)。 我试图循环遍历控件并仅在类型是控件之一时才将其删除,但是在删除某些控件时保留了一些控件。我使用controls.Count 循环。如果 Controls.Count > 1 像这样,我试图将整个循环放到另一个 while() 并退出:

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. menuStrip作为控件而toolStripMenuItmes不是控件的意义何在。

【问题讨论】:

  • “我在表单上动态创建控件(checkBoxes、listBox、trackBar...)”另一个选择是将这些动态添加到您迭代并处理项目的 List 中。这将允许您向表单添加其他“永久”控件,而无需使删除代码复杂化。

标签: c# menustrip


【解决方案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();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 2014-03-21
    • 1970-01-01
    相关资源
    最近更新 更多