我有一个TabControl
,用户可以使用两个用户按钮向其中添加/删除TabPage
。为了清楚起见,GUI如下所示:
如果用户单击“加号”图标(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
,我在此ControlAdded
中添加了ControlRemoved
,在其中运行以下循环:
foreach (TabPage indicator in indicatorsTab.TabPages)
{
//stuff
}
我的问题如下:
ControlAdded
事件后,我在indicatorsTab.TabPages
中发现了所有TabPage
,包括刚刚添加的一个-我愿意 strong> ControlRemoved
事件后,我在indicatorsTab.TabPages
中发现了所有TabPage
,包括刚刚删除的一个-我不期望 在触发indicatorsTab.TabPages
之后,我不希望删除的标签位于ControlRemoved
中。
所以我有几个问题:
TabPage
仍在集合中?TabPage
的刷新列表?ControlAdded
事件是由“兄弟”控件(与{{1} Parent
),而TabControl
是由ControlRemoved
本身的子级触发的...如果是这样,有人可以解释一下吗? 答案 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
集合中。