Visual Studio 2012 С#: удалить ВСЕ * отмеченные элементы в CheckedListBox

Я ОЧЕНЬ новичок как в C#, так и в Visual Studio 2012, так что извините, если это кажется простым вопросом. Итак, я делаю приложение To Do List в качестве своего первого небольшого проекта с VS2012. У меня есть CheckedListBox с именем «checkedListBox1» и кнопка для одновременного удаления отмеченных (или отмеченных) элементов с именем «markButton». Я написал следующий код, но, как вы можете видеть в моем комментарии, он делает что-то странное: удаляет все остальные проверенные элементы из моей коллекции проверенных элементов.


private void markButton_Click(object sender, EventArgs e)
{
    // create a collection of the checked items in the to do list
    // then remove each of them.
    // **** ERROR: It deletes every other checked item 
    // so it deletes indeces 0..2..4..6... each time.
    CheckedListBox.CheckedItemCollection checkedItems = checkedListBox1.CheckedItems;
    for (int i = 0; i < checkedItems.Count; i++)
    {
        checkedListBox1.Items.Remove(checkedItems[i].ToString());
    }
}

person Zach King    schedule 11.02.2014    source источник
comment
Так что вы хотите удалить все отмеченные элементы?   -  person Never stop learning    schedule 11.02.2014


Ответы (1)


Когда вы удаляете элемент, коллекция checkedItems становится меньше. Просто удалите первый несколько раз:

while (checkedItems.Count > 0)
{
    checkedListBox1.Items.Remove(checkedItems[0]);
}

Или удалить в обратном порядке:

for (int i = checkedItems.Count; i > 0; )
{
    checkedListBox1.Items.Remove(checkedItems[--i]);
}

Еще лучше использовать CheckedIndices, что позволяет избежать необходимости поиска совпадающих элементов и путаницы в случае дубликатов:

var checkedItemIndices = checkedListBox1.CheckedIndices;
for (int i = checkedItemIndices.Count; i > 0; )
{
    checkedListBox1.Items.RemoveAt(checkedItemIndices[--i]);
}
person Ben Voigt    schedule 11.02.2014
comment
Спасибо, я понял это несколько минут назад и собирался ответить, но мне не хватает репутации. И да, это было решение, которое я использовал, за исключением того, что я не думал о части › 0, которая делает его проще. Я создал переменную для хранения исходного количества, а затем использовал ее как часть «i ‹ ___». Так что ваш метод немного чище, спасибо! - person Zach King; 11.02.2014
comment
Спасибо Грант. Я исправил это по-другому, но ваша точка зрения была верной. - person Ben Voigt; 11.02.2014