Control von anderer Form ansprechen?

  • C#
  • .NET (FX) 1.0–2.0

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Control von anderer Form ansprechen?

    Also,

    Die Frage ist vllt etwas doof, aber da meine apps zu 90% console Applications sind hab ich ein paar schwierigkeiten mit WinForms :D
    Ich hab bei Form1 ne public void Log() welche text in ner richtextbox hinzufügt.
    Spreche ich diese von Form1 an, funzt das prima.
    Spreche ich die methode von Form2 an, passiert gar nichts.
    Ich bekomme auch keinen Fehler. Der Text der hinzugefügt werden soll wird nicht hinzugefügt :/
    Kann man das irgendwie elegant mit delegates lösen oder so?
    Properties sind keine Lösung, das der Text der übergeben wird später farbig sein soll :D

    Form1.cs:

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Windows.Forms;
    9. namespace Test
    10. {
    11. public partial class Form1 : Form
    12. {
    13. public Form1()
    14. {
    15. InitializeComponent();
    16. }
    17. private void button2_Click(object sender, EventArgs e)
    18. {
    19. Form2 Frm2 = new Form2();
    20. Frm2.ShowDialog();
    21. }
    22. public void Log(string testmessage)
    23. {
    24. richTextBox1.AppendText(testmessage + Environment.NewLine);
    25. }
    26. private void button1_Click(object sender, EventArgs e)
    27. {
    28. Log("This is a test.");
    29. }
    30. }
    31. }


    Form2.cs :

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Windows.Forms;
    9. namespace Test
    10. {
    11. public partial class Form2 : Form
    12. {
    13. public Form2()
    14. {
    15. InitializeComponent();
    16. }
    17. private void button1_Click(object sender, EventArgs e)
    18. {
    19. Form1 Frm1 = new Form1();
    20. Frm1.Log(textBox1.Text);
    21. }
    22. }
    23. }


    Hat jemand ne idee?

    So sieht das ganze zur Laufzeit aus:

    C# Developer
    Learning C++

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rikudo“ ()

    Rikudo schrieb:

    C#-Quellcode

    1. Form2 Frm2 = new Form2();
    Machst Du z.B. mit Parameter:

    C#-Quellcode

    1. Form2 Frm2 = new Form2(this);
    und in Form2 dann so:

    C#-Quellcode

    1. public partial class Form2 : Form
    2. {
    3. Form1 Frm1;
    4. public Form2(Form1 parent)
    5. {
    6. InitializeComponent();
    7. Frm1 = parent;
    8. }
    9. private void button1_Click(object sender, EventArgs e)
    10. {
    11. Frm1.Log(textBox1.Text);
    12. }
    13. }
    Besser ist, Du machst das mit Events.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    und versuch zu verstehen, was das Schlüsselwort new bewirkt.
    Nämlich es erstellt ein neues (new halt) Objekt.

    das Frm1 in Frm2 ist also nicht das Form1-Start-Form, sondern ein neues.
    Und dieses neue Form1 wurde nie mit .Show() angezeigt, deshalb bringt das nix, wenn ihm iwas zu loggen aufgetragen wird.

    Wie rod sagt: Form2 kann ein Event senden, und Form1 kann das empfangen. Das Form1, was dann empfängt ist dann dasjenige, was Frm2 selbst erstellt hat, und ist also das, welches auch angezeigt wird.

    Edit: Falls du es nicht hinkriegst, machst du entweder was falsch, oder wir irren uns. Da kannst du eine Testanwendung basteln, und dann kann man mal richtig angugge.

    Rikudo schrieb:

    wird der Text trotzdem nicht hinzugefügt
    Mit welchem Code?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @ErfinderDesRades : Danke für die Antwort. Ich habe mal mein TestProjekt hochgeladen : puu.sh/g3B8r/05d8ae592e.rar
    Den code habe ich wie RodFromgermany es empfohlen hat so angepasst das der ctor eine Form akzeptiert.

    @RodFromGermany : Mit dem Code den ich oben gepostet habe und so editiert hab wie du es empfohlen hast :D
    C# Developer
    Learning C++

    Rikudo schrieb:

    Mit dem Code den ich oben gepostet habe und so editiert hab wie du es empfohlen hast
    funktioniert das.
    Kann es sein, dass in der Form2 bei Dir die TextBox1 leer ist?
    Schreib denn Text hart in Form2 rein:

    C#-Quellcode

    1. Frm1.Log("nnn");

    Bilder
    • Form2.png

      8,92 kB, 439×324, 137 mal angesehen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich hab den Fehler doch schon serviert - nochmal?

    ErfinderDesRades schrieb:

    Edit: Na, da steht ja derselbe M...:

    C#-Quellcode

    1. Form1 Frm1 = new Form1();
    Nochmal Post#4 studieren, und über das Schlüsselwort new nachdenken!


    Oder hier nochmal das ganze Form2:

    C#-Quellcode

    1. public partial class Form2 : Form {
    2. Form1 Frm1;
    3. public Form2(Form1 parent) {
    4. InitializeComponent();
    5. Frm1 = parent;
    6. }
    7. private void button1_Click(object sender, EventArgs e) {
    8. Form1 Frm1 = new Form1();
    9. Frm1.Log(textBox1.Text);
    10. }
    11. }
    Wie gesagt: Das Prob ist das Schlüsselwort new, das muss man verstehen, dass das ein neues Objekt erzeugt, deswegen heißt das Schlüsselwort ja auch so.