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