none
Frage: Form´s öffnen schließen Parameter übergabe RRS feed

  • Frage

  • Hi ich habe 3 Forms.

    Login.cs
    Main.cs
    Konfiguration.cs

    Main.cs wird anfangs gestartet.

    Ein Value aus einer Dropdown liste soll in die Login.cs übergeben werden.

    Wie muss der Code von meinem Button in der Main.cs  ausehen?
    Bzw wie öffne ich die Login.cs oder Konfiguration.cs ohne den new Form befehl?
    Da ich nur 1 Instanz haben möchte.

    mfg Travian
    Montag, 16. November 2009 08:24

Antworten

  • Wenn Du die Instanz von Form2 wiederverwenden möchtest, musst Du die Referenz auf die Instanz in einer Klassenvariablen speichern:

    public partial class Form1 : Form
        {
    
            Form2 myform2 = null;
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                if (myform2 == null || myform2.IsDisposed)
                {
                    myform2 = new Form2();
                }
    
    
                myform2.Show();
    
            }
      }

    Form2 wird dann automatisch geschlossen, wenn Form1 entweder als Owner für Form2 festgelegt ist oder Form1 als MainForm des ApplicationContext festgelegt ist.

    Die Anweisung "Application.Run(new Form1())" in der Main Methode, legt eine neue Instanz von Form1 als MainForm fest und beendet die Anwendung, sobald dieses MainForm geschlossen wird. Wenn Du Application.Run() ohne Parameter aufrufst, liegt es bei Dir die Anwendung zu beenden.

            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
    
                (new Form1()).Show();
    
                Application.Run();
            }

    Das solltest Du dann aber spätestens dann machen, wenn auch Form2 geschlossen wird. Am besten, wenn Du hier mit einer eigenen Instanz des ApplicationContext arbeitest,wenn Du spezielle Anforderungen hast. Hier kannst Du dann das jeweils aktuelle MainForm festlegen.

    Thorsten Dörfler
    Microsoft MVP Visual Basic
    Dienstag, 17. November 2009 08:34

Alle Antworten

  • Hallo Travian,

    in dem aktuellen Thread kannst du nur ein Mal Application.Run() aufrufen. Weitere Forms müssen mit Show() bzw. ShowDialog() aufgerufen werden und im Sinne der OOP auch mit new instanziiert werden. Meines Wissens ist es nicht möglich, die ursprüngliche Form auszutauschen - und selbst dann könntest du auf new nicht verzichten.

    Du kannst allerdings im Konstruktur des Formulars zunächst eine abgespeckte Form per Programmcode erstellen, die lediglich eine Auswahl anbietet. Anschließend löschst du die Elemente auf dem Formular und erstellt dies mit den Inhalten von Login bzw. Konfiguration - je nach Auswahl - neu. Die dafür notwendigen Anweisungen für die Erstellung der Benutzeroberfläche findest du in der Methode InitializeComponent() der beiden anderen Klassen. Die Logik der Forms musst du dann natürlich beide in deine Klasse aufnehmen.

    Viele Grüße
    Jan

    Montag, 16. November 2009 17:21
  • Hallo Travian,

    ich bin mir nicht ganz sicher worauf Du hinaus willst.
    Wenn Du ein Login Formular anzeigen willst und erst nach erfolgreicher Bestätigung das Hauptformular
    starten, schau Dir an:
    http://social.msdn.microsoft.com/forums/en-US/Vsexpressvcs/thread/aabaad37-b0c2-4ba7-9dd8-3260a102321d

    Gruß Elmar
    Montag, 16. November 2009 18:10
  • Hallo Jan, Travian,

    man kann durchaus das Formular austauschen, das findet sich in ApplicationContext.MainForm
    Wenn es um die Anmeldung geht, ist die Lösung in der anderen Anwort jedoch einfacher.

    Gruß Elmar
    Montag, 16. November 2009 18:12
  • Hallo Elmar,

    vielen Dank für den Hinweis, das kannte ich noch nicht. Ich habe allerdings auch noch nie einen Grund für eine Anforderung gehabt, warum ich für ein weiteres Form keine neue Instanz erstellen sollte...
    Ein Loginformular - wie in dem Link zu dem anderen Thread - finde ich auch am bequemsten. Aber aus irgendeinem Grund möchte Travian ja keine weitere Instanz von Forms erstellen...

    Viele Grüße
    Jan
    Montag, 16. November 2009 20:58
  • Hallo mein Problem ist eigentlich folgendes:

    Ich habe meine Form aufgerufen durch den Run. Befehl auf dieser ist 1 Button sobald ich diesen 2-3 drücke öffnet sich auch die 2 te Form 2-3 mal.

    Das will ich nicht jede Form darf nur geöffnet und geschlossen werden. Meinetwegen auch durch blockieren des Aufrufbuttons.


    Nun habe ich allerdings ein weiters Problem:

    Form1 soll mit sich selbts schließen und ein andres Form öffnen. Bisher habe ich immer nur 2 geöffnet aber nie das Form 1 beenden können.

    Vlt ein Hinweiß Wenn ich bei Form 1 auf das X klicke schließen sich beide Forms.
    Wenn ich nun allerdings bei Form 2 auf das X klicke schließt sich NUR Form2. Nicht Form1.

    Hoffe es ist nun verständlicher was mein Problem ist.

    Dienstag, 17. November 2009 00:25
  • Wenn Du die Instanz von Form2 wiederverwenden möchtest, musst Du die Referenz auf die Instanz in einer Klassenvariablen speichern:

    public partial class Form1 : Form
        {
    
            Form2 myform2 = null;
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                if (myform2 == null || myform2.IsDisposed)
                {
                    myform2 = new Form2();
                }
    
    
                myform2.Show();
    
            }
      }

    Form2 wird dann automatisch geschlossen, wenn Form1 entweder als Owner für Form2 festgelegt ist oder Form1 als MainForm des ApplicationContext festgelegt ist.

    Die Anweisung "Application.Run(new Form1())" in der Main Methode, legt eine neue Instanz von Form1 als MainForm fest und beendet die Anwendung, sobald dieses MainForm geschlossen wird. Wenn Du Application.Run() ohne Parameter aufrufst, liegt es bei Dir die Anwendung zu beenden.

            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
    
                (new Form1()).Show();
    
                Application.Run();
            }

    Das solltest Du dann aber spätestens dann machen, wenn auch Form2 geschlossen wird. Am besten, wenn Du hier mit einer eigenen Instanz des ApplicationContext arbeitest,wenn Du spezielle Anforderungen hast. Hier kannst Du dann das jeweils aktuelle MainForm festlegen.

    Thorsten Dörfler
    Microsoft MVP Visual Basic
    Dienstag, 17. November 2009 08:34
  • Hallo,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert

    Dienstag, 8. Dezember 2009 08:43