C# änder button text von anderer form?

2 Antworten

Du brauchst in jedem Fall einen Objektverweis auf die andere Form. Den bekommst du notfalls über Application.OpenForms (wenn du die Forms sich nicht selber in eine Liste eintragen lässt).

Dann musst du dich entscheiden, ob du "pollst" (abfragst) oder "pushst" (schiebst), also ob die Initiative von form1 oder von form2 ausgehen soll.

Nehmen wir mal an, auf form1 befindet sich label1 und auf form2 textBox2, und der Inhalt von form2.textBox2 soll in form1.label1 übertragen werden.

Für beide ist folgender Code in Form1 empfehlenswert:

    private void Form1_Load(object sender, EventArgs e) {
      (new Form2()).Show();
    }
  }
Polling:

hier braucht man etwas, das das Übernehmen auslöst, etwa einen Timer oder einen Button zum Klicken. Ich nehme mal einen Button "button1".

Code in Form1:

    private void button1_Click(object sender, EventArgs e) {
      Form2 foundForm2 = SearchForm2();
      label1.Text = foundForm2.GetText1();
    }


    private Form2 SearchForm2() {
      foreach (var frmObj in Application.OpenForms) {
        if (frmObj is Form2) {
          return (Form2)frmObj;
        }
      }
      return new Form2();
    }

und in Form2:

    public String GetText1() { return textBox1.Text; }
Pushing:

Hier brauchst du einen EventHandler für das Ereignis "Inhalt von form2.textBox1 geändert".

Code in Form1:

    public void SetText2(String text) { label2.Text = text; }

und in Form2:

    private Form1 SearchForm1() {
      foreach (var frmObj in Application.OpenForms) {
        if (frmObj is Form1) {
          return (Form1)frmObj;
        }
      }
      return new Form1();
    }


    private void textBox2_TextChanged(object sender, EventArgs e) {
      Form1 foundForm1 = SearchForm1();
      foundForm1.SetText2(textBox2.Text);
    }

Hier sind überall natürlich noch erhebliche Verbesserungen am Code möglich, aber es funktioniert schon mal.

Woher ich das weiß:Berufserfahrung

Du machst in Form1 eine Methode mit der du die Text eigenschaft des Buttons veränderst.

Diese Methode rufst du dann in Form2 auf.

Du musst dabei aber aufpassen, weil die beiden Forms für gewöhnlich aus 2 Threads sind. Daher musst du die Änderung des Texts so oder ähnlich machen

void ChangeText(string text)
{
   if(textBox.InvokeRequired)
   {
      textBox.Invoke((MethodInvoker)delegate { textBox.Text = text; });
   }
   else
   {
      textBox.Text = text;
   }
}