Thomas Bandt

Über mich | Kontakt | Archiv

[CF] Zurück zum Start

In einer PDA-Anwendung werden ausgehend von der Start-Form diverse weitere Forms geöffnet, und das in beliebigen Ebenen. So kann man vom Start etwa "Einstellungen" aufrufen, und von da wieder "Über uns". "Über uns" kann aber auch direkt auf der Startform geöffnet werden.

Alle Forms haben aber eins gemeinsam: einen Menüpunkt "Zurück zum Start". Klickt der User diesen an, sollen sich die aktuelle Form sowie alle ihre noch geöffneten Parents schließen - bis auf die Startform.

Ginge man nach obigem Beispiel würde das bei "Start > Einstellungen > Über uns" so aussehen, dass beim Klick auf den Menüpunkt die Form "Über uns" sowie "Einstellungen" geschlossen werden müssen, "Start" als erste Form aber offen bleiben soll, und wieder in den Vordergrund geholt werden muss.

Das klingt erstmal komplizierter, als die Lösung des Problems eigentlich ist:

public static class GoToStart
{
   public static void Go(Form c)
   {
      if (c.Owner != null)
      {
         Go(c.Owner);
         c.Close();
      }
      else
      {
         c.Show();
      }
   }
}

Die Methode Go läuft rekursiv von unten nach oben alle Forms durch. Wenn sie "oben" angekommen ist, sprich kein Parent mehr vorhanden ist, bricht sie ab und holt die oberste Form in den Vordergrund.

Das setzt allerdings voraus, dass die Owner-Eigenschaft gesetzt ist, was per default nicht der Fall ist (nach meinen Tests auch nicht, wenn man die Form via ShowDialog() öffnet, obwohl IntelliSense etwas anderes erzählt). Ein Aufruf muss also wie folgt aussehen:

About a = new About();
a.Owner = this;
a.ShowDialog();

Für den Fall das man eine Form aus einem UserControl heraus öffnet, muss man natürlich die Form verwenden, in der das UserControl sich befindet:

Detail d = new Detail(TypeId);
d.Owner = (Form)this.Parent.Parent;
d.Show();

In diesem Fall befindet sich das UserControl in einem Panel (Parent) was wiederum im eigentlichen Parent, der Form liegt (Parent.Parent).

Last but not least der Aufruf der Funktion zum Schließen:

GoToStart.Go(this);

Auch hier gilt natürlich das Gleiche wie eben erwähnt, beim Aufruf aus einem UserControl muss die Parent-Form genommen werden, ansonsten die aktuelle Instanz (this).



« Zurück  |  Weiter »