none
Methode aus einer anderen Form aufrufen RRS feed

  • Frage

  • Hallo. ich habe 4 Forms in einem Projekt, welche sich der Benutzerfeundlichkeit zuliebe nicht vermeiden ließen.

    Ich habe nun eine einzige Public Methode in meiner Mainform erstellt, welche wie folgt aussieht:

     public void forwarding(int tester)
            {
                switch (tester)
                {
                    case 1: label1.Text = Convert.ToString(popup.volt); popup.Close(); ledcreated(); break;
                    case 2: label1.Text = blablala(); break;
                }
            }


    Das problem ist, das diese methode einfach nicht tut was sie soll... Ich rufe sie so auf:

    public partial class newLedPopUp : Form
        {
            public decimal volt = 0;
            public int millimeter{get; set;}
            public bool plussminus {get; set;}
            public decimal ampere {get;set;}
    
         
            public newLedPopUp()
            {
    
                InitializeComponent();
            }
    
            private void executePopupButtons(object sender, EventArgs e)
            {
               ...
               
                
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                volt = Convert.ToDecimal(voltinput.Text);
               ...
                if (plusminusbutton.Checked == true)
                {
                    ...
                }
                else
                {
                    ...
                }
                
                Form1 back = new Form1();
                back.forwarding(1);
    
            }

    Dem debugger nach sieht eigentlich alles Korrekt aus, jedoch bleibt a) die Form popup offen, b) zeigt sich mit in label1 (was übrigens nur zur Testzwecken dient) keinerlei Wert. Wo liegt der fehler?

    Vielen Dank im Vorraus.

    Montag, 15. Oktober 2012 07:53

Antworten

  • Hallo,

    wenn Du eine Ausnahme bekommst, so hast Du keinen Owner gesetzt, was man sinnvollerweise beim Öffnen täte, z. B.:

    var popupForm = new newLedPopUp();
    popupForm.Show(this);	
    

    Übergeben könntest Du es indem Du einen passenden Konstruktor einfügst:

    var popupForm = new newLedPopUp(this);
    
    // und bei newLedPopUp
        public partial class newLedPopUp : Form
        {   
            Form1 mainForm;
            public newLedPopUp(Form1 mainForm)
            {
                InitializeComponent();
                this.mainForm = mainForm;
            }
            
            private void button1_Click(object sender, EventArgs e)
            {
                // ...
                this.mainForm.forwarding(1);
            }
        }

    was insgesamt etwas mehr Arbeit macht, wie man sehen sollte.

    Gruß Elmar


    • Als Antwort markiert Nils.O Montag, 15. Oktober 2012 10:54
    Montag, 15. Oktober 2012 10:21
    Beantworter

Alle Antworten

  • Hallo Nils,

    mit einer Instanzmethode änderst Du die Eigenschaften der Instanz.

    Da Du mit back eine neue Instanz  von Form1 erstellst, so veränderst Du die Werte dort; und nicht in dem Startformular. Da die Instanz nicht sichtbar ist, bekommst Du nichts davon zu sehen.

    Um die Methode im Hauptformular aufzurufen, musst Du Dir einen Verweis auf das Hauptformular. Entweder indem Du es an Dein newLedPopup beim Erstellen übergibst.

    Oder in dem Du es als Besitzer beim Show übergibst, dann enthält die Owner-Eigenschaft den Verweis; wobei Du dann noch einen Cast durchführen musst, um Deine Methoden nutzen zu können:

    ((Form1)this.Owner).forwarding(1);
    Gruß Elmar
    Montag, 15. Oktober 2012 08:21
    Beantworter
  • Hallo :) Vielen Dank es geht so :) Zwar hab ich immoent noch ne Nullreferenceexeption, aber der Hund liegt woanders begraben.
    Rein interesse halber: du hast geschrieben ich könnte auch dem newLedPopUp beim erstellen einen verweis aufs Hauptformular geben. Wie würde dass dann aussehen?

    • Bearbeitet Nils.O Montag, 15. Oktober 2012 08:37
    Montag, 15. Oktober 2012 08:28
  • Hallo,

    wenn Du eine Ausnahme bekommst, so hast Du keinen Owner gesetzt, was man sinnvollerweise beim Öffnen täte, z. B.:

    var popupForm = new newLedPopUp();
    popupForm.Show(this);	
    

    Übergeben könntest Du es indem Du einen passenden Konstruktor einfügst:

    var popupForm = new newLedPopUp(this);
    
    // und bei newLedPopUp
        public partial class newLedPopUp : Form
        {   
            Form1 mainForm;
            public newLedPopUp(Form1 mainForm)
            {
                InitializeComponent();
                this.mainForm = mainForm;
            }
            
            private void button1_Click(object sender, EventArgs e)
            {
                // ...
                this.mainForm.forwarding(1);
            }
        }

    was insgesamt etwas mehr Arbeit macht, wie man sehen sollte.

    Gruß Elmar


    • Als Antwort markiert Nils.O Montag, 15. Oktober 2012 10:54
    Montag, 15. Oktober 2012 10:21
    Beantworter
  • Vielen Dank. Jetzt ergibt auch mal "this" sinn. Habe es bisher ehr als ein unnötiges Kommando angesehn.
    Montag, 15. Oktober 2012 10:54