【问题标题】:Dynamic form controls not removing properly [duplicate]动态表单控件未正确删除[重复]
【发布时间】:2020-03-22 05:18:42
【问题描述】:

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

TextBox textBox = new TextBox();
textBox.Name = "dynamic_something";
this.Controls.Add(textBox);

当用户单击另一个按钮时,我想删除所有生成的字段。我遍历所有控件并在开始时找到具有动态的控件并删除,但所有字段都没有被删除。

foreach (Control currentControl in this.Controls)
{

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

}

我该如何解决这个问题?

【问题讨论】:

  • 1) 不要尝试从您在 foreach 循环中迭代的集合中删除对象。使用向后的for 循环 2) 处理控件(currentControl.Dispose();,此处),不要使用Collection.Remove(Control)。处理控件也会将其从集合中删除。
  • @Jimi 在初始循环中,我将控件添加到列表中,并使用另一个循环使用 Dispose() 将其删除。它工作得很好。谢谢!您能否将此添加为答案,以便我接受。
  • 它是(不够知名的)Removing dynamically created controls in C# 的副本。

标签: c# winforms


【解决方案1】:

您不能从您迭代的集合中删除项目。您可以为此使用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);

这很有效,因为您不迭代变异集合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 2017-02-02
    • 2020-11-30
    • 2017-11-27
    • 2023-03-22
    • 2012-01-16
    • 2014-09-06
    相关资源
    最近更新 更多