2

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

在我的 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 中的所有控件。但我注意到,一旦删除语句进入,整个操作就陷入了混乱。

4

2 回答 2

5

您不能在 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--;
  }
 }
于 2013-05-25T17:53:36.947 回答
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() 的重载以直接获取所需的字符值,并且您只需要处理控件,因为这会自动将其从容器中删除。

于 2013-05-25T21:00:37.797 回答