Проблема в том, что событие ItemCheck
на CheckedListBox
срабатывает до того, как элемент CheckState
действительно изменится. Это означает, что элемент, который был только что нажат, еще не был добавлен в список CheckedItems
, когда вы зацикливаетесь на нем. Он работает при втором щелчке, потому что элемент, который вы проверили при первом щелчке, находится в списке CheckedItems
к этому моменту и попадает в цикл.
Один простой способ обойти проблему - это использоватьсобытие MouseUp
вместо. Если вы перебираете CheckedIndices
вместо CheckedItems
, вам не нужен дополнительный код, чтобы попытаться выяснить индекс отмеченного элемента. Это должно сделать это:
private void TaskBox_MouseUp(object sender, MouseEventArgs e)
{
foreach (int index in taskBox.CheckedIndices)
{
fTaskBox.Items.Add(taskBox.Items[index]);
taskBox.Items.RemoveAt(index);
}
}