c# – 用于处理跳过迭代的控件的Foreach循环
发布时间:2020-12-15 06:27:40 所属栏目:百科 来源:网络整理
导读:创建文本框的代码…… private void btnAddIncrement_Click(object sender,EventArgs e){ SmartTextBox dynamictextbox = new SmartTextBox(); dynamictextbox.BackColor = Color.Bisque; dynamictextbox.Width = this.tbWidth; dynamictextbox.Left = (send
创建文本框的代码……
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循环来避免对有序访问控件进行处理的任何问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |