【问题标题】:Foreach control item in panel not selecting all items面板中的 Foreach 控件项未选择所有项
【发布时间】:2014-11-28 19:14:10
【问题描述】:

我的问题是我有一个名为 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 个。

知道是什么原因造成的以及如何解决吗?

【问题讨论】:

    标签: c# .net winforms collections


    【解决方案1】:

    这里是经典的集合修改问题。您在迭代集合时正在修改集合。这将导致意外行为。理想情况下,您应该得到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);
    }
    

    【讨论】:

    • 谢谢!我很困惑,因为我一直在我的项目中使用它来做一些事情,它从来没有让我失望过。我知道现在出了什么问题了,非常感谢!
    【解决方案2】:

    这样试试

    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);
    

    【讨论】:

    • 谢谢,但 Sriram 已经给出了相同的解决方案,更简洁,更易于理解 sn-p。
    • 欢迎来到stackoverflow。当您说这样尝试时,您也可以尝试解释问题所在,否则对 OP 以及未来的读者都没有帮助。顺便说一句,好的开始。 +1
    猜你喜欢
    • 1970-01-01
    • 2013-03-02
    • 2011-05-29
    • 1970-01-01
    • 2023-03-23
    • 2018-06-05
    • 1970-01-01
    • 2022-06-14
    • 2022-11-23
    相关资源
    最近更新 更多