删除面板中动态创建的控件
本文关键字:创建 控件 动态 删除 | 更新日期: 2023-09-27 18:15:14
我花了几个小时试图了解我的编码问题,但没有任何结果。因此想到在这里张贴一个解释
在我的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();
}
}
Rightfully foreach将遍历panel1中的所有控件。但是我注意到,一旦Remove语句进入,整个操作就变得混乱了。
不能在foreach循环中向IEnumerable中添加或删除项。相反,尝试使用for循环。检查这个。实际上,你收到的异常应该告诉你这些。
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--;
}
}
你可以稍微缩短@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()的重载直接获得您想要的字符值,您只需要处置控件,因为这将自动从容器中删除它。