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

How to prevent a ComboBox from firing another ComboBox's SelectedIndexChanged event when filling it

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

问题是当第一个 SelectedIndexChanged 事件触发以填充其余事件时..它还会触发另一个 ComboBoxes' SelectedIndexChanged 事件。

为了防止这种情况发生,我找到了在 ComboBoxes 的其余部分使用事件 SelectionChangeCommited 的解决方案。

但是现在,该事件(与 SelectedIndexChanged 不同)不会在第一次单击 ComboBox 的项目时触发...您需要 select 第二个项目或之前的三倍。

所以,我的问题是:有什么办法可以解决这些问题吗?

在代码中,在 'fill' 辅助组合框之前,取消订阅它们的 SelectedIndexChanged 事件,然后在 'fill' 代码具有 运行

时重新订阅

我会制作局部变量并将其设置为 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 个组合框

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;
    }        
}

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