面板中的Foreach控制项目不选择所有项目

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

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

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

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

我已经尝试了多种东西,从foreach控件项目和oftype控件。 要更改item.Tag!=“1”和item.Tag ==“”。 没有一个工作

但是当我实际执行代码并添加突破点时,我可以看到面板中有4个按钮。 但是当我遍历每个foreach循环时,它只会选择4个按钮中的2个。 所以,因为它只选择2个按钮,所以它只删除2个而仅剩下2个。

任何想法可能会导致这种情况,以及如何解决它?


经典系列修改问题在这里。 您在迭代时正在修改集合。 这会导致意想不到的行为。 理想情况下,你应该得到InvalidOperationException但很遗憾ControlCollection没有实现这个检查。

你有两个选择。 要么收集集合的副本,并迭代副本或使用反向for循环。

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

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

像这样尝试

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);
链接地址: http://www.djcxy.com/p/61567.html

上一篇: Foreach control item in panel not selecting all items

下一篇: updatepanel in a panel controlled by Ajax update control