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有趣的一点是,如果你把它作为一个答案来写,我至少会在它回答我的一个“较低优先级”问题时给它投上一票:)