Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.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# 从窗体中删除控件(不会命中我要删除的每个控件)_C#_Forms_Controls_Dynamically Generated - Fatal编程技术网

C# 从窗体中删除控件(不会命中我要删除的每个控件)

C# 从窗体中删除控件(不会命中我要删除的每个控件),c#,forms,controls,dynamically-generated,C#,Forms,Controls,Dynamically Generated,我正在动态地将一些控件添加到我的表单中,效果很好,但是当我想再次删除它们时,它只会以一种奇怪的(随机)模式删除其中的一些控件(这里2个控件,那里2个控件,…) 我尝试使用: foreach (Control item in this.Controls.OfType<Control>()) { if (item.Tag == "potentiallyRemove") this.Controls.Remove(ite

我正在动态地将一些控件添加到我的表单中,效果很好,但是当我想再次删除它们时,它只会以一种奇怪的(随机)模式删除其中的一些控件(这里2个控件,那里2个控件,…)

我尝试使用:

foreach (Control item in this.Controls.OfType<Control>())
        {
            if (item.Tag == "potentiallyRemove")
                this.Controls.Remove(item);
        }
foreach(此.Controls.OfType()中的控制项)
{
如果(item.Tag==“potentiallyRemove”)
此。控制。删除(项目);
}
是的,我要删除的控件都设置了“Tag”属性

我还尝试只删除PictureBox:

foreach (Control item in this.Controls.OfType<PictureBox>())
        {              
                this.Controls.Remove(item);
        }
foreach(此.Controls.OfType()中的控制项)
{              
此。控制。删除(项目);
}
我不想使用
this.Controls.Clear()
,因为我有一个不想删除的标题行


这是一个bug还是类似的问题?如果是,有什么解决方法吗?

为了避免错误:将控件添加到数组中,然后删除它们

试试这个:

    List<Control> controlsToBeRemoved = new List<Control>();
    foreach (Control item in this.Controls.OfType<PictureBox>())
    {
        controlsToBeRemoved.Add(item);
    }

    foreach (Control item in controlsToBeRemoved)
    {
        this.Controls.Remove(item);
    }
List controlsToBeRemoved=new List();
foreach(this.Controls.OfType()中的控件项)
{
控件被删除。添加(项);
}
foreach(controlsToBeRemoved中的控制项)
{
此。控制。删除(项目);
}

您正在修改正在迭代的集合,您是否也在通过事件(如按钮单击)执行此操作?抱歉,我不知道您的意思^^我正在向某些按钮添加事件,但这怎么可能是个问题?哦,删除控件的函数是由动态添加的按钮的事件处理程序触发的。这个也应该被移除。。。这可能是个问题吗?编辑:我试图通过一个不应该被删除的按钮来触发函数,但结果是一样的……你正在修改你正在迭代的集合,这很糟糕。改为使用
this.Controls.OfType().ToList()
,以便迭代集合的副本。请记住,调用您删除的控件的Dispose()方法是一项非常严格的要求。控件类不是可选的。控件是否都直接位于窗体上?如果没有,您可能需要使用一个小的递归来访问它们。。看看我的答案!非常感谢你的版本为我工作!修改我正在迭代的集合不是最好的主意:P