C# TabControl AddingTab事件

C# TabControl AddingTab事件,c#,winforms,events,C#,Winforms,Events,我有一个选项卡控件,我想在其中阻止添加现有的选项卡页(它们由名称标识),而是将SelectedTabPage设置为这个精确的选项卡 我想知道在将页面添加到选项卡控件之前是否有触发的事件。如果不是,使用选项卡页(列表)的事件CollectionChanged是否是正确的选择?我相信您要查找的事件是控件。控件添加了事件: 如果这也检测到标签页内的内容何时被添加,那么您应该能够使用事件处理程序中的ControlEventArgs.Control属性过滤掉除TabPage控件以外的所有内容 拒绝添加控

我有一个
选项卡控件
,我想在其中阻止添加现有的
选项卡页
(它们由名称标识),而是将
SelectedTabPage
设置为这个精确的选项卡


我想知道在将页面添加到
选项卡控件
之前是否有触发的事件。如果不是,使用
选项卡页
(列表)的事件
CollectionChanged
是否是正确的选择?

我相信您要查找的事件是
控件。控件添加了
事件:

如果这也检测到标签页内的内容何时被添加,那么您应该能够使用事件处理程序中的
ControlEventArgs.Control
属性过滤掉除
TabPage
控件以外的所有内容

拒绝添加控件将稍微复杂一些。由于此事件似乎只有在添加控件后才会引发,因此您需要执行以下操作:

void onControlAdded(object sender, ControlEventArgs e) {
    var tab = e as TabPage;

    if (tab == null)
        return;

    this.myTabControlObject.TabPages.Remove(tab);
}

这应该会删除选项卡,但可能会大大降低选项卡添加过程的速度。

尝试类似的操作,我正在检查
TabControl
页面集合,查找与尝试添加的页面同名的页面,如果该页面存在,我将焦点设置为现有实例,否则,将新页面添加到
选项卡控件
。看看这样的东西是否适合你

private void button1_Click(object sender, EventArgs e)
{
    TabPage tp = new TabPage();
    tp.Name = tabPage1.Name;
    var temp =tabControl1.Controls.Find(tp.Name,true);
    if( temp.Length > 0)
    {
        tabControl1.SelectedTab = (TabPage) temp[0];
    }
    else
        tabControl1.Controls.Add(tp);
}

与控件相关的任何内容都很可能在添加控件后触发

从以上链接:

通过将控件传递到Contains方法,可以确定该控件是否是集合的成员。要获取集合中控件位置的索引值,请将该控件传递到IndexOf方法中。可以通过调用CopyTo方法将集合复制到数组中


如果需要,可以通过在
TabControl
中添加
ExtensionMethod
来清理代码,检查现有页面,设置焦点或从此处添加

例如:

namespace ExtensionMethods
{
    public static class MyExtensions
    {
        public static bool AddPage(this TabControl tc, TabPage tp)
        {
            var matchedPages = tc.Controls.Find(tp.Name, false);
            if ( matchedPages.Length > 0)
            {
                tc.SelectedTab = (TabPage)matchedPages[0];
                return true;
            }
            else
            {
                tc.TabPages.Add(tp);
                tc.SelectedTab = tp;
                return false;
            }

        }
    }
}
用法:

tabControl1.AddPage(tp);

是否有方法防止添加控件?我只能看到通过此事件访问添加控件的方法。我以前有过类似的解决方案,但我想知道是否可以直接在集合或选项卡控件中处理它。@Francis.beuchamp请参阅我的编辑,因为您处理的名称是相同的,即使它们是物理上不同的实例,Find方法会起作用。据我所知,在添加页面后,只有其他方法会响应。TabControl应该始终是表单类的私有变量。用户本人无法添加任何页面。因此,通常只有您自己的代码才能添加页面。这就引出了一个问题:为什么要保护自己不受自己代码的影响。这并不是说外部代码没有任何其他方法来添加页面,如果它真的想要的话。用户界面自动化可以访问选项卡控件。而反射总是一扇后门。停止这种做法需要采取严厉的措施。我同意Hans Passant的观点,你的要求太奇怪,也不实用。@Hans Passant在visual studio中,你不能在一个项目中打开一个文档的两个实例。相反,它调用现有实例并将SelectedTab设置为该实例。这正是我想要的行为,我不知道这意味着什么。您通过单击选项卡来选择选项卡页面,没有“打开”任何内容。如果要阻止选择页面,只需为选择事件编写一个事件处理程序,并设置e.Cancel=true。双击文件时,该文件将打开。再次执行此操作时,它不会创建选项卡页面,而是将其设置为SelectedTab。