tabcontrol selectedindex改变了事件没有被解雇C#

时间:2010-11-19 06:08:50

标签: 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(object sender, EventArgs e)
{
    if (tabAddRemoveOperator.SelectedIndex == 0)
           //someCode;
    else if (tabAddRemoveOperator.SelectedIndex == 1)
           //someCode;
}

我的问题是,我正在更改tab selectedindex form_load方法,因此tab_selectedindexchanged事件会被解雇吗?但它不是..

我已经搜索了这个问题,所以我发现一个帖子说,直到你的控件加载他们的事件填充没有被解雇,但我不认为它是正确的,因为所有控件都被加载n只在构造函数初始化..所以我对这个问题感到困惑。

4 个答案:

答案 0 :(得分:5)

永远不会引发SelectedIndexChanged事件,因为默认 SelectedIndex为0。当您将SelectedIndex设置为0时表单的Load事件处理程序,所选索引实际上不会更改为新值,因此事件永远不会被提升。

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

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

  2. 您可以在SelectedIndex事件处理程序中将Load设置为0以外的索引,然后立即将其设置为0.这将导致SelectedIndex值改变两次,但会有预期的结果。

答案 1 :(得分:2)

我有几乎相同的问题(在我的情况下,我在表单的构造函数中设置了SelectedIndex,但我使用了非零值 - 并且没有触发SelectedIndexChanged事件。)

我在一个带有短延迟的表单上放置一个Timer,在InitializeComponent调用之后在构造函数中启用它。在计时器的Tick事件中,我禁用了计时器(因此它只发生了一次)并在那里设置了tab控件的SelectedIndex(并且SelectedIndexChanged事件确实触发了)。

    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            
    }

答案 2 :(得分:0)

您是否注册了活动?类似的东西:

tabAddRemoveOperator.SelectedIndexChanged += new EventHandler(tabAddRemoveOperator_SelectedIndexChanged);

答案 3 :(得分:0)

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