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。的可能副本