删除面板中动态创建的控件

本文关键字:创建 控件 动态 删除 | 更新日期: 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()的重载直接获得您想要的字符值,您只需要处置控件,因为这将自动从容器中删除它。