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

Posted

技术标签:

【中文标题】以编程方式选择 TabControl 中的现有 TabPage 会显示一个空白页【英文标题】:Programmatically selecting an existing TabPage in a TabControl shows a blank page 【发布时间】:2021-10-16 07:13:52 【问题描述】:

如果具有指定文本的 TabPage 不存在,我使用此方法在 TabControl (TabManager) 中创建一个新的 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。 我搜索了文档,但到目前为止没有找到解决方案。

【问题讨论】:

我认为,但我不确定,选项卡上的控件仅在选择选项卡时创建(在 Win32 意义上)。我相信有一种方法可以强制以编程方式发生这种情况,但是自从我这样做以来已经有十年左右的时间了,我不记得是如何做到的。也许这条评论会影响别人的记忆 【参考方案1】:

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

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


要确定是添加还是仅选择 TabPage,您可以检查 TabControl 是否没有 TabPage(就像您正在做的那样),并验证是否已经存在具有相同 Name 的 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];

【讨论】:

Annnnnd 你的回答让我意识到,由于 SelectTab 中使用的比较,我的回答在客观上是不正确的。很好的答案! 哦,谢谢。那应该比我拥有的代码更简单。注意 tp.Name = tabCaption;因为这是我错过的。再次感谢。

以上是关于以编程方式选择 TabControl 中的现有 TabPage 会显示一个空白页的主要内容,如果未能解决你的问题,请参考以下文章

UWP TabView 以编程方式更改选项卡

无法以编程方式将视图添加到情节提要中的现有子视图

WPF TabControl在开始时没有选择的项目

iOS:从现有单元格以编程方式创建表“标题”

如何以编程方式删除在 XML 中定义的现有规则?

C# - 如何使用 PrintDocument 以编程方式打印现有 PDF 文件