Не удается получить доступ к удаленному объекту

Моя программа имеет несколько форм. Пятая и последняя форма имеет кнопку, которая при нажатии закрывает приложение с помощью метода Application.Exit(). Однако каждый раз, когда я нажимаю кнопку, я получаю сообщение об ошибке «не могу получить доступ к расположенному объекту», окружающему этот код в моей первой форме:

 frm2 f2 = new frm2();
            this.Hide();
            f2.ShowDialog();
            this.Show();

Компилятор указывает, что оператор this.show() является проблемой. Может ли кто-нибудь объяснить, почему я получаю эту ошибку и как ее исправить?


person JeliBeanMachine    schedule 30.11.2012    source источник
comment
Это строка this.Hide();, на которую выбрасывается исключение? Возможно, форма, которую вы показываете в окончательной форме из (this), уже удалена. Кажется, что в этом примере отсутствует много кода, поэтому сложно диагностировать точную проблему.   -  person dash    schedule 01.12.2012
comment
В какой строке выдается исключение?   -  person craig1231    schedule 01.12.2012
comment
Я с Т.С. - у вас есть три отдельные переменные формы в четырех строках кода?   -  person 500 - Internal Server Error    schedule 01.12.2012
comment
Плохо, это должно было быть f2.ShowDialog(). В любом случае, строка, возвращающая ошибку, это this.show();   -  person JeliBeanMachine    schedule 01.12.2012
comment
Используете ли вы Application.DoEvents где-нибудь в своем коде?   -  person dcreight    schedule 01.12.2012
comment
А, значит, когда отображается f2 и вы нажимаете кнопку закрытия, он вызывает Application.Exit()? Скорее всего, ваша основная форма будет уничтожена к моменту возвращения f2.ShowDialog();. Почему бы вместо этого не проверить DialogResult из ShowDialog и не вызвать Application.Exit в вашей основной форме?   -  person dash    schedule 01.12.2012
comment
@dcreight нет, я не использую Application.DoEvents.   -  person JeliBeanMachine    schedule 01.12.2012
comment
@dash У меня есть 5 форм, которые я прохожу по порядку. Форма 1 открывается первой, а форма 5 открывается последней. Именно в форме 5 я использую метод Application.Exit().   -  person JeliBeanMachine    schedule 01.12.2012


Ответы (2)


Хорошо, отредактировал мой ответ, я воспроизвел вашу проблему. Если вы хотите использовать Form.ShowDialog, вы должны установить DialogResult элемента управления, закрывающего приложение. Таким образом, в свойствах кнопок вы должны установить результат диалога на что-то, например Cancel.

Затем в событии нажатия кнопок вы должны сделать что-то вроде этого:

    private void btnClose_Click(object sender, EventArgs e)
    {
        if (this.DialogResult == DialogResult.Cancel)
        {
            Application.Exit();
        }
    }

В противном случае, если вам не нужно использовать Form.ShowDialog, вы можете просто показать Form2. Вышеприведенное не приводит к ошибке в моем тестировании.

person dcreight    schedule 30.11.2012
comment
Это не имеет смысла. Вам не нужно вызывать Hide для формы, которую вы только что создали, и вам не нужно вызывать Show, чтобы появилось диалоговое окно модели. Эти два вызова здесь не нужны. - person Ran; 01.12.2012
comment
Было бы лучше просто закрыть форму, когда вы хотите, чтобы приложение завершилось корректно. Если ваш основной цикл сообщений был запущен с помощью Application.Run(form1) в этой форме, приложение завершится корректно. Если это не так, то из Main я бы прикрепил обработчик события Closed формы, который будет вызывать Application.Exit. Дело в том, что формы не должны вызывать Exit. - person Ran; 02.12.2012

В вашем примере кода frm2 звонил Application.Exit? Если да, то почему вы снова пытаетесь позвонить this.Show?

В любом случае, у вас может возникнуть проблема, связанная с тем, как вы запустили цикл сообщений приложения. Вы используете Application.Run() или Application.Run(form1)?

Если вы предоставили форму Application.Run() при запуске цикла сообщений, вам не следует вызывать Application.Exit для выхода из приложения. Вместо этого вы должны просто закрыть свое главное окно, что приведет к завершению цикла обработки сообщений, вызову Application.Run для возврата, и ваше приложение завершится корректно.

person Ran    schedule 01.12.2012
comment
Вызов Application.Exit() выполняется из моей пятой и последней формы. - person JeliBeanMachine; 01.12.2012