C # предотвращение события combox selectionChanged от вызова самого себя

1

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

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 Я согласен, это, вероятно, будет намного дороже
Показать ещё 1 комментарий
Теги:

3 ответа

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; 

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

public Class class
{

    private bool _shouldHandle = true;
    public void EventHandler(object Sender, EventArgs e)
    {
      if(_shouldHandle)
      {
        _shouldHandle = false;
        //make change
        _shouldHandle = true;
      }
    }
}
  • 0
    очевидно, я не уверен, какова должна быть логика для вашего конкретного случая, но это лучшее предположение, основанное на том, что вы мало отметили.
  • 0
    class будет обрабатывать только каждое другое событие. _shouldHandle = true должен быть частью вашего блока if(_shouldHandle) чтобы обработанное событие if(_shouldHandle) блокировку при обработке будущих событий только после его завершения.
1

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню