如何在事件 ControlRemoved 事件后获取刷新的 TabPages 列表?

How do I get the refreshed list of TabPages after event ControlRemoved event?

我有一个 TabControl,用户可以使用两个用户按钮 add/remove TabPage。为了清楚起见,GUI 如下所示:

如果用户点击 "Plus" 图标(Parent 是主窗体,也是 TabControl 本身的 Parent,一个新的 TabPage 包含自定义用户控件被添加:

TabPage indicator = new TabPage();
indicator.Controls.Add(new IndicatorTab(this.conditionsTab, this.limitsTab) { Dock = DockStyle.Fill});
indicatorsTab.TabPages.Add(indicator);

如果用户单击用户控件内的 "Remove" 按钮,将发生以下情况:

Parent.Dispose();

我为事件 ControlAddedControlRemoved 添加了一个 ControlEventHandler 到这个 TabControl,其中我 运行 这个循环:

foreach (TabPage indicator in indicatorsTab.TabPages)
{
    //stuff
}

我的问题如下:

我不希望在触发 ControlRemoved 后删除的选项卡位于 indicatorsTab.TabPages 中。 所以我有几个问题:

  1. 我的逻辑错了吗?被移除的 TabPage 是否预计在事件触发后立即仍在集合中?
  2. 如何在删除事件后获取 TabPage 的刷新列表?
  3. 不知道为什么,但我觉得这种不同的行为与 ControlAdded 事件是由 "brother" 控件触发(child ParentTabControl) 相同,而 ControlRemovedTabControl 本身的 child 触发...如果是这样,谁能解释一下?

您可以延迟事件处理程序的执行,直到删除处理完成:

private void tabControl1_ControlRemoved(object sender, ControlEventArgs e)
{
    BeginInvoke(new Action(() =>
    {
        MessageBox.Show(tabControl1.TabCount.ToString());
    }));
}

它显示了预期的结果。

注意: TabControl 有自己的 ControlsCollection class 并且在其 Remove 方法中,它首先删除 TabPage 控件来自 Controls 集合并引发 ControlRemoved,然后从 TabPages 集合中删除 TabPage。因此,在 ControlRemoved 事件中,TabPage 仍然存在于 TabPages 集合中,但不存在于 Controls 集合中。