StackOverflow при закрытии моей формы - PullRequest
2 голосов
/ 25 мая 2011

Я пытаюсь закрыть свою основную (родительскую) форму, когда закрывается дочерняя форма. Однако это дает мне исключение StackOverflow.

Однако, если я вызываю _child.Dispose для события FormClosed, он работает как положено. Должен ли я сделать это? Почему я должен позвонить в Dispose? (из-за .Show () это не должно быть правильно, верно?

Небольшая демонстрация:

public partial class frmChild : Form
{
    public frmChild()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.Close();
    }
}

public partial class frmParent : Form
{
    private frmChild _child;

    public frmParent()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        _child = new frmChild();
        _child.FormClosed += child_FormClosed;
        _child.Show(this);
    }

    void child_FormClosed(object sender, FormClosedEventArgs e)
    {
        //_child.Dispose(); <-- uncomment and it works
        this.Close(); // <-- StackOverflow exception
    }
}

Решение, прокомментированное Теоманом Сойгулом (для дальнейшего использования):

Закрытие основной формы this.Close (); сигнализирует всем детям окна закрыть, чтобы создает бесконечный цикл

После вызова this.Close () в родительском объекте он будет сигнализировать всем дочерним элементам Close aswel, который отправит другое событие FormClosed ... Я решил это, не указав владельца в _child.Show(); Я все равно не использовал владельца.

1 Ответ

6 голосов
/ 25 мая 2011

Поскольку каждый раз, когда вы вызываете this.Close();, происходит событие FormClosed, которое затем вызывает this.Close();, вы создаете бесконечный цикл.С другой стороны, если форма уже удалена (как вы раскомментируете строку утилизации), событие FormClosed не запускается снова, поскольку объект уже удален.Таким образом, размещение формы на мероприятии является правильным, или, если вы не хотите этого делать, вы можете добавить дополнительную проверку с частным полем bool, например:

if (!formClosed)
{
  this.formClosed = true;
  this.Close();
}
...