TabControl.ControlRemoved的预期行为是什么?

时间:2013-08-26 22:19:32

标签: c# .net winforms

以下代码:

    private void tabControl_ControlRemoved(object sender, ControlEventArgs e)
    {
        MessageBox.Show(tabControl.TabCount.ToString());
    }

我假设应该告诉我在关闭最后一个选项卡后TabControl中没有控件(tabpages)。但相反它告诉我有1。

这是TabControl.ControlRemoved的预期行为,还是这种错误?

2 个答案:

答案 0 :(得分:2)

这只是一个执行顺序问题。触发ControlRemoved事件后, 后,TabCount属性不会更新。这些问题在事件中很常见。

通过在引发事件并完成所有处理后执行代码来解决此问题:

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

答案 1 :(得分:1)

ControlRemoved事件在TabPage被实际删除之前被引发/触发。您的TabPage实际上仅在ControlRemoved事件之后删除,当然在ControlRemoved事件处理程序之外。在ControlRemoved内,您仍然可以访问“已删除”TabPage。要解决此问题,您可以尝试使用此代码:

private void tabControl_ControlRemoved(object sender, ControlEventArgs e)
{
    MessageBox.Show(tabControl.Controls.OfType<TabPage>().Count().ToString());        
}

这意味着,TabPage刚刚从Controls集合中删除,但仍在TabPages集合中。