首页 > 解决方案 > 以编程方式选择 TabControl 中的现有 TabPage 会显示一个空白页

问题描述

TabManager如果具有指定文本的 TabPage 不存在,我使用此方法在 TabControl ( ) 中创建一个新的 TabPage ,或者如果它已经存在则选择它:

private void AddControls(UserControl uc, string TabCaption)
{           
    Boolean TabFound = false;
    if (TabManager.TabCount == 0)
    {
        TabPage tp = new(TabCaption);
        TabManager.TabPages.Add(tp);
        uc.Dock = DockStyle.Fill;
        tp.Controls.Add(uc);
        TabManager.SelectedTab = tp;               
    }
    else
    {
        TabPage tp = new(TabCaption);
        foreach (TabPage tp1 in TabManager.TabPages)
        {
            
            if (tp1.Text == TabCaption)
            {
                TabFound = true;
            }                  
        }
        if (TabFound != true)
        {                    
            TabManager.TabPages.Add(tp);
            uc.Dock = DockStyle.Fill;
            tp.Controls.Add(uc);
            TabManager.SelectTab(tp);
            //tp.Show();
            //tp.BringToFront();
        }
        else
        {
            TabManager.SelectedTab = TabManager.TabPages[tp.Name];                   
            return;
        }
    }            
}

问题是未选择 TabPage,而是显示了一个空页面。

选项卡控件空白页

有问题的代码似乎是:

 TabManager.SelectedTab = TabManager.TabPages[tp.Name]; 

因为它只会显示一个空的 TabPage。
我搜索了文档,但到目前为止没有找到解决方案。

标签: c#.netwinformstabcontroltabpage

解决方案


如果您使用提供的文本创建一个新的 TabPage(如 中TabPage tp = new(TabCaption);),则您的tp对象与具有相同 Caption 的现有 TabPage 不同,因此TabManager.SelectTab(tp);不会选择它(不是同一个对象)。

您会看到空白背景,因为当您使用TabControl.SelectedTab()方法并且指定的 TabPage 不存在时,没有 TabPage 是当前的,因此您只会看到 TabControl 背景。


要确定是添加还是只选择一个 TabPage,您可以检查 TabControl 是否没有 TabPages(就像您正在做的那样),并验证是否已经存在具有相同名称的 TabPage。
您可以使用TabPageCollection.IndexOfKey()方法来执行此检查。

您应该为新的 TabPage 分配一个名称,而不仅仅是一个 Caption,就像在 Designer 中创建一个新的 TabPage 时一样。

这简化了 TabPages 的创建和/或选择。您的代码可能是:

private void AddControls(Control uc, string tabCaption)
{
    if (TabManager.TabCount == 0 || TabManager.TabPages.IndexOfKey(tabCaption) < 0) {
        var tp = new TabPage(tabCaption);
        // or TabPage tp = new(tabCaption);
        tp.Name = tabCaption;
        uc.Dock = DockStyle.Fill;
        tp.Controls.Add(uc);
        TabManager.TabPages.Add(tp);
            
    }
    TabManager.SelectedTab = TabManager.TabPages[tabCaption];
}

推荐阅读