如何在事件 ControlRemoved 事件后获取刷新的 TabPages 列表?
How do I get the refreshed list of TabPages after event ControlRemoved event?
我有一个 TabControl
,用户可以使用两个用户按钮 add/remove TabPage
。为了清楚起见,GUI 如下所示:
如果用户点击 "Plus" 图标(Parent
是主窗体,也是 TabControl
本身的 Parent
,一个新的 TabPage
包含自定义用户控件被添加:
TabPage indicator = new TabPage();
indicator.Controls.Add(new IndicatorTab(this.conditionsTab, this.limitsTab) { Dock = DockStyle.Fill});
indicatorsTab.TabPages.Add(indicator);
如果用户单击用户控件内的 "Remove" 按钮,将发生以下情况:
Parent.Dispose();
我为事件 ControlAdded
和 ControlRemoved
添加了一个 ControlEventHandler
到这个 TabControl
,其中我 运行 这个循环:
foreach (TabPage indicator in indicatorsTab.TabPages)
{
//stuff
}
我的问题如下:
- 当触发
ControlAdded
事件时,我在indicatorsTab.TabPages
中找到所有TabPage
包括刚刚添加的 - 对我的期望
- 当
ControlRemoved
事件被触发时,我在 indicatorsTab.TabPages
中找到所有 TabPage
包括刚刚删除的 - 出乎我意料
我不希望在触发 ControlRemoved
后删除的选项卡位于 indicatorsTab.TabPages
中。
所以我有几个问题:
- 我的逻辑错了吗?被移除的
TabPage
是否预计在事件触发后立即仍在集合中?
- 如何在删除事件后获取
TabPage
的刷新列表?
- 不知道为什么,但我觉得这种不同的行为与
ControlAdded
事件是由 "brother" 控件触发(child Parent
与 TabControl
) 相同,而 ControlRemoved
由 TabControl
本身的 child 触发...如果是这样,谁能解释一下?
您可以延迟事件处理程序的执行,直到删除处理完成:
private void tabControl1_ControlRemoved(object sender, ControlEventArgs e)
{
BeginInvoke(new Action(() =>
{
MessageBox.Show(tabControl1.TabCount.ToString());
}));
}
它显示了预期的结果。
注意: TabControl
有自己的 ControlsCollection
class 并且在其 Remove
方法中,它首先删除 TabPage
控件来自 Controls
集合并引发 ControlRemoved
,然后从 TabPages
集合中删除 TabPage
。因此,在 ControlRemoved
事件中,TabPage
仍然存在于 TabPages
集合中,但不存在于 Controls
集合中。
我有一个 TabControl
,用户可以使用两个用户按钮 add/remove TabPage
。为了清楚起见,GUI 如下所示:
如果用户点击 "Plus" 图标(Parent
是主窗体,也是 TabControl
本身的 Parent
,一个新的 TabPage
包含自定义用户控件被添加:
TabPage indicator = new TabPage();
indicator.Controls.Add(new IndicatorTab(this.conditionsTab, this.limitsTab) { Dock = DockStyle.Fill});
indicatorsTab.TabPages.Add(indicator);
如果用户单击用户控件内的 "Remove" 按钮,将发生以下情况:
Parent.Dispose();
我为事件 ControlAdded
和 ControlRemoved
添加了一个 ControlEventHandler
到这个 TabControl
,其中我 运行 这个循环:
foreach (TabPage indicator in indicatorsTab.TabPages)
{
//stuff
}
我的问题如下:
- 当触发
ControlAdded
事件时,我在indicatorsTab.TabPages
中找到所有TabPage
包括刚刚添加的 - 对我的期望 - 当
ControlRemoved
事件被触发时,我在indicatorsTab.TabPages
中找到所有TabPage
包括刚刚删除的 - 出乎我意料
我不希望在触发 ControlRemoved
后删除的选项卡位于 indicatorsTab.TabPages
中。
所以我有几个问题:
- 我的逻辑错了吗?被移除的
TabPage
是否预计在事件触发后立即仍在集合中? - 如何在删除事件后获取
TabPage
的刷新列表? - 不知道为什么,但我觉得这种不同的行为与
ControlAdded
事件是由 "brother" 控件触发(childParent
与TabControl
) 相同,而ControlRemoved
由TabControl
本身的 child 触发...如果是这样,谁能解释一下?
您可以延迟事件处理程序的执行,直到删除处理完成:
private void tabControl1_ControlRemoved(object sender, ControlEventArgs e)
{
BeginInvoke(new Action(() =>
{
MessageBox.Show(tabControl1.TabCount.ToString());
}));
}
它显示了预期的结果。
注意: TabControl
有自己的 ControlsCollection
class 并且在其 Remove
方法中,它首先删除 TabPage
控件来自 Controls
集合并引发 ControlRemoved
,然后从 TabPages
集合中删除 TabPage
。因此,在 ControlRemoved
事件中,TabPage
仍然存在于 TabPages
集合中,但不存在于 Controls
集合中。