如何在开始时设置选项卡页

本文关键字:选项 设置 开始时 | 更新日期: 2023-09-27 18:37:24

我有一个带有三个TabPages的TabControl。应用的初始启动始终打开左侧的第一个选项卡页。对我来说,有必要设置起始选项卡页面(例如第二个)。

当然,我知道像这样更改启动选项卡的可能性:

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

但是这段代码也会激活其他要触发的事件,如 TabControl.Selecting、TabControl.Deselecting、TabControl.SelectedIndexChanged 等——我真的很想提前防止这种情况。

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

如何在开始时设置选项卡页

另一种选择。 进入窗体设计器,将 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 进行任何修改似乎不会影响该属性。 以这种方式更改它似乎是安全的。

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

设计器中删除它们(这不会删除事件处理程序代码)后,在设置所需的选项卡页后,在窗体加载事件中重新绑定事件处理程序

 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并可以对其进行设置。它不会更改设计器中的可见选项卡,但会存储"初始选项卡索引"(从零开始)。

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

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

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

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

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