Zugriff von Form 2 auf Funktion von Form 1

real-insanity

Erfahrenes Mitglied
Hallo zusammen, ich mal wieder.
Ich weiß es gibt einiges an Lektüren dazu mit Delegates etc. aber irgendwie bin ich da nicht ganz durchgestiegen. Eventuell kann mir jemand das Procedere etwas genauer erklären wie ich vorgehen muss.
Nun aber zu meinem Problem.
Ich habe Form 1 (FrmMain) mit einer ComboBox im ToolStrip (cboShows), aus dieser öffne ich einen Showplaner (frmShowplaner) um meine Shows zu verwalten. Schließe ich nun diese Form möchte ich, dass sich das cboShows aktualisiert.

In der frmMain benutze ich dafür folgende Funktion (ich weiß, ist nicht ganz sauber):
Code:
  public void GetAllShowsAndBind()
        {
            DataSet Shows = DataBaseHelper.LoadData("SELECT Shows.ID, Shows.Name  FROM Shows WHERE Shows.DateTimeFrom >= datetime() ORDER BY Shows.DateTimeFrom");
            cboShows.ComboBox.BindingContext = this.BindingContext;
            if (Shows.Tables.Count > 0)
            {
                cboShows.ComboBox.DataSource = Shows.Tables[0];
                cboShows.ComboBox.DisplayMember = "Name";
                cboShows.ComboBox.ValueMember = "ID";
            }
        }
Diese möchte ich nun aus der frmShowplaner aufrufen, damit sich die Shows aktualisieren.
Ich bin überhaupt nicht abgeneigt, diese Funktion in eine Klasse o.Ä. auszulagern um diese dann separat, mit meinen sowieso schon vorhandenen DLLs, zu deployen.

Ich würde mich sehr über Antworten, Vor- und Ratschläge hierrüber freuen!

Lieben Gruß
 
Hallo,

Du kannst dir einfach die Instanz des FrmMain an die frmShowPlane übergeben, dann kannst du die Funktion ganz normal aufrufen. Delegate brauchst du dafür nicht.

Der sauberere Weg wäre es aber, wenn du dir in der FrmMain einen EventHandler auf das Closing-Event des frmShowplaner holst, und aus diesem EventHanlder GetAllShowsAndBind aufrufst.
 
Wie würde ich denn so ein Event registrieren? Ich hab bisher nicht wirklch viel mit eigenen Events und im Speziellen mit solchen Fällen gearbeitet.
 
Hallo,

FormClosing ist kein eigenes Event, sondern wird dir von Form schon zur Verfügung gestellt. (siehe hier)
Wie du einen EventHandler dranhängst scheinst du ja zu wissen, da du sicher auch EventHandler brauchst um die 2. Form zu starten.
 
Nur damit ich das richtig verstehe, ich soll in Form1 das Close() des Form2 registrieren und dann den Rest abfackeln?
Sprich ich mach dann sowas in Form1 unter dem frmShowplaner.Show():
Code:
Form2.FormClosed += new System.Windows.Forms.FormClosedEventHandler(Form1.Funktion)
 
Zuletzt bearbeitet:
Hallo,

Nicht Close(), sondern das FormClosing. Close() ist eine Methode, FormClosing ist ein Event. Du kannst es genauso registrieren wie du einen Button-Click-EventHandler baust. Der Rest stimmt.
 
Also entweder bin ich zu Blöd oder ich versteh das nicht so ganz. Ich habe nun folgendes gemacht:

Form1:
Code:
public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 bla = new Form2();
            bla.FormClosing += new System.Windows.Forms.FormClosedEventHandler(this.testc());
bla.Show();
        }


        /*public delegate void testc();*/
        public void testc()
        {
            MessageBox.Show("KLAPPT");
        }

Bei der Zuweisung der Funktion sagt der Compiler mir immer wieder "Methodname expected"
 
Zuletzt bearbeitet:
So klappts, danke!

Code:
  private void button1_Click(object sender, EventArgs e)
        {
            Form2 bla = new Form2();

            bla.FormClosed += new FormClosedEventHandler(testc); 
            bla.ShowDialog();
        }

        private void testc(object sender, EventArgs e)
        {
            MessageBox.Show("klappt");
        }
 

Neue Beiträge

Zurück