Entwickler-Ecke

WinForms - Wie aktiviere ich eine Form?


ralph71 - Fr 04.11.16 13:01
Titel: Wie aktiviere ich eine Form?
Hallo,

simples Problem:
Ich habe auf Form1 einen Button. Dieser öffnet Form2. Form1 bleibt dabei offen.
Wird Form2 geschlossen, dann erscheint wieder Form1. Bis dahin ist alles gut.
Problem:
Beim erneuten Klick auf den Button im Form1 passiert gar nichts. Erst ein zweiter Klick auf den Button führt die Aktion aus.
Klickt man im Form1 auf eine leere Stelle und dann auf den Button funktioniert es auch.
Es scheint, als müsste das Form1 erst aktiviert werden und dann kann auf den Button geklickt werden.

Ich such schon Stunden rum, finde aber nur Dinge wie:

C#-Quelltext
1:
2:
3:
Form1 frm = new Form1();
frm.Focus();
frm.Activate();
usw.

Hilft alles nichts.
Ideen?
Danke euch!

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Delete - Fr 04.11.16 20:46

- Nachträglich durch die Entwickler-Ecke gelöscht -


erfahrener Neuling - Mo 07.11.16 10:04

Hallo Ralph,

ich verstehe nicht so ganz die Ursache deines Problems.

Ich zeige eine Form normalerweise so an:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
// button event auf Form1
private void buttonShowForm2_Click(object sender, EventArgs e)
{
    Form2 form2 = new Form2();
    
    // dann kannst du entscheiden, ob du auf Form1 immernoch zugreifen willst (also beide benutzbar)
    form2.Show();
    // oder während du auf Form2 arbeitest, Form1 solange blockiert ist
    form2.ShowDialog();   // gibt ein DialogResult zurück
}

Probleme damit hatte ich nie und die Form ist immer beim Start im Vordergrund.


C# - Mo 07.11.16 15:14

Tach,

du musst schon die richtige Instanz von Form1 nehmen. Einfach mit new eine neue Form erzeugen funktioniert nicht. Wenn du den Code zum fokussieren innerhalb von Form1 ausführst, reicht einfach Focus(). Bist du außerhalb von Form1 musst du dir die richtige Instanz deiner Form1 holen via Application.OpenForms.


Ralf Jansen - Mo 07.11.16 15:29

Zitat:
du musst schon die richtige Instanz von Form1 nehmen. Einfach mit new eine neue Form erzeugen funktioniert nicht.


Wenn das das Problem wäre würde auch ein 2.ter Click auf den Button nicht helfen. Das scheint es aber.

Zitat:
Es scheint, als müsste das Form1 erst aktiviert werden und dann kann auf den Button geklickt werden.


Das ist nicht das Standardverhalten bei Winforms. Du mußt schon irgendwas zusätzlich gemacht haben um dieses Vehalten zu bekommen. Überleg nochmal was du alles gemacht hast bzw. zeige uns den relevanten Code.


ralph71 - Mi 09.11.16 09:02

Hallo,
... hat etwas gedauert.

Button in Form "Start":

C#-Quelltext
1:
2:
3:
4:
5:
private void metroButton1_Click(object sender, EventArgs e)
{
    Veranstaltungen frm = new Veranstaltungen();
    frm.Show();
}

Mehr is es nicht.

Habe dann folgendes versucht im Form Veranstaltungen:

C#-Quelltext
1:
2:
3:
4:
5:
private void close(object sender, FormClosedEventArgs e)
{
    Start frm = new Start();
    frm.Focus();
}

Das Formular hat das Metro-Design. Dürfte aber egal sein.

C#-Quelltext
1:
public partial class Veranstaltungen : MetroFramework.Forms.MetroForm                    


Da das wohl nicht das Standardverhalten ist, kann ich wenn alles nichts hilft ein neues Projekt anlegen.

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Ralf Jansen - Mi 09.11.16 11:13

Du erzeigst eine neue Start Form in close. Dieser gibst du den Focus ... zumindest versuchst du das weil du diese Form ja gar nicht anzeigst, es wäre eine ander Start Form die du so in den Vodergrund holst. Der Code ist sinnfrei.

Was willst du erreichen? Das was du tust scheint nichts mit dem zu tun zu was du im ersten Post beschrieben hast. Lies den nochmal selber. Entweder du willst was anders oder du hast hier und da in der Beschreibung Form1 und Form2 verwechselt.

Wichtig in deiner Überlegungen. Soll man die Form2/Veranstaltungen gleichzeitig mehr als einmal öffnen können? Wenn mehr als eine offen sein darf und mehr als eine offen ist soll beim schließen einer solchen Form die StartForm in den Vordergrund kommen oder die zuletzt benutzte andere Form der Anwendung. Letzteres wäre Standardverhalten.


ralph71 - Mi 09.11.16 15:53

Ursache für dieses Verhalten ist:

C#-Quelltext
1:
public partial class Start : MetroFramework.Forms.MetroForm                    


Warum das Layout dieses Verhalten zeigt, keine Ahnung.

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Delete - Mi 09.11.16 21:50

- Nachträglich durch die Entwickler-Ecke gelöscht -


ralph71 - Do 10.11.16 08:17

Wie soll es funktionieren?
Formular 1 hat einen Button, der Formular 2 öffnet. Formular 2 überdeckt dabei Formular 1 (weil beide in Vollansicht). Formular 1 kann also geöffnet bleiben.
Wird Formular 2 über das "Kreuz" geschlossen erscheint wieder Formular 1. Fertig.

Das Funktioniert auch, aber der Button in Formular 1 reagiert nur auf den zweiten Mausklick. D.h. ich muss um einen anderen Button klicken zu können VORHER irgendwo im Formular 1 einmal klicken.
Die Situation ist einfach nachzustellen:
* Neues Projekt
* 2 WinForms
* Form 1 als MetroFramework.Forms.MetroForm
* Button in Form 1 der Form 2 öffnet.

btw: wenn was nicht funktioniert, dann ist es meistens "unsachgemäß" ;-)


Th69 - Do 10.11.16 11:04

Warum verwendest du dann nicht einfach

C#-Quelltext
1:
form2.ShowDialog(this);                    

(anstatt Show())?


ralph71 - Do 10.11.16 11:40

Mega!
Jetzt funktioniert es.

Vielen Dank!
You saved my day.