创建文本框的代码......
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);
}
Run Code Online (Sandbox Code Playgroud)
用于删除所有文本框的代码.
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"); }
}
Run Code Online (Sandbox Code Playgroud)
当我点击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();
}
}
Run Code Online (Sandbox Code Playgroud)
根据这个问题/答案,你不需要从容器中删除它们,当然这避免了两个循环(显式或隐式).同样在接受的答案中,您可以看到代码每两次跳转一个控件的原因.
if (parent != null)
{
parent.Controls.Remove(this);
}
Run Code Online (Sandbox Code Playgroud)
您要处置的控件将从您正在迭代的集合中删除.(不清楚为什么这不会抛出标准异常).
相反,使用简单的for循环来避免对有序访问控件进行处理的任何问题.