У меня есть этот обработчик событий, который мне нужно, при определенных условиях, изменить его выбранный элемент в коде. Когда я это сделаю, он вспомнит обработчик из-за того, что он был изменен и перезаписан. Как я могу это предотвратить?
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
Вы можете использовать глобальное логическое значение, чтобы остановить тело события от выполнения его основной работы во время "внутреннего" обработчика события:
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;
}
}
Вам необходимо обработать логику для пропуска изменения внутри обработчика событий. Это не способ остановить повторное обстрел.
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;
}
}
}
class
будет обрабатывать только каждое другое событие. _shouldHandle = true
должен быть частью вашего блока if(_shouldHandle)
чтобы обработанное событие if(_shouldHandle)
блокировку при обработке будущих событий только после его завершения.
У Microsoft было событие ComboBox.SelectionChangeCommitted, поскольку NET 1.1 предотвращает именно эту проблему.
Это событие срабатывает только тогда, когда пользователь меняет значение со списком. Не нужно отписываться от какого-либо события или использовать логическое значение.