我花了好几个小时试图了解编码中的问题但没有任何结果。因此想在这里发帖解释
在我的UI设计中,我按此顺序排第一行<<checkbox, textbox, textbox>>
。根据返回的结果行数,我将动态创建相同数量的复选框和文本框行。
但是,当我尝试删除冗余行时,只保留第1行,我注意到只删除了一些控件。
例如
删除前:
checkbox0 textbox0 tb0
checkbox1 textbox1 tb1
checkbox2 textbox2 tb2
执行
后checkbox0 textbox0 tb0
--------- -------- tb1
checkbox2 textbox2 ---
我的删除代码如下:
foreach (Control c in panel1.Controls)
{
lastChar = c.Name[c.Name.Length - 1];
lastValue = (int)Char.GetNumericValue(lastChar);
MessageBox.Show("second " + c.Name);
if (lastValue > 0 && lastValue < count)
{
panel1.Controls.Remove(c);
c.Dispose();
}
}
正确的foreach将遍历panel1中的所有控件。但我注意到,一旦删除声明,整个操作就会变得混乱。
答案 0 :(得分:5)
您不能在foreach循环内的IEnumerable中添加或删除项目。而是尝试使用for循环。检查this。实际上,您收到的例外情况应该告诉您。
for (int i = 0; i < panel1.Controls.Count; i++)
{
Control c = panel1.Controls[i];
lastChar = c.Name[c.Name.Length - 1];
lastValue = (int)Char.GetNumericValue(lastChar);
MessageBox.Show("second " + c.Name);
if (lastValue > 0 && lastValue < count)
{
panel1.Controls.Remove(c);
c.Dispose();
i--;
}
}
答案 1 :(得分:0)
您可以使用
缩短@Adi的代码稍微 for (int i = panel1.Controls.Count - 1; i >= 0; i--)
{
Control c = panel1.Controls[i];
lastValue = (int)Char.GetNumericValue(c.Name, c.Name.Length - 1);
if (lastValue > 0 && lastValue < count)
{
c.Dispose();
}
}
请注意GetNumericValue()的重载以直接获取所需的字符值,您只需要处理控件,因为这会自动将其从容器中删除。