以编程方式选择 TabControl 中的现有 TabPage 显示空白页

Programmatically selecting an existing TabPage in a TabControl shows a blank page

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

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 没有 selected,而是显示了一个空白页面。

违规代码似乎是:

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

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

如果您使用提供的文本创建新的 TabPage(如 TabPage tp = new(TabCaption);),您的 tp object 与具有相同标题的现有 TabPage 不同,因此TabManager.SelectTab(tp);不会select吧(不一样object)。

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


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

您应该为新的 TabPage 指定名称,而不仅仅是标题,因为在设计器中创建新的 TabPage 时会发生这种情况。

这简化了 TabPages 的创建 and/or selection。您的代码可以是:

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];
}