Laden...

Kein FormClosed Event, wenn das Form schon in Form.Load geschlossen wird? [und Alternativen]

Erstellt von MonkeyT vor 12 Jahren Letzter Beitrag vor 12 Jahren 3.059 Views
M
MonkeyT Themenstarter:in
7 Beiträge seit 2011
vor 12 Jahren
Kein FormClosed Event, wenn das Form schon in Form.Load geschlossen wird? [und Alternativen]

Hi,

hab hier ein kleines Problem. Eigentlich klappt das perfekt. Ich öffne eine Form2, kann darin arbeiten und nachdem Form2 geschlossen wird, kommt in Form1 das Closed-Event an...
Jetzt wird während dem Laden der Form2 diese wieder geschlossen (siehe Code) und das Closed-Event scheint nicht zu kommen... Warum nicht?

private void buttonEditData_Click(object sender, EventArgs e)
{
  Form2 frm = new Form2();
  frm.FormClosed += new FormClosedEventHandler(SubForm_FormClosed);
  frm.Show();
  this.Enabled = false;
}

private void SubForm_FormClosed(object sender, FormClosedEventArgs e
{
  this.Enabled = true;
}


private void Form2_Load(object sender, EventArgs e)
{
  this.close();
}
K
85 Beiträge seit 2008
vor 12 Jahren

Wahrscheinlich wird die Form bereits wieder geschlossen, noch bevor das Event registriert wurde.

296 Beiträge seit 2007
vor 12 Jahren

Nein, er registriert das Event doch bevor er Form2 anzeigt.

FormClosed triggert erst, nachdem der Form Event Lifecycle einen bestimmten Zustand erreicht hat. Load ist dort zu früh.

Benutze stattdessen lieber das Shown-Event (wenn es auf den speziellen Anwendungsfall passt).

5.299 Beiträge seit 2008
vor 12 Jahren

(

Jetzt wird während dem Laden der Form2 diese wieder geschlossen (siehe Code) Was meinst du mit "siehe Code"? - ich sehe nix dergleichen. [EDIT=herbivore]gemeint ist das Close im Form2_Load[/EDIT]){gray}

Inhaltlich kanns schon sein, dass das Schließen eines forms, bevor es wirklich geöffnet wurde, dass dann das Form_Closed nicht ausgelöst wird.

(Hat mich eiglich immer gewundert, warums keinen Fehler gibt, wenn man im Form_Load this.Close(); schreibt.)

probiers dochma aus.

Jetzt habichs selbst ausprobiert - also in VB wird das Form_Closed ausgelöst

Edit:(

[EDIT=herbivore]gemeint ist das Close im Form2_Load[/EDIT] Aber Form2_Load wird doch gar nicht abonniert?

Der frühe Apfel fängt den Wurm.

K
85 Beiträge seit 2008
vor 12 Jahren

Jetzt habichs selbst ausprobiert - also in VB wird das Form_Closed ausgelöst

In C# wird es auch ausgelöst im Load Event, zumindest wenn ich eine Form habe und bei dieser direkt im Load-Event wieder Close aufrufe.

296 Beiträge seit 2007
vor 12 Jahren

In C# wird es auch ausgelöst im Load Event, zumindest wenn ich eine Form habe und bei dieser direkt im Load-Event wieder Close aufrufe.

Bei mir funktionierts nicht mit dem Code vom TS, erst im Shown gehts. Vielleicht Systemabhängig? Nutze Win7 Pro 32bit, mit Aero.

M
MonkeyT Themenstarter:in
7 Beiträge seit 2011
vor 12 Jahren

Habt ihr eine andere Idee wie ich das Lösen kann.

Form2 ist ein Fenster zum editieren eines Datensatzes, welcher in Form1 ausgewählt wurde. Sind diese Daten nicht korrekt wird eine Fehlermeldung ausgegeben und die Form2 soll sich wieder schließen. Danach soll man natürlich wieder in Form1 arbeiten können...

296 Beiträge seit 2007
vor 12 Jahren

Hallo MonkeyT,

sowas habe ich mir schon gedacht und habe dir im ersten Beitrag schon geraten, dafür das Shown-Event zu benutzen, an Stelle von Load.

M
MonkeyT Themenstarter:in
7 Beiträge seit 2011
vor 12 Jahren

Ah, jetzt fällt der Groschen. Wusste erst nicht was du damit meinst -> Das prüfen der Daten mit dem Shown-Event aufrufen.

Also wen es interessiert, hier die Lösung:

Form1


private void button1_Click(object sender, EventArgs e)
{
  Form2 frm = new Form2();
  frm.FormClosed += new FormClosedEventHandler(frm_FormClosed);
  frm.Show();
  this.Enabled = false;
}

void frm_FormClosed(object sender, FormClosedEventArgs e)
{
  this.Enabled = true;
}   

Form2


private void Form2_Load(object sender, EventArgs e)
{
  this.Shown += new EventHandler(Form2_Shown);
}

void Form2_Shown(object sender, EventArgs e)
{
  this.Close();
}

DANKE!!!

U
1.688 Beiträge seit 2007
vor 12 Jahren

Warum öffnest Du das Fenster im Fehlerfall überhaupt?

463 Beiträge seit 2009
vor 12 Jahren

Also ich weiß nicht, ob ich richtig verstanden habe, aber laut deinem Code wird sich Form2 niemals öffnen, da dieses im Show Event sofort (ohne Prüfung) geschlossen wird!

Stefan

296 Beiträge seit 2007
vor 12 Jahren

Hallo Stefan.Haegele,

ich denke es sollte klar sein, dass das von vorne rein nur eine Demo war, um das Problem nachzustellen.

Er wird in der richtigen Anwendung sicherlich eine entsprechende Abfrage formuliert haben.

Aber die Frage von ujr ist allerdings berechtigt. Vielleicht gibt es dort auch noch mehrere Fälle (Datensatz nicht korrekt, kann korrigiert werden, etc...). Naja alles nur Raterei und der TS scheint zufrieden zu sein...

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo zusammen,

ich möchte das bekräftigen. Auch meine Einschätzung ist, dass es besser ist, die Daten in Form1 zu validieren und wenn sie invalide sind, Form2 gar nicht erst aufzurufen.

herbivore

M
MonkeyT Themenstarter:in
7 Beiträge seit 2011
vor 12 Jahren

Hi,

ja da hatte ich mir auch ein wenig Gedanken gemacht, ob es besser ist die Daten vorher zu überprüfen.

Dieses Aufrufen der Form soll von mehreren Stellen aus möglich sein. So erzeuge ich die Form und übergebe die ID, den Rest macht die Form...
Weiß nicht, gilt es als schlechter Stil wenn man das so macht?

Und ja, der Code oben ist natürlich nur eine Demo, die diesen einen Fall darstellt...

Gruß
Monkey

296 Beiträge seit 2007
vor 12 Jahren

Hallo MonkeyT,

Dieses Aufrufen der Form soll von mehreren Stellen aus möglich sein. So erzeuge ich die Form und übergebe die ID, den Rest macht die Form...
Weiß nicht, gilt es als schlechter Stil wenn man das so macht?

Die Validierung ist eigentlich die Aufgabe der Business Logic. Die Form sollte nur die Daten präsentieren und die Aktionen des Benutzers an die BL weiterreichen.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo MonkeyT,

Dieses Aufrufen der Form soll von mehreren Stellen aus möglich sein

auch im GUI darf man Code, den man an mehreren Stellen aufrufen will, in einer Methode kapseln. 😃

herbivore