Entwickler-Ecke

WinForms - Form2.Show() funktioniert nicht


C# - Do 06.10.11 22:59
Titel: Form2.Show() funktioniert nicht
Hallo,

da sich wenn man bei C# die Startform schließt, das Programm schließt, kann ich meine Form1 nicht schließen, was ich aber tun sollte.
Jetzt habe ich eine Neue Form erstellt (FormsControl). Diese ist permanent im unsichtbar und dient nur zur Kontrolle der anderen Formen.
wenn ich jetzt von dort aus die 1. Form starte, also:

C#-Quelltext
1:
2:
LogIn loginForm = new LogIn();
loginForm.Show();

sieht dass bei mir so aus (siehe Anhang). Und mehr geht nicht.
Woran kann das liegen?
Ach ja, meine FormsControl Form springt danach in eine Endlosschleife.


daeve - Fr 07.10.11 00:17

Bin nicht sicher was du meinst aber wenn dein Problem ist das keine Komponenten sichtbar sind, musst du die Methode Initialize() aufrufen.
Und wiso eine unsichtbare Form zur Kontrolle ??


Th69 - Fr 07.10.11 11:03

Hallo C#,

du hast anscheinend deine GUI blockiert (daher wird keine Message mehr intern abgearbeitet).

Wenn du einen Login-Dialog vor deiner eigentlichen Hauptform anzeigen lassen willst, dann benutze dafür ShowDialog (diese verwendet eine eigene Message-Schleife).
Am besten du rufst diesen Login-Dialog dann in der Main-Methode auf:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
static void Main()
{
  LogIn loginDlg = new LogIn();
  if (loginDlg.ShowDialog() == DialogResult.OK)
  {
     Application.Run(new MainForm());
  }
}

Evtl. noch um Passwort-Abfrage (o.ä.) ergänzen und in einer Schleife abarbeiten (oder aber alles im Login-Dialog abfragen).


Ralf Jansen - Fr 07.10.11 11:28

Zitat:
Jetzt habe ich eine Neue Form erstellt (FormsControl). Diese ist permanent im unsichtbar und dient nur zur Kontrolle der anderen Formen.


Du musst Application.Run nicht zwingend mit einer Form aufrufen. In deinem Fall erscheint es sinnvoller dafür eine ApplicationContext [http://msdn.microsoft.com/de-de/library/ms157901.aspx] Klasse zu benutzen anstatt einer unsichtbaren Form.


C# - Fr 07.10.11 17:02

Vielen Dank für die Antworten. Habs jetzt mit einer Kombination aus beidem geschafft:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
class _Forms : ApplicationContext
    {
        public static string CurrentUser { get; set; }
        public _Forms()
        {
            LogIn loginForm = new LogIn();
            MainForm mainForm = new MainForm();

            //Now the loop starts which control the Froms
            while (true)
            {
                DialogResult res = loginForm.ShowDialog();
                if (res != DialogResult.OK) break;
                mainForm.user = CurrentUser;
                res = mainForm.ShowDialog();
                if (res == DialogResult.Retry) continue;
                if (res == DialogResult.Cancel) break;
            }
            Application.Exit();
        }

    }

Funktioniert prima.