Няма достъп до изхвърлен обект

Моята програма има множество форми. Петата и последна форма има бутон, който при натискане затваря приложението чрез метода 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
Аз съм с T.S. - имате три отделни променливи на формата в игра върху четири реда код?   -  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) в този формуляр, приложението ще излезе чисто. Ако не е, тогава от главния ще прикача манипулатор за събитието 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