以编程方式选择 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 会显示一个空白页的主要内容,如果未能解决你的问题,请参考以下文章