Entwickler-Ecke

WinForms - Problem mit Schließen einer Form


ramatus - Do 17.11.11 09:37
Titel: Problem mit Schließen einer Form
Hi,

ich wechsel zwischen 2 Forms hin und her. Nun ist mir aufgefallen , dass wenn ich den Schließen Button des Fenster betätige diese Wechsel auch
vollzogen wird woran liegt das ?

viele grüße

claudia


jaenicke - Do 17.11.11 09:45

Weil das zweite Fenster dann ja auch geschlossen wird und ShowDialog zurückkehrt.

Wenn du das nicht möchtest, kannst du im Ereignis FormClosing des zweiten Fensters auf den Wunsch des Benutzers das Fenster zu schließen reagieren und es mit dem Setzen von e.Cancel auf true abbrechen. Dann bleibt das Fenster offen. Allerdings ist die Frage, ob das das ist was der Benutzer möchte. Eine Nachfrage wäre zumindest sinnvoll. ;-)

Nebenbei kann der komplette Wechsel zwischen Fenstern den Benutzer auch verwirren, weil das erste Fenster komplett weg ist. Oft ist es sinnvoller dieses im Hintergrund offen zu lassen. Mit ShowDialog kommt an das erste Fenster ohnehin niemand heran während das zweite angezeigt wird.


ramatus - Do 17.11.11 10:42

Das passiert doch aber auch wenn ich versuche die Startform zu beenden. Eigentlich war es schon so gedacht, dass ich das erste Fenster als
Willkommensbildschirm benutzten wollte.
Kehre ich nun aber zurück zum Ausgangsfenster und will die gesamte Anwendung schließen, dann öffnet er nun wieder das 2 Fenster und das möchte ich natürlich nicht.

Liebe Grüße

Claudia


P.S. Ich habe das mal versucht , wenn ich das Ausgangsfenster geöffnet lasse tritt der selbe Fehler auf. Ich kann die Anwendung nicht schließen.


mats74 - Do 17.11.11 14:16

Hallo Claudia

Zum Schliessen der geladenen Forms kannst Du die Funktion Application.ExitThread() durch irgend ein Ereignis auslösen.
Der geladene Thread wird dann beendet und die geladenen Forms logischerweise auch.


jaenicke - Do 17.11.11 15:48

Du meinst dann wohl etwas in der Richtung Splashscreen:
http://www.codeproject.com/KB/cs/prettygoodsplashscreen.aspx
Suche bei Google C# SPLASHSCREEN

Das Vorgehen sollte eigentlich genau umgekehrt sein:
Der Splashscreen wird beim Start angezeigt, aber das Hauptfenster, das danach kommt, ist auch das Hauptfenster. Zumindest ist das in Delphi so, in C# habe ich das noch nie gemacht.

Jedenfalls könntest du natürlich auch (wenn du das so willst) nach dem ShowDialog die Anwendung schließen statt das erste Fenster wieder anzuzeigen. Das kannst du dann auch unterscheiden, je nachdem wodurch das Fenster geschlossen wurde. Dafür hat ShowDialog einen Rückgabewert, den du beim Klicken des Buttons setzen kannst, wenn dann etwas anderes passieren soll:
http://msdn.microsoft.com/en-us/library/65ad5907.aspx


ramatus - Do 17.11.11 16:50

Hallo,

bis jetzt geht das immer noch nicht, ich möchte doch nur den schließen button oben in der ecke benutzten um das Fenster zu schließen.
ich habe doch gar kein ja bzw. nein button.

gibt es da nicht eine lösung für ?

liebe grüße claudia


mats74 - Do 17.11.11 17:25

Wenn Du das Kreuz in der oberen Ecke benutzt, kannst Du mit dem FormClosing-Ereignis den Vorgang beeinflussen, also dein Form schliessen oder halt eben nicht.

C#-Quelltext
1:
2:
3:
4:
5:
6:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    e.Cancel = false// Schliesst das Form
    // oder
    Application.ExitThread(); // Schliesst den Thread inklusiv die geladenen Forms
}

Dass das Form nicht automatisch geschlossen wird, ohne beeinflussung dieses Events finde ich irgenwie merkwürdig :gruebel: .
Ich brauche diesen Event beispielsweise zum Verhindern eines Abbruch des Forms bei bestimmten Programmbedingungen.
Ansonsten würdest Du uns mit ein Bisschen Beispielcode bei der Lösung behilflich sein.


ramatus - Do 17.11.11 17:40

ich habe einen startbildschirm mit 3 button und momentan 2 forms es sollen einmal 4 forms werden.
beim button klick event rufe ich die neue form auf und kann auch wieder zurück . nur wenn ich dann den startbildschirm normal mit den kreuz schließen will ruft
er wiederum die unterform auf. in abap hätte ich jetzt gesagt das der ok code noch nicht leer ist und erst gecleart werden muss . aber wie macht man das in c #


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
namespace WindowsFormsApplication1
{
    public partial class Willkommen : Form
    {
        public Willkommen()
        {
            InitializeComponent();
        }
          Auswertung form =new Auswertung();
        private void Lieferanten_Click(object sender, EventArgs e)
        {
// 1 Button
            DialogResult = DialogResult.None;
        
            using (Auswertung MyForm = new Auswertung())
                MyForm.ShowDialog();
            this.Show();
   
        }
// 2 Button
        private void btnSupply_Click(object sender, EventArgs e)
        {


        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {
         
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }


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


ramatus - Do 17.11.11 18:17

ich habe jetzt eine andere möglichkeit gefunden , man kann ja ein button zum schließen defenieren und das habe ich gemacht und gut ist.

aber danke trotzdem für eure mühe.


liebe grüße

claudia

Eine Frage habe ich aber noch , habt ihr ein Beispiel wie ich an eine Auswahlbox eine Datenbanktabelle anknüpfen kann und diese dann als Diagramm ausgeben kann ?


Beispiel 5 Leute haben übers jahr so und so viel geraucht und das will ich dann als diagramm darstellen entweder alle zusammen oder jeder einzeln.


Th69 - Do 17.11.11 20:24

Hallo ramatus,

bitte erstelle für die neue Frage auch ein neues Thema, danke.


lothi - Do 01.12.11 14:51

Hallo

Vielleicht noch zum Ausgangsproblem wenn ich es richtig verstanden habe.

Wenn du ein Projekt erstellst, wird in der Main Methode automatisch das erstellte Form in der Nachrichtenschleife geöffnet:


C#-Quelltext
1:
2:
3:
4:
5:
public static void Main()
{
   Application.Run(new MyForm());

}


Schliesst du nun das Formular wird auch die Nachrichtenschleife beendet und schwups wird alles geschlossen. Also muss das Anzeige Formular da raus.

Gruss Lothi