C# 动态表单控件未正确删除

C# 动态表单控件未正确删除,c#,winforms,C#,Winforms,我有一个视图,其中一些标签和文本框是在用户单击按钮后生成的。生成时,我将名称传递为“dynamic_something”,并添加它 当用户单击另一个按钮时,我希望删除所有生成的字段。我循环遍历所有控件,并在开始时找到带有dynamic的控件,然后删除,但没有删除所有字段 foreach (Control currentControl in this.Controls) { if ((currentControl).Name.StartsWith("dynamic")) {

我有一个视图,其中一些标签和文本框是在用户单击按钮后生成的。生成时,我将名称传递为“dynamic_something”,并添加它

当用户单击另一个按钮时,我希望删除所有生成的字段。我循环遍历所有控件,并在开始时找到带有dynamic的控件,然后删除,但没有删除所有字段

foreach (Control currentControl in this.Controls)
{

     if ((currentControl).Name.StartsWith("dynamic"))
     {
       Controls.Remove(currentControl);
     }

}


如何修复此问题?

您无法从正在迭代的集合中删除项。您可以使用
while
循环进行此操作,或使用LINQ:

var f = new Form();
f.Controls.Add(new Label() { Name = "x1" });
f.Controls.Add(new Label() { Name = "y" }); 
f.Controls.Add(new Label() { Name = "x2" });
f.Controls
    .Cast<Control>()
    .Where(c => c.Name.StartsWith("x")).ToList()
    .ForEach(c => f.Controls.Remove(c));
Debug.Assert(f.Controls.Count == 1);
var f=newform();
f、 添加(新标签(){Name=“x1”});
f、 添加(新标签(){Name=“y”});
f、 添加(新标签(){Name=“x2”});
f、 控制
.Cast()
.Where(c=>c.Name.StartsWith(“x”)).ToList()
.ForEach(c=>f.Controls.Remove(c));
Assert(f.Controls.Count==1);

这之所以有效,是因为您不迭代变异集合。

1)不要尝试从在
foreach
循环中迭代的集合中删除对象。对循环使用向后的
(2)释放控件(
currentControl.Dispose();
,此处),不要使用
集合。移除(控件)
。处理控件也会将其从集合中删除。@Jimi在初始循环中,我将控件添加到列表中,并使用另一个循环,使用Dispose()将其删除。它工作得很好。谢谢你能加上这个作为答案吗?这样我就可以接受了。这是(不太出名的)的复制品。
var f = new Form();
f.Controls.Add(new Label() { Name = "x1" });
f.Controls.Add(new Label() { Name = "y" }); 
f.Controls.Add(new Label() { Name = "x2" });
f.Controls
    .Cast<Control>()
    .Where(c => c.Name.StartsWith("x")).ToList()
    .ForEach(c => f.Controls.Remove(c));
Debug.Assert(f.Controls.Count == 1);