2014-12-05 2 views
1

У меня есть этот обработчик событий, который мне нужно, при определенных условиях изменить его выбранный элемент в коде. Когда я это сделаю, он вспомнит обработчик из-за того, что он был изменен и перезаписан. Как я могу это предотвратить?C# предотвращение выбора comboxChanged событие от вызова самого себя

MessageBox.Show("Must have a repair report.", "No Report"); 
txtLocation.SelectedItem = MAIN_BACKGROUND.UserName; //here it recalls itself as I return its value to what it was before the change 
+0

@AlexFarber - Это ли это лишние накладные расходы? –

+0

@roryap Я согласен, это, вероятно, было бы намного более дорогостоящим – pquest

+1

Я должен был сделать это в последовательности загрузки формы, попробовал в обработчике и имел проблемы. Использование Boolean метода ниже. – HighARc

ответ

3

Вы можете использовать глобальное логическое значение, чтобы остановить тело события от выполнения своей основной работы в течение "внутренний" обработчик события:

private bool _alreadyChanging = false; 

private void txtLocation_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (!_alreadyChanging) 
    { 
     _alreadyChanging = true; 
     MessageBox.Show("Must have a repair report.", "No Report"); 
     txtLocation.SelectedItem = MAIN_BACKGROUND.UserName; 
     _alreadyChanging = false; 
    } 
} 
2

Вам необходимо обработать логику для пропуска изменения внутри обработчика событий. Это не способ остановить повторное обстрел.

if(txtLocation.SelectedItem == MAIN_BACKGROUND.UserName) 
    return; 

MessageBox.Show("Must have a repair report.", "No Report"); 
txtLocation.SelectedItem = MAIN_BACKGROUND.UserName; 

Edit: Добавление примера, когда вы используете булев флаг сделать то же самое

public Class class 
{ 

    private bool _shouldHandle = true; 
    public void EventHandler(object Sender, EventArgs e) 
    { 
     if(_shouldHandle) 
     { 
     _shouldHandle = false; 
     //make change 
     _shouldHandle = true; 
     } 
    } 
} 
+0

, очевидно, я не уверен, какая логика для вашего конкретного случая должна быть, но это лучшее предположение, основанное на том, что мало вы положили. – pquest

+0

'class' будет обрабатывать только каждое другое событие. '_shouldHandle = true' должен быть частью блока' if (_shouldHandle) ', чтобы гарантировать, что обработанное событие освободит блокировку при обработке будущих событий только после ее завершения. – AWinkle

1

Microsoft имели событие ComboBox.SelectionChangeCommitted поскольку NET 1.1 для предотвращения именно эта проблема.

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

+0

Я рассмотрел это событие, похоже, очень жизнеспособное решение для того, что мне нужно. Я должен был упомянуть, что я использую WPF, который из того, что я могу сказать, этого не существует. Спасибо за ваше предложение, я воспользуюсь этим в своих приложениях формы. – HighARc

Смежные вопросы