Странное поведение события ItemCheck

Рейтинг: 0Ответов: 1Опубликовано: 02.05.2023

При нажатии на CheckBox внутри CheckListBox должно срабатывать событие ExceptionsBox_ItemCheck:

private void ExceptionsBox_ItemCheck(object sender, ItemCheckEventArgs e)
{
  Exceptions.Clear();

  foreach (var item in ExceptionsBox.CheckedItems)
  {
    Exceptions.Add(item.ToString());
  }
}

Обычно событие срабатывает при нажатии на следующий элемент, как бы с "задержкой в шаг". Как сделать, чтобы событие срабатывало всегда по нажатию на CheckBox?

Ответы

▲ 2Принят

Это не задержка, это событие возникает до того как состояние поменяется.

Есть костыль, который я не рекомендую использовать, но он просто есть, можно отложить выполнение тела метода асинхронным способом:

  1. меняете void на async void
  2. в начало метода добавляете await Task.Yield();
  3. остальной код метода оборачиваете в try-catch, чтобы не потерять контроль над возникающими исключениями и недопустить падения приложения

А рекомендую сделать что-то такое:

Допустим ни один чекбокс не помечен в изначальном состоянии, а коллекция пуста. Допустим, коллекция это List<string>.

Тогда получится как-то так.

private void ExceptionsBox_ItemCheck(object sender, ItemCheckEventArgs e)
{
    var box = (CheckListBox)sender;
    var item = box.Items[e.Index].ToString();
    if (e.NewValue == CheckState.Checked)
        Exceptions.Add(item);
    else
        Exceptions.Remove(item);
}