2 Forms Zugriff auf Main Funktion



  • Hallo,

    In meiner Main Form (Form1.cs) rufe ich eine zweite Form auf. Diese Form macht eine bestimmte Arbeit und nachdem sie dies getan hat, sollte Sie "Fertig" in die Textbox der Main Form (Form1.cs) schreiben.

    Wenn ich die Textbox public mache, kann ich auch nicht auf Sie zugreifen, da ich einen Objektverweis benötige. Also etwas wie:

    Form1 f1 = new Form1();
    f1.textbox.Text = "Fertig";
    

    Das jedoch bringt mich ja auch nicht weiter, weil mit der obigen Methode eine neue Form1 instanziert wird, und wenn ich Änderungen auf dieser neuen Form1 durchführe, so sehe ich diese ja nicht auf dem Bildschirm, da dort die "normale" Form1 GUI mäßig angezeigt wird.

    Vielen Dank für die Infos!



  • Wenn du die 2. Form modal aufrufst (d.h. mit ShowDialog()) dann kannst du einfach dahinter die Textbox beschreiben. Am besten dafür dann eine Eigenschaft (Property) in der 2. Form dafür erstellen:

    if(form2.ShowDialog(this) == DialogResult.Ok)
    {
      textbox.Text = form2.MyTextProperty;
    }
    

    Wenn du jedoch die 2. Form nicht-modal aufrufst, d.h. mit Show() und von dort aus Zugriffe auf die 1. Form machen willst, dann solltest du dies nicht direkt, sondern über Ereignisse (Events) regeln, s. z.B.
    http://www.mycsharp.de/wbb2/thread.php?threadid=5960
    bzw.
    http://www.mycsharp.de/wbb2/thread.php?threadid=26116



  • Einfach bei der Instanzierung der zweiten Form einen Verweis der ersten Form mit übergeben. Also:

    Form2 f2 = new Form2(this)
    


  • Hier ein kleines Bsp. zum eigenen EventHandler falls Du es nicht Modal verwendest:

    Im MainForm also Form1 bei dir:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace EventTest
    {
        public partial class MainForm : Form
        {
            CalcForm calcForm = new CalcForm();
    
            public MainForm()
            {
                InitializeComponent();
    
                // Eigener Event Handler
                calcForm.CALCFINISH += new  calcForm.CalcFinish_EventHandler(calcForm_CalcFinish);
            }
    
            private void BtnCalc_Click(object sender, EventArgs e)
            {
                strStatusMsg.Text = "Start calculation";
                calcForm.SetCalcValues(11, 3);
                calcForm.Show();
    
            }
    
            // Event handler function
            void calcForm_CalcFinish(object sender, EventArgs e)
            {
                if (calcForm.GetCalcStatus())
                {
                    strStatusMsg.Text = "Calculation finish";
                }
                calcForm.Hide();
    
            }
        }
    }
    

    Und Im CalcForm also Form2 bei Dir:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace EventTest
    {
        public partial class CalcForm : Form
        {
            private int iValueX = 0;
            private int iValueY = 0;
            private int iErgeb = 0;
            private bool bCalcStatus = false;
    
            public delegate void CalcFinish_EventHandler(object sender, EventArgs e);
            public event CalcFinish_EventHandler CALCFINISH;
    
            public CalcForm()
            {
                InitializeComponent();
            }
    
            private void BtnCalculate_Click(object sender, EventArgs e)
            {
                iErgeb = iValueX + iValueY;
                bCalcStatus = true;
    
                // Eigenes Event auslösen
                CALCFINISH(this, EventArgs.Empty);
            }
    
            public void SetCalcValues(int x, int y)
            {
                iValueX = x;
                iValueY = y;
            }
    
            public bool GetCalcStatus()
            {
                return bCalcStatus;
            }
        }
    }
    

    mfg dd



  • Wow!

    Vielen Dank für die ganzen Hilfen!
    Werds mir sofrt ansehen!



  • Ein Nachtrag noch zum Auslösen von Events.
    Man sollte immer prüfen, ob auch ein Event abonniert wurde, sonst ist die Event-Variable null und es gibt eine entsprechende Exception.
    Also immer so aufrufen:

    public event CalcFinish_EventHandler CalcFinish; // <- Events immer in CamelCase
    
    protected void OnCalcFinish(EventArgs e)
    {
      if(CalcFinish != null)
        CalcFinish(this, e);
    }
    

    Achtung:
    um diese Abfrage auch noch für Multithread-Programme korrekt auszuführen, sollte man immer so vorgehen:

    protected void OnCalcFinish(EventArgs e)
    {
      var ev = CalcFinish; 
      if(ev != null)
        ev(this, e);
    }
    

    Sonst könnte zwischen dem Überprüfen (auf null) und des Ausführens das Event mittels '-=' schon wieder gelöscht worden sein (und dann knallt es: bumm -).


Anmelden zum Antworten