C# 删除C中动态生成的复选框#

C# 删除C中动态生成的复选框#,c#,checkbox,C#,Checkbox,我根据我的SQL数据在面板上动态生成复选框按钮。我创建了一个按钮来“刷新”我的按钮,我的意思是我删除/更新按钮。我的问题是我不能删除旧按钮。创建按钮后,我尝试删除一个特定的按钮: foreach (CheckBox item in panel.Controls.OfType<CheckBox>()) { panel.Controls.Remove(item); } foreach(panel.Controls.OfType()中的复选框项) { 面板。控制装置。移除(项目

我根据我的SQL数据在面板上动态生成复选框按钮。我创建了一个按钮来“刷新”我的按钮,我的意思是我删除/更新按钮。我的问题是我不能删除旧按钮。创建按钮后,我尝试删除一个特定的按钮:

foreach (CheckBox item in panel.Controls.OfType<CheckBox>())
{
    panel.Controls.Remove(item);
} 
foreach(panel.Controls.OfType()中的复选框项)
{
面板。控制装置。移除(项目);
} 

只有少数被删除。有什么建议吗?

在删除控件之前,列出要删除的控件列表。您试图从正在迭代的集合中删除项目,这可能是有问题的。

这个代码对我来说似乎很好:我怀疑您没有向面板中添加“缺失”复选框。控件,请考虑哑每个复选框文本(或标记,如果在创建int时设置每个标记具有不同的标记)。由
panel.Controls.OfType()返回。
您正在修改正在迭代的集合。。。复制您迭代过的控件列表,并将其从原始列表中删除。@fredrik,我不这么认为:他正在迭代类型为的LINQ
返回的IEnumerable,并从面板中删除。控件
,它们不是同一个集合。事实上,你的评论是我看完问题后想到的第一件事,但如果我没有遗漏什么,那就是wrong@GianPaolo既然公认的答案正是我所建议的,我想说你错了。它可能是LINQ返回的IEnumerable-但不能保证它是一个在列表副本上工作的IEnumerable…@fredrik你说得对,我刚刚检查过
OfType
返回不同的对象,但在返回每个匹配元素时,它会在原始集合上不断迭代。我尝试了类似这样的´´´foreach(panel.Controls.OfType()中的复选框项){List collect=new List();collect.Add(item);foreach(collect中的控件c){panel.Controls.Remove(c);}}}}´´´´´´并且它具有相同的结果。一种简单的方法类似于
foreach(panel.Controls.OfType().ToArray()中的复选框项){panel.Controls.Remove(item);}
the
ToArray()
call基本上会在开始迭代之前复制列表。