Laden...

Beim Verstecken eines mit ShowDialog() geöffneten Fensters verschwindet das MainForm im Hintergrund

Erstellt von C.K.2K2 vor 12 Jahren Letzter Beitrag vor 12 Jahren 4.370 Views
Thema geschlossen
C
C.K.2K2 Themenstarter:in
22 Beiträge seit 2006
vor 12 Jahren
Beim Verstecken eines mit ShowDialog() geöffneten Fensters verschwindet das MainForm im Hintergrund

Hallo zusammen,

ich habe Probleme mit ShowDialog(). Ich habe auch schon nach dem Problem gegoogelt habe aber leider nichts gefunden.

Ich habe ein MainForm das einen Button hat der ein neues Fenster über ShowDialog() öffnet. Ich benutze ShowDialog() weil das MainForm in der Zeit wo das andere Fenster geöffnet ist nicht benutzbar sein soll. Wenn ich nun das neue Fenster schließe verschwindet das MainForm in den Hintergrund und bleibt leider nicht im Vordergrund.

Was mache ich falsch?

Hier der Code aus dem MainForm:


        private void btn_Login_Click(object sender, EventArgs e)
        {
            Program.login.ShowDialog(this);
            Program.login.Activate();
            Program.login.BringToFront();
            Program.login.Focus();
        }

Und hier der Code aus dem LoginForm:


        private void btn_Login_Click(object sender, EventArgs e)
        {
            this.Hide();            
            Program.osql.Activate();
            Program.osql.BringToFront();
            Program.osql.Focus();
        }

U
58 Beiträge seit 2011
vor 12 Jahren

du hast eine mainform und eine loginform.
wenn du einen button auf der mainform drückst, soll die loginform via ShowDialog() gezeigt werden.

wenn ich in den button click event in der mainform schreibe:


Form2 frm2 = new Form2();
frm2.ShowDialog();

und die frm2 schließe, ändert das bei mir nichts an der mainform!?
wozu dieses

 
Program.login.Activate();
Program.login.BringToFront();
Program.login.Focus();

und wann/wozu benötigst du


this.Hide();

??

also um es kurz zu machen, um das zu erreichen, was du geschildert hast, benötigst du die zwei zeilen von oben:


Form2 frm2 = new Form2();
frm2.ShowDialog();

C
2.121 Beiträge seit 2010
vor 12 Jahren

ShowDialog wartet bis der Dialog wieder zu ist. Alles was du danach machst, kriegt der Dialog schon gar nicht mehr mit. Bzw genauer, es wirkt sich nicht mehr aus, weil er schon wieder geschlossen ist.

Keine Ahnung was Mainform ist und was deine Variablen für Forms enthalten, aber normalerweise sollte Focus und BringToFront nicht nötig sein, das passiert von selbst.

C
C.K.2K2 Themenstarter:in
22 Beiträge seit 2006
vor 12 Jahren

Hallo,

mit this.Hide() verstecke ich das LoginForm wieder.
Das mache ich damit ich später wieder darauf zugreifen kann.


Program.login.Activate();
Program.login.BringToFront();
Program.login.Focus()

Das war von mir ein Versuch das MainForm wieder in den Vordergrund zu holen.

Du hast Recht. Wenn ich das LoginForm über das X schließe bleibt das MainForm im Vordergrund. Und wenn ich es über this.Close() schließe bleibt es ebenfalls im Vordergrund aber bei this.Hide() verschwindet das MainForm in den Hintergrund.

Das Problem liegt also am this.Hide(). Aber Warum?

C
C.K.2K2 Themenstarter:in
22 Beiträge seit 2006
vor 12 Jahren

@ chilic

Das ich Focus() und BringToFront() nicht brauche weiß ich. War wie gesagt von mir nur ein Versuch.

U
58 Beiträge seit 2011
vor 12 Jahren

in seinem fall scheint er ihn nicht zu schließen und auch nicht erst auf button_click in der mainform zu erstellen.

sieht mir fast so aus, als wäre die loginform als private deklariert und schon zu programmstart oder wann auch immer instanziiert.

das ist m.m.n. die falsche herangehensweise.

die login form sollte auf knopfdruck deklariert und instanziiert werden.
und "verstecken" würde ich die schon gar nicht, wenn ich fertig bin.
einfach schließen und bei bedarf neu öffnen.
wie gesagt, zwei zeilen, mehr nicht.

EDIT:

mit this.Hide() verstecke ich das LoginForm wieder.
Das mache ich damit ich später wieder darauf zugreifen kann.

yo.. dachte ich mir. nicht so machen. bei bedarf erstellen und gut ist.

C
C.K.2K2 Themenstarter:in
22 Beiträge seit 2006
vor 12 Jahren

Danke für die Antwort.

Wenn ich den folgendermaßen ändere:


        private void btn_Login_Click(object sender, EventArgs e)
        {
            Login login = new Login();
            login.ShowDialog(this);
        }

Dann wird ja jedesmal ein neues LoginForm erzeugt und mir gehen die Werte aus den Feldern verloren. Deswegen habe ich das mit this.Hide() versucht.

Ich habe gerade festgestellt wenn ich ein Form mit ShowDialog öffne und später mit this.Close() schließe kann ich später wieder auf das Form zugreifen und die Werte stehen auch noch in den Feldern. Aber wenn ich ein Form mit Show() öffne und später mit Close() schließe ist das Form komplett zerstört und kann später nicht mehr darauf zugreifen und deswegen muss man dann mit this.Hide() arbeiten wenn man später nochmal auf das Form zugreifen möchte.

Wie kommt es zu dem Unterschied bei ShowDialog() und Show()?

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo C.K.2K2,

das Thema Login-Form wurde schon umfassend im Forum behandelt. Bitte benutze die Forensuche.

Ein Login-Form mit ShowDialog zu realisieren, ist eh nicht so sinnig. Starte das Login-Form besser separat und rufe erst dann das Main-Form auf.

Es wäre ansonsten auch nicht so schwer, sich beim Schließen den Zustand/Inhalt eins Forms zu merken und diesen wiederherzustellen, wenn man das Form neu öffnet.

Jedenfalls ist es kein Wunder, dass merkwürdige Dinge passieren, wenn man ein modales Fenster nur versteckt, statt es zu schließen.

Dass beim Schließen eines modalen Fensters im Gegensatz zu einem nicht-modalen Fenster kein Dispose durchgeführt wird, kannst du in der Doku nachlesen. Der Grund ist natürlich, dass man hinter dem ShowDialog noch auf das - dann schon geschlossene, aber eben nicht disposte - Fenster zugreifen können will, z.B. um Ergebnisse auszulesen.

Das alles würde ich unter Grundlagen rechnen. Siehe [Hinweis] Wie poste ich richtig? Punkt 1.1.1. Außerdem steht alles in der Doku. Siehe deshalb auch Punkt 1.1.

herbivore

Thema geschlossen