none
C# Schließen einer Form über eine Klasse RRS feed

  • Frage

  • Hallo,

    Ich habe nun nach längeren suchen dazu entschlossen, dass ich mich an euch wende.

    Ein grober Aufbau meiner Programmes:

    Form2 wird durch eine Klasse geöffnet.

    Form1:

    Fensteroeffnen frm1 = new Fensteroeffnen(); frm1.Startseite_oeffnen();

    Klasse:

    public void Startseite_oeffnen()
            {
                Startseite frm1 = new Startseite();
                frm1.Show();
            }

    Form1 soll nach dem öffnen von Form2 gehidden werden, was ich aber dann nicht zusammen bringe. 

    Am besten wäre es wenn es ebenfalls in einer Klasse möglich ist.

    Ich bekomme es zwar hin, Form1 über Form2 zu schließen aber nicht wenn Form2 über eine Klasse aufgerufen wird, da ich die Werte von Form1 nicht auf Form2 übertragen kann um diese zu schließen.

    MfG Markus Ö.



    • Bearbeitet Bashesz Mittwoch, 1. Januar 2014 01:47
    Dienstag, 31. Dezember 2013 20:58

Antworten

  • Hallo Markus Ö.

    Ich nehme an, dass du beide Formen selbst geschrieben hast, und so auch eine Kleinigkeit ändern kannst.

    Du kannst du einfach eine statische Klasse erstellen, in welch sich beide Formen "Registrieren", damit Sie verfügbar sind. der Rest kann dann über die Events erledigt werden.

    Hier ein Beispiel, was ich meine (für WPF - musst aber nur die Namen anpassen):

       
        public static class WindowHelper
        {
            //Form1 soll nach dem öffnen von Form2 überdeckt werden. 
            private static Window _startWindow; //Form1
            private static Window _secondWindow; //Form2
    
            public static void RegisterStartWindow(Window w) 
            {
                WindowHelper._startWindow = w;
            }
    
            public static void RegisterSecondWindow(Window w)
            {
                WindowHelper._secondWindow = w;
                w.Loaded += w_Loaded; //Geöffnet
            }
    
            private static void w_Loaded(object sender, RoutedEventArgs e)
            {
                if (WindowHelper._startWindow != null)
                {
                    _startWindow.Close(); //Schließen
                }
            }
    
            //...
        }
    
        public sealed partial class Startwindow : Window
        {
            public Startwindow()
            {
                WindowHelper.RegisterStartWindow(this);
            }
        }
    
        //... Die andere Form

    Mit freundlichen Grüßen

    Thomas R.

    • Als Antwort markiert Bashesz Mittwoch, 1. Januar 2014 18:51
    Mittwoch, 1. Januar 2014 13:19
  • Hallo Markus,

    vorab: benenn deine Variablen doch sinnvoll. Dann liest sich der Code (auch für dich) erheblich besser. So hab ich keine Ahnung, was bei dir nun Form1, Form2, die "Klasse", ... sein soll.

    Um dir sagen zu können, was Du wo wie machen kannst/musst, um dein Vorhaben zu realisieren, müsstest Du uns bitte sagen, wann und auf welchem Weg Du Form1, Form2, ... öffnen und schließen willst.

    Wird das zentral über deine "Klasse" geht, wann passiert das und kann es auch andere Formulare geben, die angezeigt/versteckt werden müssen?

    Oder ist das verschachtelt, also Form1 wird über deine Klasse geöffnet, Form2 dann aus Form1 heraus, Form3 aus Form2 heraus, ...?

    ---

    Eine mögliche Variante wäre, dass Du die Steuerung komplett über die "Klasse" erledigst.

    public class FormHelper { private Form1 form1; private Form2 form2;

    ...

    public void OeffneFormular1() { if( this.form1 == null ) { this.form1 = new Form1(); this.form1.FormHelper = this; } this.OeffneFormular( this.form1, this.form2 ); } public void OeffneFormular2() { if( this.form2 == null ) { this.form2 = new Form2(); this.form2.FormHelper = this; } this.OeffneFormular( this.form2, this.form1 ); } public void OeffneFormular( Form formToOpen, Form formToClose ) { this.SchliesseFormular( formToClose ); formToOpen.Show(); } public void SchliesseFormular1() { this.SchliesseFormular( this.form1 ); } public void SchliesseFormular2() { this.SchliesseFormular( this.form2 ); } public void SchliesseFormular( Form formToClose ) { if( formToClose != null ) { formToClose.Hide(); } } }

    In dem Fall bräuchten deine Fomularklassen noch eine Eigenschaft "FormHelper", der dann automatisch eine Instanz der o.g. Klasse zugewiesen wird. Damit kann man dann auch von den Formularen aus das Öffnen und Schließen anderer Formulare anstoßen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Mittwoch, 1. Januar 2014 10:40
    Moderator

