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

问题描述 投票:2回答:1

我有一个TabControl该用户可以添加/删除TabPages使用两个用户的按钮。为了得到一个明确的想法,图形用户界面看起来是这样的:

enter image description here

如果用户点击了“加”图标(Parent是主要的形式,其也是Parent本身的TabControl),包含自定义用户控制的新TabPage被添加:

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

如果用户点击在用户控制内部的“删除”按钮时,会出现以下情况:

Parent.Dispose();

我增加了一个ControlEventHandler这个TabControl的事件ControlAddedControlRemoved,我在其中运行这个循环:

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

我的问题是这样的:

  • 当触发事件ControlAdded,我indicatorsTab.TabPages找到所有TabPage包括刚刚添加的一个 - 预期ME
  • 当触发事件ControlRemoved,我indicatorsTab.TabPages找到所有TabPage包括只是删除了一个 - 不期而至ME

我不希望被去除的标签是在indicatorsTab.TabPagesControlRemoved被触发后。所以,我有几个问题:

  1. 我是不是错在我的逻辑是什么?难道是预计除去TabPageto是仍然在集合中的事件被触发后,对不对?
  2. 我怎样才能得到TabPages的拆除事件发生后刷新列表?
  3. 不知道为什么,但我得到这个发散行为已经看到的东西与事实ControlAdded事件是由“兄弟”控制(同ParentTabControl的孩子)引发的感觉,而ControlRemoved由触发在TabControl本身的孩子......如果是这样,任何人都可以请解释?
c# .net winforms controls tabcontrol
1个回答
2
投票

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

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

它显示了预期的结果。

注:TabControl都有自己ControlsCollection类,并在其Remove方法,它首先去除TabPage收集Controls控制和提高ControlRemoved,然后删除TabPage收集TabPages。因此,作为一个结果,在ControlRemoved情况下,TabPage仍然存在TabPages集合中,而不是在Controls集合。

© www.soinside.com 2019 - 2024. All rights reserved.