如何防止ComboBox在填充时触发另一个ComboBox的SelectedIndexChanged事件

时间:2016-03-05 16:19:07

标签: c# wpf combobox ado.net selectedindexchanged

所以,基本上我正在使用ComboBox.SelectedIndexChanged事件来填充另外5个ComboBox,每个事件都有自己的SelectedIndexChanged事件。

问题在于,当第一个SelectedIndexChanged事件触发以填充其余事件时......它还会触发其他ComboBox es'SelectedIndexChanged事件。

为了防止这种情况发生,我找到了一个使用SelectionChangeCommited余下ComboBox事件的解决方案。

但是现在,该事件(与SelectedIndexChanged不同)在第一次单击ComboBox的项目时不会触发...您需要先选择该项目两到三次才能执行此操作

所以,我的问题是:有没有办法解决这些问题?

3 个答案:

答案 0 :(得分:1)

在代码中,在“填充”辅助组合框之前,取消订阅其SelectedIndexChanged事件,然后在“填充”代码运行时重新订阅

答案 1 :(得分:0)

我会创建局部变量并将其设置为SelectedIndexChanged应忽略的时间

protected bool ignoreSelectedIndexChanged = false;

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (ignoreSelectedIndexChanged) { return; }

    //rest of code
}
在我看来,比起摆弄这些事件更为明确。

在主ComboBox中使用类似:

的内容
private void comboBoxMain_SelectedIndexChanged(object sender, EventArgs e)
{            
    try
    {
        ignoreSelectedIndexChanged = true;

        //comboBox1.SelectedIndex = 1;
        //comboBox2.SelectedIndex = 2;
        //comboBox3.SelectedIndex = 3;
        //...

    }
    finally
    {
        ignoreSelectedIndexChanged = false;
    }
}

SelectionChangedCommited可能是另一种方法。但只有在用户进行选择时才会触发,这可能会限制某些情况。并且应该有圆顶的虫子没有射击。我个人避免它。

答案 2 :(得分:0)

使用标志,例如
如果你只有2个组合框

int flag =0;

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    switch(flag)
    {
       case 0:
           flag = 1;
       break;

       case 1:
           // your code here
           // after it you should set flag = 0
       break;

       default:
       break;
    }

}

private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{

    switch(flag)
    {
       case 0:
           flag = 2;
       break;

       case 2:
           // your code here
           // after it you should set flag = 0
       break;

       default:
       break;
    }        
}

就像那样,取决于你使用的组合框的数量。