面板中的Foreach控件项目未选择所有项目

时间:2014-11-28 19:14:11

标签: c# .net winforms collections

我的问题是我有一个名为PanelNewFriend的面板,我从一个mysql数据库动态创建所有用户的按钮。因此,当有人点击用户并发送邀请时,应该发生的是它应该删除所有按钮(除了标记为“1”的后退按钮)然后再次将所有按钮放入新的列表所有用户。

创建按钮时,我为它们分配了值为“0”的标签。所有按钮都有它,即使我不认为问题出在标签上。

我正在使用此代码删除面板中的所有按钮。

foreach (Button item in PanelNewFriend.Controls.OfType<Button>())
        {
            if (item.Tag == "0")
            {
                PanelNewFriend.Controls.Remove(item);
            }
        }

我尝试过多种方法,包括foreach Control item和oftype Control。要更改item.Tag!=“1”和item.Tag ==“”。这些都不起作用

但是当我实际执行代码并添加断点时,我可以看到面板中有4个按钮。但是当我经历每个foreach循环时,它只选择4个按钮中的2个。因此,由于它只选择了2个按钮,因此只删除2个而另外2个按钮。

知道是什么导致了这个以及如何解决它?

2 个答案:

答案 0 :(得分:1)

经典集合修改问题在这里。当你迭代它时,你正在修改集合。这将导致意外行为。理想情况下,您应该获得InvalidOperationException,但遗憾的是ControlCollection未执行此检查。

您有两种选择。获取集合的副本并迭代副本或使用反向循环。

var buttonsToRemove = PanelNewFriend.Controls
                                .OfType<Button>()
                                .Where(x=> x.Tag == "0")
                                .ToArray();//Take a copy

foreach (Button item in buttonsToRemove)
{
    PanelNewFriend.Controls.Remove(item);
}

答案 1 :(得分:1)

试试这个

List<Button> removeList = new List<Button>();
foreach (Button item in PanelNewFriend.Controls.OfType<Button>())
{
  if (item.Tag == "0")
  {
    removeList.Add(item);
  }
}
foreach (Button item in removeList)
  PanelNewFriend.Controls.Remove(item);