C# 用于处理跳过迭代的控件的Foreach循环

C# 用于处理跳过迭代的控件的Foreach循环,c#,winforms,C#,Winforms,创建文本框的代码 private void btnAddIncrement_Click(object sender, EventArgs e) { SmartTextBox dynamictextbox = new SmartTextBox(); dynamictextbox.BackColor = Color.Bisque; dynamictextbox.Width = this.tbWidth; dynam

创建文本框的代码

private void btnAddIncrement_Click(object sender, EventArgs e)
{              
    SmartTextBox dynamictextbox = new SmartTextBox();

        dynamictextbox.BackColor = Color.Bisque;
        dynamictextbox.Width = this.tbWidth;
        dynamictextbox.Left = (sender as Button).Right + this.lastLeft;
    dynamictextbox.K = "Test";

    this.lastLeft = this.lastLeft + this.tbWidth;
    dynamictextbox.Top = btnAddStart.Top;
    this.Controls.Add(dynamictextbox);              
}
用于删除所有文本框的代码

foreach (Control c in this.Controls)
{

    if (c.GetType() == typeof(BnBCalculator.SmartTextBox))
    {
        count++;
        //MessageBox.Show((c as SmartTextBox).K.ToString());
        c.Dispose();
    }
   // else { MessageBox.Show("not txtbox"); }

}
当我点击btnAddIncrement时,我得到了如下预期结果。。。

但当我单击“重置”时,它会错过每一秒的文本框。见下文


不知道这里发生了什么,但无论我如何添加文本框,这都是一样的。它总是每秒都会丢失一个框。

当您通过调用
Dispose()
修改
控件时,删除代码不正确,这就是为什么会跳过控件的原因

删除特定类型的最简单选项是执行以下操作:

var smartTbs = this.Controls.OfType<BnBCalculator.SmartTextBox>().ToList();
smartTbs.ForEach(x => x.Dispose());
var smartTbs=this.Controls.OfType().ToList();
smartTbs.ForEach(x=>x.Dispose());

删除项目时,表单
此控件将修改集合,因此下一个项目不是您所期望的。您应该将
此控件
复制到新列表中。例如,您可以使用
ToArray
制作此控件的副本

foreach (Control c in this.Controls.ToArray())
{
    ...
}

您应该使用循环的反向标准来处理其容器中的SmartTextBox

for(int x = this.Controls.Count - 1; x >= 0; x--)
{
    BnBCalculator.SmartTextBox c = this.Controls[x] as BnBCalculator.SmartTextBox;
    if (c != null)
    {
        count++;
        c.Dispose();
    }
}
您不需要从容器中删除它们,当然这避免了两个循环(显式或隐式)。此外,在接受的答案中,您可以看到代码每两次跳转一个控件的原因

if (parent != null) 
{ 
    parent.Controls.Remove(this); 
}
要处理的控件将从正在迭代的集合中删除。(不清楚为什么不抛出标准异常)


相反,使用简单的for循环以避免对要处理的控件的有序访问中出现任何问题。

您必须先从Form.controls中删除控件,然后再处理它

var controlsToRemove = new List<Control>();
foreach (Control c in this.Controls)
{
    if (c is BnBCalculator.SmartTextBox) 
        controlsToRemove.Add(c);
}

foreach (Control c in controlsToRemove)
{
    Controls.Remove(c);
}
var controlsToRemove=new List();
foreach(此.Controls中的控件c)
{
if(c是BnBCalculator.SmartTextBox)
controlsToRemove.Add(c);
}
foreach(controlsToRemove中的控件c)
{
控制。移除(c);
}

首先尝试选择所有SmartTextBox控件,然后在另一个循环中处理它们。伪代码:

    SmartTextBoxes = Select From this.Controls Where (c.GetType() == typeof(BnBCalculator.SmartTextBox));
    foreach(stb in SmartTextBoxes) { stb.Dispose(); }

您可以使用LINQ的
of type()
方法。但是在IDE之外编写正确的LINQ表达式有点困难。所以,我刚刚编写了“伪代码”,并记住了LINQ。的可能副本