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

时间:2019-02-04 22:46:15

标签: c# .net winforms controls tabcontrol

我有一个TabControl,用户可以使用两个用户按钮向其中添加/删除TabPage。为了清楚起见,GUI如下所示:

enter image description here

如果用户单击“加号”图标(ParentParent本身的TabControl的主要形式),则新的TabPage包含自定义用户控件的内容会被添加:

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

如果用户单击用户控件内的“删除”按钮,则会发生以下情况:

Parent.Dispose();

对于事件ControlEventHandlerTabControl,我在此ControlAdded中添加了ControlRemoved,在其中运行以下循环:

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

我的问题如下:

  • 触发ControlAdded事件后,我在indicatorsTab.TabPages中发现了所有TabPage ,包括刚刚添加的一个-我愿意 strong>
  • 触发ControlRemoved事件后,我在indicatorsTab.TabPages中发现了所有TabPage ,包括刚刚删除的一个-我不期望

在触发indicatorsTab.TabPages之后,我不希望删除的标签位于ControlRemoved中。 所以我有几个问题:

  1. 我的逻辑错误吗?触发事件后,是否期望移除的TabPage仍在集合中?
  2. 如何在删除事件之后获取TabPage的刷新列表?
  3. 不知道为什么,但是我感觉到这种不同的行为有一个事实,那就是ControlAdded事件是由“兄弟”控件(与{{1} Parent),而TabControl是由ControlRemoved本身的子级触发的...如果是这样,有人可以解释一下吗?

1 个答案:

答案 0 :(得分:2)

您可以将事件处理程序的执行延迟到处理完删除操作之后:

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

它显示了预期的结果。

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