Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在event ControlRemoved事件之后获取刷新的选项卡页列表?_C#_.net_Winforms_Controls_Tabcontrol - Fatal编程技术网

C# 如何在event ControlRemoved事件之后获取刷新的选项卡页列表?

C# 如何在event ControlRemoved事件之后获取刷新的选项卡页列表?,c#,.net,winforms,controls,tabcontrol,C#,.net,Winforms,Controls,Tabcontrol,我有一个TabControl,用户可以使用两个用户按钮添加/删除TabPages。为了获得清晰的概念,GUI如下所示: 如果用户单击“加号”图标(主窗体是TabControl的Parent,也是TabControl本身的Parent),将添加一个包含自定义用户控件的新TabPage: TabPage indicator = new TabPage(); indicator.Controls.Add(new IndicatorTab(this.conditionsTab, this.limits

我有一个
TabControl
,用户可以使用两个用户按钮添加/删除
TabPage
s。为了获得清晰的概念,GUI如下所示:

如果用户单击“加号”图标(主窗体是
TabControl
Parent
,也是
TabControl
本身的
Parent
),将添加一个包含自定义用户控件的新
TabPage

TabPage indicator = new TabPage();
indicator.Controls.Add(new IndicatorTab(this.conditionsTab, this.limitsTab) { Dock = DockStyle.Fill});
indicatorsTab.TabPages.Add(indicator);
如果用户单击用户控件内的“删除”按钮,则会发生以下情况:

Parent.Dispose();
我已经为事件
ControlAdded
ControlRemoved
在此
TabControl
中添加了
ControlEventHandler
,我在其中运行此循环:

foreach (TabPage indicator in indicatorsTab.TabPages)
{
    //stuff
}
我的问题如下:

  • 当触发
    ControlAdded
    事件时,我会在
    indicatorsTab.TabPages
    中找到所有
    TabPages
    ,包括我期望的刚刚添加的
  • 当触发
    ControlRemoved
    事件时,我会在
    indicatorsTab.TabPages
    中找到所有
    TabPages
    ,包括刚刚删除的我意想不到的
在触发
ControlRemoved
后,我不希望删除的选项卡位于
indicatorsTab.TabPages
中。 所以我有几个问题:

  • 我的逻辑错了吗?触发事件后,移除的
    选项卡页
    是否仍在集合中
  • 如何在删除事件后获取刷新的
    TabPage
    s列表
  • 我不知道为什么,但我感觉这种发散的行为与以下事实有关:
    ControlAdded
    事件是由一个“兄弟”控件触发的(与
    TabControl
    相同的
    父控件的子控件),当
    ControlRemoved
    TabControl
    本身的子项触发时。。。如果是的话,有人能解释一下吗
    您可以将eventhandler的执行延迟到处理删除之后:

    private void tabControl1_ControlRemoved(object sender, ControlEventArgs e)
    {
        BeginInvoke(new Action(() =>
        {
            MessageBox.Show(tabControl1.TabCount.ToString());
        }));
    }
    
    显示了预期的结果


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

    尚未更新
    TabPages
    集合。在
    ControlRemoved
    事件之后,它将被删除。您可以使用循环中的
    indicatorsTab.Controls
    集合:
    foreach(indicatorsTab.Controls中的TabPage指示符)(…)
    。或者检查
    e.Control
    对象(刚移除的控件)并在循环中跳过它(可能使用它的
    名称来识别它)。谢谢,稍后将尝试此操作并接受有效的答案!这正是我想要的,非常感谢!尽管如此,了解为什么添加的
    control
    会考虑新的
    TabPage
    ,而删除的
    control
    不会考虑,还是很有意思的,但现在这是次要的:)@MatteoNNZ不客气。更新了答案,以包含有关如何在选项卡控件中删除选项卡页的一些信息。查看方法的源代码以更好地理解。@MatteoNNZ如果查看源代码,您将清楚地看到,首先将
    选项卡页
    添加到集合中,然后调用
    base.Add(选项卡页)
    Remove
    方法正好相反。@Jimi有趣的一点是,如果你把它作为一个答案来写,我至少会在它回答我的一个“较低优先级”问题时给它投上一票:)