У меня была именно та проблема, которая указана в вопросе, так что это может кому-то помочь. Я пытался очистить контрольную коллекцию перед тем, как переписать ее.
private void clearCollection(Control.ControlCollection target)
{
foreach (Control Actrl in target)
{
if (Actrl is Label || Actrl is Button)
{
target.Remove(Actrl);
}
}
}
При удалении элемента управления внутри цикла foreach он должен связываться с внутренними указателями, в результате чего элементы управления в коллекции пропускаются.
Моим решением было найти все элементы управления, а затем удалить их в отдельном цикле.
private void clearCollection(Control.ControlCollection target)
{
List<Control> accumulator = new List<Control>();
foreach (Control Actrl in target)
{
if (Actrl is Label || Actrl is Button)
{
accumulator.Add(Actrl); // find all controls first.
}
}
for (int i = 0; i < accumulator.Count; i++)
{
target.Remove(accumulator[i]);
}
}