如何在启动时设置TabPage?

How To Set TabPage on start?

我有一个包含三个 TabPage 的 TabControl。应用程序的初始启动始终打开左侧的第一个 TabPage。对我来说,有必要设置起始 TabPage(例如第二个)。

当然,我知道可以这样更改开始时的选项卡:

tabControl.SelectedTab = tabPage;
tabControl.SelectTab(tabPage);
...

但此代码还会激活其他事件,如 TabControl.Selecting、TabControl.Deselecting、TabControl.SelectedIndexChanged 等。我真的很想提前阻止这种情况。

我正在寻找的是 TabControl 中的某种 属性,例如 "StartingTabPageIndex" - 将其设置为 1 将在启动时打开第二个 TabPage,而不会调用任何不必要的事件。

您应该从设计器中删除与事件处理程序的绑定,并在设置初始标签页后添加它们

在设计器中删除它们后(这不会删除事件处理程序代码)在设置所需的标签页后重新绑定表单加载事件中的事件处理程序

 tabControl.SelectedTab = tabPage;
 tabControl.Selected += tabControl_Selected;
 .... and so on for the other events to handle....

更新

我刚刚做了一个简单的测试,SelectedTab 不起作用,因为它希望在 set.

上创建句柄

但这似乎有效:

public class MyTabControl : TabControl
{
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    [Browsable(true)]
    public new int SelectedIndex
    {
        get { return base.SelectedIndex; }
        set { base.SelectedIndex = value; }
    }
}

您现在可以在设计器中看到 SelectedIndex 并可以对其进行设置。它不会更改设计器中的可见选项卡,但会存储 "initial tab index"(从零开始)。

它确实发生了变化 SelectedIndex,但它不会调用事件,因为事件是在设计器的序列化中最后分配的,因此在更改之前从未分配过它们。

一个选项是 SelectedTab 序列化。您只需要从 TabControl 派生您自己的自定义 TabControl 并具有如下内容:

public class MyTabControl : TabControl
{
  [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
  public new TabPage SelectedTab {
    get { return base.SelectedTab;  }
    set { base.SelectedTab = value; }
  }
}

这样您就可以选择您的设计师 SelectedTab 作为初始。

我还没有测试过这个,但理论上说它应该有效:-)

另一种选择。进入表单设计器,将 SelectedIndex 属性 从 0 更改为 1:

// 
// tabControl1
// 
this.tabControl1.Controls.Add(this.tabPage1);
this.tabControl1.Controls.Add(this.tabPage2);
this.tabControl1.Controls.Add(this.tabPage3);
this.tabControl1.Location = new System.Drawing.Point(223, 21);
this.tabControl1.Name = "tabControl1";
this.tabControl1.SelectedIndex = 1;      //  <--   This Line
this.tabControl1.Size = new System.Drawing.Size(300, 143);
this.tabControl1.TabIndex = 3;

事件处理程序尚未连接,在设计器中对 TabControl 进行任何修改似乎不会影响 属性。 似乎这样更改它是安全的。