如何在启动时设置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 进行任何修改似乎不会影响 属性。 似乎这样更改它是安全的。
我有一个包含三个 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 进行任何修改似乎不会影响 属性。 似乎这样更改它是安全的。