创建文本框的代码……
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循环来避免对有序访问控件进行处理的任何问题.