2016-03-05 5 views
1

Так, в основном я использую ComboBox.SelectedIndexChanged событие, чтобы заполнить еще 5 ComboBox с которым каждый имеет свое собственное SelectedIndexChanged события, а также.Как предотвратить ComboBox от стрельбы SelectedIndexChanged события другого ComboBox, когда заполнение его

Проблема в том, что когда первое событие SelectedIndexChanged срабатывает, чтобы заполнить остальное .. он также запускает другой ComboBox es 'SelectedIndexChanged событие.

Чтобы избежать этого, я нашел решение, используя событие SelectionChangeCommited на остальной части ComboBox es.

Но теперь это событие (в отличие от SelectedIndexChanged) не срабатывает при первом щелчке по элементу ComboBox ... вам нужно выбрать элемент два или три раза, прежде чем он это сделает.

Итак, мой вопрос: есть ли способ исправить эти проблемы?

+0

Если дочернее свойство combobox 'SelectedIndex' изменяется на -1, когда родительский' selectionChanged' срабатывает, вы можете разобрать, когда нужно действовать. Я думаю, что когда ничего не выбрано, 'SelectedIndex' переходит в -1. Поэтому по существу игнорируйте 'Selectedindex = -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 может быть другой способ, как это сделать. Но он запускается только тогда, когда пользователь делает выбор, что может быть ограничением для некоторых случаев. И были ошибки купе, которые не стреляли, когда это нужно. Я лично избегаю этого.

+0

Благодарим вас за ответ, в этом случае я должен просто забыть о событии SelectionChangedCommited или будет работать событие SelectedIndexChanged? –

+0

@watchDogMan Я добавил больше объяснений, если это поможет. –

+0

Он работал очень хорошо, Еще раз спасибо, простое решение, никогда не думал об этом tho (y) –

1

В коде, прежде чем «заполнить» вторичные выпадающие списки, отказаться от их SelectedIndexChanged события, а затем повторно подписаться, когда «заливка» код запуска

+0

Спасибо за ваш ответ, я нахожу это интересным, не могли бы вы привести пример о том, как это сделать? –

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

и так же, как, что в зависимости от количества Наримера вы используете.