我有一个带有三个TabPages的TabControl。应用程序的初始启动始终打开左侧的第一个TabPage。对我来说,有必要设置起始TabPage(例如第二个)。
当然,我知道在开始时更改标签的可能性如下:
tabControl.SelectedTab = tabPage;
tabControl.SelectTab(tabPage);
...
但是这段代码还会激活其他事件,如TabControl.Selecting,TabControl.Deselecting,TabControl.SelectedIndexChanged等。 - 我真的想提前阻止它。
我正在寻找的是TabControl中的某种属性,如" StartingTabPageIndex" - 将其设置为1将在启动时打开第二个TabPage而不调用任何不必要的事件。
答案 0 :(得分:1)
您应该从设计器中删除与事件处理程序的绑定,并在设置初始标签页后添加它们
在设计器中删除它们之后(这不会删除事件处理程序代码)在设置所需的标签页后重新绑定表单加载事件中的事件处理程序
tabControl.SelectedTab = tabPage;
tabControl.Selected += tabControl_Selected;
.... and so on for the other events to handle....
答案 1 :(得分:1)
另一种选择。进入表单设计器,将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进行任何修改似乎都不会影响该属性。以这种方式改变它似乎 。
答案 2 :(得分:0)
我刚做了一个简单的测试,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
作为初始设置。
我没有对此进行过测试,但理论认为它应该可行: - )