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

本文关键字:项目 控件 于面板 选择 | 更新日期: 2023-09-27 18:32:27

我的问题是我有一个名为PanelNewFriend的面板,我正在从mysql数据库动态创建所有用户的按钮。因此,当有人单击用户并发送邀请时,应该发生的事情是它应该删除所有按钮(标签为"1"的后退按钮除外),然后再次放置所有用户的新列表的所有按钮。

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

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

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

我已经尝试了多种方法,从每个控件项到类型控件。以更改项目。标记 != "1" 和项目。标记 == "。这些都不起作用

但是当我实际执行代码并添加断点时,我可以看到面板中有 4 个按钮。但是当我完成每个 foreach 循环时,它只选择 2 个按钮中的 4 个。因此,由于它只选择 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);