以编程方式选择 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];
}
如果具有指定文本的 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];
}