Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.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#_Winforms_Windows Forms Designer - Fatal编程技术网

C# 移除动态控件

C# 移除动态控件,c#,winforms,windows-forms-designer,C#,Winforms,Windows Forms Designer,我有一个添加了动态控件的窗体。当用户单击“下一步”时,必须删除所有动态控件。我的代码只删除了其中的一些 例如,dtxt2第一次没有被删除,但是如果我第二次运行删除函数,它会被删除 这是添加动力学的功能: void TextboxesStep21() { removeDynamics(); TextBox dtxt1 = new TextBox(); dtxt1.Name = "DynamicTextBox1"; dtxt1.Locati

我有一个添加了动态控件的窗体。当用户单击“下一步”时,必须删除所有动态控件。我的代码只删除了其中的一些

例如,
dtxt2
第一次没有被删除,但是如果我第二次运行删除函数,它会被删除

这是添加动力学的功能:


void TextboxesStep21()
{
    removeDynamics();
     TextBox dtxt1 = new TextBox();
     dtxt1.Name = "DynamicTextBox1";
     dtxt1.Location = new System.Drawing.Point(336, 125);
     dtxt1.Text = ((diameterOfDrivingWeel + spindleSlope)*10).ToString();
     this.Controls.Add(dtxt1);
     
    TextBox dtxt2 = new TextBox();
    dtxt2.Name = "DynamicTextBox2";
    dtxt2.Location = new System.Drawing.Point(336, 148);
    dtxt2.Text = gearingRatioDen.ToString();
    this.Controls.Add(dtxt2);

    TextBox dtxt3 = new TextBox();
    dtxt3.Name = "DynamicTextBox3";
    dtxt3.Text = gearingRatioNum.ToString(); ;
    dtxt3.Location = new System.Drawing.Point(336, 171);
    this.Controls.Add(dtxt3);


    pictureBox1.SendToBack();
    pictureBox2.SendToBack();
}

这是我的删除函数

void removeDynamics()
{
    foreach (Control x in this.Controls)
    {
        if (x.Name.Contains("Dynamic"))
        {
            this.Controls.Remove(x);
            x.Dispose(); 
        }
    }
}


在迭代时,您正在修改
控件
集合。您可以使用LINQ的
ToList()
来生成一个单独的集合,您可以对其进行迭代

void removeDynamics()
{
    foreach (Control x in this.Controls.OfType<TextBox>().ToList())
    {
         if (x.Name.Contains("Dynamic"))
         {
             this.Controls.Remove(x);
             x.Dispose(); 
         }
    }
}
例如,dtxt2第一次没有被删除,但如果我第二次运行删除函数,它会被删除。
... 如果你有时间,你能进一步解释我的错吗

在遍历集合时,后台有一个迭代器,它保持当前位置,并根据集合的长度进行检查。因此,如果集合有3个项,迭代器位于位置2

[X1] [X2] [X3]  // Length 3
      ^
      |
   iterator
现在删除第二个元素

[X1] [X3]  // Length 2
      ^
      |
   iterator
迭代器仍然有它的值,但现在它指向下一个元素,不幸的是,这是集合中的最后一个元素。现在,循环将递增迭代器,并检查它是否已经大于集合中的项数。如果是这样,它将取消循环,因为没有更多的项要迭代。因此,X3永远不会被处理

[X1] [X3]      // Length 2
           ^
           |
        iterator
这就是为什么你的第二个文本框首先被跳过的原因

当在集合的迭代过程中从集合中移除项时,将使用反向循环。从末尾开始向下到0:

void removeDynamics()
{
    for (int i = this.Controls.Count - 1; i >= 0; i--)
    {
        Control x = this.Controls[i];
        if (x.Name.Contains("Dynamic"))
        {
            this.Controls.Remove(x);
            x.Dispose();
        }
    }
}
当然,您也可以筛选控件集合,仅首先获取匹配项,然后删除它们:

List<TextBox> toBeRemoved = this.Controls.OfType<TextBox>()
                                         .Where(x => x.Name.Contains("Dynamic")).ToList();
toBeRemoved.ForEach(x => { this.Controls.Remove(x); x.Dispose(); });
List toBeRemoved=this.Controls.OfType()
.Where(x=>x.Name.Contains(“动态”)).ToList();
toBeRemoved.ForEach(x=>{this.Controls.Remove(x);x.Dispose();});

您没有从控件列表中删除控件。我怀疑仅仅处理它就足够了。@MattBreckon我在我的处理之前添加了:“this.Controls.Remove(x);”这确实会产生影响,但仍然不能删除所有动态文本框。是windows窗体吗?也许你应该包括标记我必须先列出所有活动控件吗?因为控件不包含函数toList();使用系统添加
。您只能在调用OfType()的
后应用linq方法和
ToList
。对不起,伙计,你的回答不太好@MongZhu,谢谢。对于这个糟糕的示例,我深表歉意。@JoeriE在更改集合的同时迭代集合通常是个坏主意,因为枚举器可能会混淆下一项是哪一项。谢谢您的清晰解释!!现在我读了它,它的所有超级逻辑。这对我将来肯定有帮助
List<TextBox> toBeRemoved = this.Controls.OfType<TextBox>()
                                         .Where(x => x.Name.Contains("Dynamic")).ToList();
toBeRemoved.ForEach(x => { this.Controls.Remove(x); x.Dispose(); });