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

前端之家收集整理的这篇文章主要介绍了c# – 用于处理跳过迭代的控件的Foreach循环前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
创建文本框的代码……
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时,我按预期得到以下内容……

但是当我点击重置时,它会错过每一个文本框.见下文…

不知道这里发生了什么,但无论我添加的文本框怎么样,这都是一样的.它总是错过每一个盒子.

解决方法

您应该使用反向标准for循环来从其容器中释放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();
    }
}

According to this question/answer你不需要从容器中删除它们,当然这避免了两个循环(显式或隐式).同样在接受的答案中,您可以看到代码每两次跳转一个控件的原因.

if (parent != null) 
{ 
    parent.Controls.Remove(this); 
}

您要处置的控件将从您正在迭代的集合中删除. (不清楚为什么这不会抛出标准异常).

相反,使用简单的for循环来避免对有序访问控件进行处理的任何问题.

猜你在找的C#相关文章