Необработанное исключение при открытии, закрытии и повторном открытии новой формы - PullRequest
0 голосов
/ 22 января 2012

Я получаю ObjectDisposedException was unhandled с сообщением Cannot access a disposed object.

Это происходит, когда инициализируйте эту дочернюю форму в начале моего класса с помощью MyForm myForm = new MyForm();, а затем добавьте некоторый текст в мое текстовое поле этой формы с помощью myForm.txtBox.AppendText("Text");, а затем откройте мою новую форму, используя некоторую кнопку с кодом myForm.Show();. Теперь, когда моя работа закончена, я могу закрыть форму. Теперь, когда я хочу снова отобразить данные, я получаю это исключение.

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

Как этого избежать, чтобы я мог просматривать новое содержимое форм при каждом нажатии кнопки?

Ответы [ 3 ]

3 голосов
/ 22 января 2012

Из документации MSDN по Form.Close:

Когда форма закрыта, все ресурсы, созданные внутри объекта, закрыт и форма утилизируется. Вы можете предотвратить закрытие формы во время выполнения путем обработки события закрытия и установки отмены свойство CancelEventArgs, переданное в качестве параметра вашему событию обработчик. Если форма, которую вы закрываете, является формой запуска вашего приложение, ваша заявка заканчивается.

Вы можете зафиксировать событие Form.Closing в форме, отменить событие и скрыть форму вместо Close ее.

1 голос
/ 22 января 2012

Вы должны захватить событие FormClosing, как сказал М. Бэбкок, но я также рекомендую вам проверить причину закрытия, если пользователь запросил это, вы можете отменить и сделать все, что захотите: private

void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.UserClosing)
    {
        e.Cancel = true;

        // Make your form dissappear of whatever you want
    }
}

В противном случае вы не сможете закрыть его, если захотите.

1 голос
/ 22 января 2012

Проблема заключается в том, что вы создаете экземпляр MyForm в начале класса и используете его каждый раз при нажатии кнопки.К сожалению, это не сработает.Как только форма закрыта, она будет удалена и, следовательно, больше не действительна.Это бросит в следующий раз, когда вы попытаетесь показать это

Самый простой способ обойти это - создать и отобразить форму целиком в пределах события нажатия кнопки.Не используйте его повторно между щелчками.

void OnButtonClick(object sender, EventArgs e) {
  using (MyForm myForm = new MyForm()) {
    myForm.txtBox.AppendText("Test");
    myForm.ShowDialog(this);
  }
}

Если есть какое-то состояние, которое необходимо сохранять между щелчками, например, текст, сохраните это, но не экземпляр Form.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...