tabcontrol selectedindex changed事件未被触发C#

tabcontrol selectedindex changed事件未被触发C#,c#,C#,嘿,伙计们,我有一个很小的问题,请看下面的代码 // this is main load private void Form1_Load(object sender, EventArgs e) { tabAddRemoveOperator.SelectedIndex = 0; } //this is selected index changed event method private void tabAddRemoveOperator_SelectedIndexChanged(obj

嘿,伙计们,我有一个很小的问题,请看下面的代码

// this is main load
private void Form1_Load(object sender, EventArgs e)
{
    tabAddRemoveOperator.SelectedIndex = 0;
}

//this is selected index changed event method
private void tabAddRemoveOperator_SelectedIndexChanged(object sender, EventArgs e)
{
    if (tabAddRemoveOperator.SelectedIndex == 0)
           //someCode;
    else if (tabAddRemoveOperator.SelectedIndex == 1)
           //someCode;
}
我的问题是,我正在更改
form\u load
方法上的
tab selectedindex
,所以
tab\u selectedindex changed
事件应该被触发,对吗?但事实并非如此


我在谷歌上搜索过这个问题,所以我发现一个线程说,在你的控件加载之前,它们的事件填充不会被触发,但我不认为这是正确的,因为所有控件都是在构造函数中被加载和初始化的。。因此,我对这个问题感到困惑。

您已经注册了活动吗?比如:

tabAddRemoveOperator.SelectedIndexChanged += new EventHandler(tabAddRemoveOperator_SelectedIndexChanged);

从不引发
SelectedIndex Changed
事件,因为默认的
SelectedIndex
为0。
在表单的
Load
事件处理程序中将
SelectedIndex
设置为0时,所选索引实际上不会更改为新值,因此事件永远不会引发

我想到了两种可能的解决方法:

  • 对于
    SelectedIndex==0
    输出到另一个方法的情况,您可以重构初始化代码,然后从
    SelectedIndexChanged
    事件处理程序和表单的
    Load
    事件处理程序调用该方法

  • 您可以在
    Load
    事件处理程序中将
    SelectedIndex
    设置为非0的索引,然后立即将其设置回0。这将导致
    SelectedIndex
    值更改两次,但会产生预期结果


  • 我遇到了几乎相同的问题(在我的例子中,我在表单的构造函数中设置SelectedIndex,但是我使用了一个非零值——SelectedIndexChanged事件没有触发)。 在InitializeComponent调用之后,我在表单上放置了一个带有短延迟的计时器,并在构造函数中启用了它。在计时器的滴答声事件中,我禁用了计时器(因此它只发生一次),并在那里设置选项卡控件的SelectedIndex(SelectedIndexChanged事件确实触发)


    我想出了另一种方法来强制在表单加载中触发SelectedIndexChanged事件。将表单_load中的deselectab()设置为控件上的最后一个选项卡。取消选择最后一个选项卡将导致索引移动到选项卡0并生成SelectedIndexChanged事件。

    查看位于的
    SelectedIndex
    处理程序,发现
    TabControl
    在未设置其属性的早期阶段不会触发某些事件。所以你拖延行动的方式是有道理的
        public MainForm(string[] args)
        {
            InitializeComponent();
            // tabControl1.SelectedIndex = 2; // Did not fire
            OnceAtStartupTimer.Enabled = true;
        }
    
        private void OnceAtStartupTimer_Tick(object sender, EventArgs e)
        {
            OnceAtStartupTimer.Enabled = false;
            tabControl1.SelectedIndex = 2;
        }
    
    
        private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
            // Code to run when SelectedIndex changes            
        }