Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从WinForm中删除动态添加的控件_C#_.net_Winforms - Fatal编程技术网

C# 从WinForm中删除动态添加的控件

C# 从WinForm中删除动态添加的控件,c#,.net,winforms,C#,.net,Winforms,我有一个GroupBox,我在其中动态添加控件。我添加的控件有两种类型DevExpress.XtraEditors.TextEdit和Windows.Forms.Label 我尝试使用以下方法删除这些控件 foreach (Control control in salesBox.Controls) { control.Dispose(); salesBox.Controls.Remove(control); } 这是正确地删除TextEdit控件,而不是标签控件。循环没有遍历标签控

我有一个GroupBox,我在其中动态添加控件。我添加的控件有两种类型
DevExpress.XtraEditors.TextEdit
Windows.Forms.Label
我尝试使用以下方法删除这些控件

foreach (Control control in salesBox.Controls)
{
  control.Dispose(); 
  salesBox.Controls.Remove(control);
} 

这是正确地删除
TextEdit
控件,而不是
标签
控件。循环没有遍历
标签
控件。

您不能在Foreach中更改集合的内容。我相信你需要这样做

List<Control> toRemove = salesBox.Controls.OfType<Control>().ToList();

foreach(Control c in toRemove)
{
 salesBox.Controls.Remove(c);
 c.Dispose();
}
List-toRemove=salesBox.Controls.OfType().ToList();
foreach(移动中的控制c)
{
salesBox.控件。移除(c);
c、 处置();
}

您不能在Foreach中更改集合的内容。我相信你需要这样做

List<Control> toRemove = salesBox.Controls.OfType<Control>().ToList();

foreach(Control c in toRemove)
{
 salesBox.Controls.Remove(c);
 c.Dispose();
}
List-toRemove=salesBox.Controls.OfType().ToList();
foreach(移动中的控制c)
{
salesBox.控件。移除(c);
c、 处置();
}

Foreach
无法迭代,因为
salebox.Controls
的长度已更改。如果添加或删除项目,最好使用
for
你可以自己做

   for(int i=0;i<salesBox.Controls.Count;i++)
    {      if(salesBox.Controls[i] is DevExpress.XtraEditors.TextEdit) //your condition here
           { 
             salesBox.Controls.Remove(salesBox.Controls[i]);
             i--;
          }
    }

for(int i=0;i
Foreach
无法迭代,因为
salebox.Controls
的长度已更改。如果添加或删除项目,最好使用
for
你可以自己做

   for(int i=0;i<salesBox.Controls.Count;i++)
    {      if(salesBox.Controls[i] is DevExpress.XtraEditors.TextEdit) //your condition here
           { 
             salesBox.Controls.Remove(salesBox.Controls[i]);
             i--;
          }
    }

for(int i=0;i它不起作用,因为您正在修改正在迭代的集合。调用Dispose()方法也会从父控件集合中删除一个控件。副作用是,您将只处理偶数个控件。这两个循环中的任何一个都可以完成任务:

while (salesBox.Controls.Count > 0) salesBox.Controls[0].Dispose();

for (int ix = salesBox.Controls.Count-1; ix >= 0; ix---) salesBox.Controls[ix].Dispose();

或者将它们保留在面板上并处置该面板。

这不起作用,因为您正在修改正在迭代的集合。调用dispose()方法也会从父控件集合中移除控件。副作用是,您将只处置偶数个控件。这两个循环中的任何一个都可以完成该任务:

while (salesBox.Controls.Count > 0) salesBox.Controls[0].Dispose();

for (int ix = salesBox.Controls.Count-1; ix >= 0; ix---) salesBox.Controls[ix].Dispose();

或者将它们放在面板上并处理面板。

从控件集合中删除所有控件的最简单方法是调用其
清除方法:

salesBox.Controls.Clear();

根据集合类型(请参阅MSDN中的“备注”部分),修改集合可能使枚举数无效并产生不可预测的结果,甚至引发
invalidoOperationException
。由于
foreach
使用枚举数,因此不应更改正在迭代的集合

如果必须有选择地删除并向后迭代,则使用
for
语句,以避免在删除项目后获得错误的索引值:

for (int i = salesBox.Controls.Count - 1; i >= 0; i--) {
    Control c = salesBox.Controls[i];
    if (c is TextEdit || c is Label) {
        salesBox.Controls.RemoveAt(i);
    }
}

从控件集合中删除所有控件的最简单方法是调用其
Clear
方法:

salesBox.Controls.Clear();

根据集合类型(请参阅MSDN中的“备注”部分),修改集合可能使枚举数无效并产生不可预测的结果,甚至引发
invalidoOperationException
。由于
foreach
使用枚举数,因此不应更改正在迭代的集合

如果必须有选择地删除并向后迭代,则使用
for
语句,以避免在删除项目后获得错误的索引值:

for (int i = salesBox.Controls.Count - 1; i >= 0; i--) {
    Control c = salesBox.Controls[i];
    if (c is TextEdit || c is Label) {
        salesBox.Controls.RemoveAt(i);
    }
}

你需要后退,因为我最终会超过集合中的项目数,导致例外。出于某种原因,尽管我们在这里讨论,但评论员不喜欢编辑。我想你必须赢得那些徽章。你需要后退,因为我最终会超过集合中的项目数由于某种原因,尽管我们在这里讨论过,但评论员不喜欢编辑。我想我必须赢得那些徽章。你是对的,忘记ControlCollection不是直接IEnumerable。修改了答案以修复。它确实需要系统。Linq Namespace你是对的,忘记ControlCollection不是直接IEnumerable。将答案修改为fix。它确实需要系统。Linq Namespace我喜欢反向循环的想法!我在早期编辑中添加了这一点,但修订检查警察不喜欢:(我喜欢反向循环的想法!我在早期编辑中添加了这一点,但修订检查警察不喜欢它:(