TabControl AddingTab event

本文关键字:event AddingTab TabControl | 更新日期: 2023-09-27 18:22:05

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

我想知道是否有一个事件会在页面添加到TabControl之前触发。如果不是,使用TabPages(列表)的事件CollectionChanged是否是正确的替代方案?

TabControl AddingTab event

我相信您要查找的事件是Control.ControlAdded事件:

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controladded.aspx

如果这也检测到何时添加了选项卡页面内部的内容,则应该能够使用事件处理程序中的ControlEventArgs.Control属性筛选出除TabPage控件之外的所有内容。

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

void onControlAdded(object sender, ControlEventArgs e) {
    var tab = e as TabPage;
    if (tab == null)
        return;
    this.myTabControlObject.TabPages.Remove(tab);
}

应该删除选项卡,但它可能会大大减慢选项卡添加过程。

尝试这样的操作,我正在TabControl页面集合中检查与要添加的页面同名的页面,如果存在,我将焦点设置为现有实例,否则将新页面添加到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);
}

ControlCollection有关的任何事情都很可能在添加控件之后被触发。

来自以上链接:

您可以通过将控件传递到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);