Коллекция была изменена; операция перечисления может не выполняться. по выбору формы

«Коллекция была изменена; операция перечисления не может быть выполнена». кажется распространенной ошибкой с foreach циклами, но я не могу понять свою. У меня есть два класса форм. Один запускается при запуске, а кнопка создает новые экземпляры второй формы и отображает их. Когда я закрываю вторичные формы, я получаю InvalidOperationException.

FirstForm.cs

public partial class FirstForm : Form
{
    SecondForm frmSecond;
    ...
    private void button1_Click(object sender, EventArgs e)
    {
        frmSecond= new SecondForm ();
        frmSecond.Show();
    }
}

SecondForm.designer.cs

partial class SecondForm
{
    ...
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing); // InvalidOperationException thrown here.
    }
}

person dlras2    schedule 18.05.2010    source источник
comment
Можете ли вы добавить трассировку стека исключения?   -  person dtb    schedule 19.05.2010


Ответы (3)


Может быть, он рекурсивно вызывает Dispose? Можете ли вы взглянуть на стек вызовов при возникновении исключения?

Если это так, сломанная коллекция будет набором элементов управления в форме.

person mfeingold    schedule 18.05.2010
comment
Не знаю, как бы я что-нибудь сломал ... Все, что я изменил, - это код из FirstForm. Я чувствую, что это ничего не должно сломать ... - person dlras2; 19.05.2010

Если вы щелкните несколько раз, ссылка в FirstForm может больше не указывать на то, что вы закрываете.

пытаться

 private void button1_Click(object sender, EventArgs e)
 {
      var second = new SecondForm();
      second.Show();
 }
person µBio    schedule 18.05.2010
comment
Даже если я создам только один экземпляр второй формы, он не удалится должным образом. - person dlras2; 19.05.2010
comment
@Hans - ой :) Виню ... себя. Однако исходная точка зрения остается неизменной. Код отредактирован. - person µBio; 19.05.2010

Проблема заключалась в PowerPacks.RectangleShape объекте, который я поместил во вторую форму и забыл (потому что он не отображался). Я удалил объект, и форма была удалена нормально.

При дальнейшем тестировании я обнаружил, что любой элемент управления, требующий PowerPacks.ShapeContainer (LineShape, OvalShape и RectangleShape,), вызывает эту проблему, а другие объекты PowerPacks - нет.

Я не уверен, почему это происходит, поэтому, если кто-то найдет обходной путь, я буду признателен. Но пока я буду избегать форм PowerPacks.

person dlras2    schedule 19.05.2010