Alle Antworten

  • Hallo Markus,

    vorab: benenn deine Variablen doch sinnvoll. Dann liest sich der Code (auch für dich) erheblich besser. So hab ich keine Ahnung, was bei dir nun Form1, Form2, die "Klasse", ... sein soll.

    Um dir sagen zu können, was Du wo wie machen kannst/musst, um dein Vorhaben zu realisieren, müsstest Du uns bitte sagen, wann und auf welchem Weg Du Form1, Form2, ... öffnen und schließen willst.

    Wird das zentral über deine "Klasse" geht, wann passiert das und kann es auch andere Formulare geben, die angezeigt/versteckt werden müssen?

    Oder ist das verschachtelt, also Form1 wird über deine Klasse geöffnet, Form2 dann aus Form1 heraus, Form3 aus Form2 heraus, ...?

    ---

    Eine mögliche Variante wäre, dass Du die Steuerung komplett über die "Klasse" erledigst.

    public class FormHelper { private Form1 form1; private Form2 form2;

    ...

    public void OeffneFormular1() { if( this.form1 == null ) { this.form1 = new Form1(); this.form1.FormHelper = this; } this.OeffneFormular( this.form1, this.form2 ); } public void OeffneFormular2() { if( this.form2 == null ) { this.form2 = new Form2(); this.form2.FormHelper = this; } this.OeffneFormular( this.form2, this.form1 ); } public void OeffneFormular( Form formToOpen, Form formToClose ) { this.SchliesseFormular( formToClose ); formToOpen.Show(); } public void SchliesseFormular1() { this.SchliesseFormular( this.form1 ); } public void SchliesseFormular2() { this.SchliesseFormular( this.form2 ); } public void SchliesseFormular( Form formToClose ) { if( formToClose != null ) { formToClose.Hide(); } } }

    In dem Fall bräuchten deine Fomularklassen noch eine Eigenschaft "FormHelper", der dann automatisch eine Instanz der o.g. Klasse zugewiesen wird. Damit kann man dann auch von den Formularen aus das Öffnen und Schließen anderer Formulare anstoßen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Mittwoch, 1. Januar 2014 10:40
    Moderator
  • Hallo Markus Ö.

    Ich nehme an, dass du beide Formen selbst geschrieben hast, und so auch eine Kleinigkeit ändern kannst.

    Du kannst du einfach eine statische Klasse erstellen, in welch sich beide Formen "Registrieren", damit Sie verfügbar sind. der Rest kann dann über die Events erledigt werden.

    Hier ein Beispiel, was ich meine (für WPF - musst aber nur die Namen anpassen):

       
        public static class WindowHelper
        {
            //Form1 soll nach dem öffnen von Form2 überdeckt werden. 
            private static Window _startWindow; //Form1
            private static Window _secondWindow; //Form2
    
            public static void RegisterStartWindow(Window w) 
            {
                WindowHelper._startWindow = w;
            }
    
            public static void RegisterSecondWindow(Window w)
            {
                WindowHelper._secondWindow = w;
                w.Loaded += w_Loaded; //Geöffnet
            }
    
            private static void w_Loaded(object sender, RoutedEventArgs e)
            {
                if (WindowHelper._startWindow != null)
                {
                    _startWindow.Close(); //Schließen
                }
            }
    
            //...
        }
    
        public sealed partial class Startwindow : Window
        {
            public Startwindow()
            {
                WindowHelper.RegisterStartWindow(this);
            }
        }
    
        //... Die andere Form

    Mit freundlichen Grüßen

    Thomas R.

    • Als Antwort markiert Bashesz Mittwoch, 1. Januar 2014 18:51
    Mittwoch, 1. Januar 2014 13:19
  • Hallo,

    Erstmal danke euch beiden für die Codeexemplare! Ich habe mal den Code von Stefan ausprobiert und muss sagen, dass es das ist, was ich wollte. Hat auch echt super funktioniert! Großes danke an euch beide!

    Mit freundlichen Grüßen Markus Ö.

    Mittwoch, 1. Januar 2014 18:51