在Panel中删除动态创建的控件

时间:2013-05-25 17:42:57

标签: c#

我花了好几个小时试图了解编码中的问题但没有任何结果。因此想在这里发帖解释

在我的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中的所有控件。但我注意到,一旦删除声明,整个操作就会变得混乱。

2 个答案:

答案 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()的重载以直接获取所需的字符值,您只需要处理控件,因为这会自动将其从容器中删除。