zamykanie aplikacji, okna modalne, ObjectDisposedException

0

Witam.
Mam mały problem. Mam główne okno, które ukrywam wywołując drugie okno, w drugim oknie mam opcje zakończenia aplikacji, gdy ją wywołam to dostaję wyjątek przy próbie pokazania okna głównego (przy zamknieciu okna2 chce zeby pojawiło mi się z powrotem główne okno) : ObjectDisposedException was Unhandled Nie można uzyskać dostępu do usuniętego obiektu

Okno główne:

        this.Visible = false;
        // this.Hide();
        
        forma2  form2 = new forma2();
        form2.ShowDialog();

        this.Visible = true; // wyjatek w tym miejscu
        // this.Show();

Okno 2 :

      Application.Exit();

I teraz zastanawiam się jak to obejść, czy jest jakiś inny sposób oprócz złapania wyjątku czyli :

        this.Visible = false;
        // this.Hide();
        
        forma2  form2 = new forma2();
        form2.ShowDialog();
       
       try
       {
                   this.Visible = true; // wyjatek w tym miejscu
                   // this.Show();
       }
       catch{}
0

zadales sobie trud aby przeczytac co robi Application.Exit() ?
widac z postu ze nie
otoz wysyla do wszystkich okien informacje ze maja sie zamknac
wiec jak chcesz pokazac cos co sie zamknelo?
zamiast w Okno2 wolac Exit() stworz sobie jakas logike, ktora zamknie okno2 i pokaze okno-glowne

0
massther napisał(a)

zadales sobie trud aby przeczytac co robi Application.Exit() ?
widac z postu ze nie
otoz wysyla do wszystkich okien informacje ze maja sie zamknac
wiec jak chcesz pokazac cos co sie zamknelo?
zamiast w Okno2 wolac Exit() stworz sobie jakas logike, ktora zamknie okno2 i pokaze okno-glowne

wiem co robi Application.Exit(), z tym że nie wiedziałem że się wykona cała metoda, myśłełem że aplikacja zostanie po prostu ubita, a reszta kodu się nie wykona

natomiast co do pokazania znow okna glownego to , jest ono pokazywane w momencie kiedy zamknie sie okno 2 (a nie cała aplikacja), i chciałem jakoś rozwiązać tą kwestie

wymyśliłem coś takiego :
nie bede zamykał całej aplikacji z okna 2, tylko przekaże zmienną do okna glownego przy zamykaniu okna 2 i jesli bedzie miala odpowiednia wartosc to wtedy zamkne cala aplikacje

ale dzieki za odpowiedz

PS.
jak najlepiej przeslac zmienna/zmienne z okna 2 do okna glownego, bo poki co robie to na statycznych zmiennych globalnych, ale wydaje mi sie ze nie jest to za dobry sposob

0
Mario-ooooo napisał(a)

poki co robie to na statycznych zmiennych globalnych, ale wydaje mi sie ze nie jest to za dobry sposob

To jest bardzo zły sposób.

0

somekind ma zdecydowanie rację. Używanie globalnych zmiennych w takim przypadku jest kompletnie nieuzasadnione. Najprostszym rozwiązaniem będzie dodanie do Form2 dodatkowej właściwości z wynikiem jej działania i do tego obsługa DialogResult jeżeli potrzebuje jakąś kontrolę nad poprawnością operacji. Stąd wywołanie z Form1:

private int Status = 0;

private void button1_Click(object sender, EventArgs e)
{
    this.Hide();
    using (Form2 form2 = new Form2()) {
        if (form2.ShowDialog() == DialogResult.OK) {
            //zrób coś/pobierz dane
            Status = form2.Result;
        }
    }
    this.Show();
}
0
reVis napisał(a)

somekind ma zdecydowanie rację. Używanie globalnych zmiennych w takim przypadku jest kompletnie nieuzasadnione. Najprostszym rozwiązaniem będzie dodanie do Form2 dodatkowej właściwości z wynikiem jej działania i do tego obsługa DialogResult jeżeli potrzebuje jakąś kontrolę nad poprawnością operacji. Stąd wywołanie z Form1:

private int Status = 0;

private void button1_Click(object sender, EventArgs e)
{
    this.Hide();
    using (Form2 form2 = new Form2()) {
        if (form2.ShowDialog() == DialogResult.OK) {
            //zrób coś/pobierz dane
            Status = form2.Result;
        }
    }
    this.Show();
}

dzieki za odpowiedz
moglbys jeszcze dopisac jakby wygladal kod w Form2 ?

0

form ma wlasciwosc result, ktora trzeba ustawic na odpowiednia wartosc
mozna to tez wyklikac, tzn. button ma wlasciwosc, ktorej wartosc oznacza jaki dialog result jest zwracany i nie potrzeba zadnego kodatkowego kodu zamykajacego form

0

W Form2 nie będzie nic bardziej skomplikowanego niż:

//własciwość zwracająca jakiś tam wynik
public int Result { get; set; }

private void btnOk_Click(object sender, EventArgs e)
{
	//Ostatecznie ustawiamy wynik
	Result = 5;
	DialogResult = DialogResult.Ok;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1