c# Wert aus Form1 in Form2 spiegeln/aktualisieren(fortwährend)

  • C#

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Kilu.

    c# Wert aus Form1 in Form2 spiegeln/aktualisieren(fortwährend)

    Guten Morgen,

    ich habe eine Frage bzgl. der Übergabe von Werten. Ich benötige zu meiner Form1 eine weitere Form2 zur reinen Anzeige. Aus diesem Grund möchte ich in Form2, sowie geöffnet über Button, Werte aus Form1 übergeben/anzeigen/spiegeln. Als Beispiel habe ich einen Sensorwert, den ich gerne in groß auf der Form2 anzeigen möchte (Sollte es hier andere Möglichkeiten geben, nur her damit). Der Sensorwert ändert sich dauerhaft.
    Folgendes Tutorial war bislang soweit hilfreich, als dass ich den Wert beim Öffnen von Form2 angezeigt bekomme. Der Wert wird allerdings nur bei der Initialisierung von Form2 geschrieben, und dann nicht mehr. Der Plan ist, dass Form2 dauerhaft den Wert aus Form1 spiegelt, damit ich ein extra Fenster (Form2) habe, in dem nur dieser Wert dargestellt wird.

    Da ich mir nicht sicher bin, ob das Posten von fremden Eigentum hier erlaubt ist, habe ich den Link mit dem Tutorial angegeben. Hier wird die Übergabe behandelt, aber wie oben schon beschrieben nur beim Öffnen der Form2 und danach nicht mehr.



    Ich würde mich sehr freuen, wenn mir jemand auf die Sprünge helfen kann...

    Vielen Dank

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @Kilu Willkommen im Forum. :thumbup:
    Was verstehst Du unter "spiegeln"?
    Ich gehe mal davon aus, dass Du den YT-Code abgepinselt hast.
    Wenn Du damit Probleme hast, geh mal davon aus, dass wir diesen Code nicht abpinseln werden.
    Bereinige das Projekt, zippe es (ohne obj, bin, vs-Ordner) und hänge die Zip an Deinen nächsten Post:
    Erweiterte Antwort => Dateianhänge => Hochladen.
    Dann beschreibst Du das Problem und wir werden sehen, wie wir Dir helfen können.
    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!
    Vielen Dank für die Antwort. Im Anhang ein Beispielprogramm. Mit spiegeln meine ich ein Synonym für eben den Variablenwert der aus Form1 in Form2 dargestellt werden soll. Spiegeln deshalb, weil sich das Spiegelbild, außer man steht unter Einfluss gewisser Substanzen, sich direkt der Bewegung anpasst, wenn man eben vorm Spiegel rumhampelt.

    Mit dem Testprogramm kann ein Timer gestartet werden. Die Sekundenvarible wird an Form 2 übergeben. Allerdings nur wenn man den Button Form2Anzeigen drückt. Damit übernimmt dann Form2 den momentanen Sekundenwert und gibt ihn in der Textbox aus. Der Wert ändert sich jedoch nicht......da die Sekunden aber in Form1 weiter zählen, soll die Variable in Form2 sich auch fortlaufend ändern.

    Form1

    C#-Quellcode

    1. public partial class Form1 : Form
    2. {
    3. //Variable für Form2
    4. public string ZeitUebergeben { get; private set; }
    5. public int Test { get; private set; }
    6. System.Timers.Timer t;
    7. int h, m, s;
    8. public Form1()
    9. {
    10. InitializeComponent();
    11. }
    12. private void start_Click(object sender, EventArgs e)
    13. {
    14. t.Start();
    15. }
    16. private void stopp_Click(object sender, EventArgs e)
    17. {
    18. t.Stop();
    19. }
    20. private void Form1_Load(object sender, EventArgs e)
    21. {
    22. t = new System.Timers.Timer();
    23. t.Interval = 1000;
    24. t.Elapsed += OnTimeEvent;
    25. }
    26. private void Form2Anzeigen_Click(object sender, EventArgs e)
    27. {
    28. ZeitUebergeben = Convert.ToString(s);
    29. Form f2 = new Form2 (ZeitUebergeben);
    30. f2.Show();
    31. }
    32. private void OnTimeEvent(object sender, ElapsedEventArgs e)
    33. {
    34. Invoke(new Action(() =>
    35. {
    36. s += 1;
    37. if (s == 60)
    38. {
    39. s = 0;
    40. m += 1;
    41. }
    42. if (m == 60)
    43. {
    44. m = 0;
    45. h += 1;
    46. }
    47. textResult.Text = String.Format("{0}:{1}:{2}", h.ToString().PadLeft(2, '0'), m.ToString().PadLeft(2, '0'), s.ToString().PadLeft(2, '0'));
    48. }));
    49. }
    50. private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    51. {
    52. t.Stop();
    53. Application.DoEvents();
    54. }
    55. }



    Form 2

    C#-Quellcode

    1. public partial class Form2 : Form
    2. {
    3. private string f2_zeit;
    4. public Form2(string ZeitUebergeben)
    5. {
    6. InitializeComponent();
    7. f2_zeit = ZeitUebergeben;
    8. }
    9. private void Form2_Load(object sender, EventArgs e)
    10. {
    11. textBox1.Text = f2_zeit;
    12. }
    13. }


    *EXE-Anhang entfernt*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @Kilu Du brauchst in der Form1 eine Variable für die Form2.
    Erstelle sie in der Button_Click und übergib den Wert als Property an Form2.
    Feddich.
    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Timers;
    3. using System.Windows.Forms;
    4. namespace Variablenübergabe_Test
    5. {
    6. public partial class Form1 : Form
    7. {
    8. System.Timers.Timer t;
    9. int h, m, s;
    10. Form2 f2;
    11. public Form1()
    12. {
    13. InitializeComponent();
    14. }
    15. private void start_Click(object sender, EventArgs e)
    16. {
    17. t.Start();
    18. }
    19. private void stopp_Click(object sender, EventArgs e)
    20. {
    21. t.Stop();
    22. }
    23. private void Form1_Load(object sender, EventArgs e)
    24. {
    25. t = new System.Timers.Timer();
    26. t.Interval = 1000;
    27. t.Elapsed += OnTimeEvent;
    28. }
    29. private void Form2Anzeigen_Click(object sender, EventArgs e)
    30. {
    31. if (f2 == null || f2.IsDisposed)
    32. {
    33. f2 = new Form2();
    34. }
    35. f2.Show();
    36. }
    37. private void OnTimeEvent(object sender, ElapsedEventArgs e)
    38. {
    39. Invoke(new Action(() =>
    40. {
    41. s += 1;
    42. if (s == 60)
    43. {
    44. s = 0;
    45. m += 1;
    46. }
    47. if (m == 60)
    48. {
    49. m = 0;
    50. h += 1;
    51. }
    52. textResult.Text = String.Format("{0}:{1}:{2}", h.ToString().PadLeft(2, '0'), m.ToString().PadLeft(2, '0'), s.ToString().PadLeft(2, '0'));
    53. if (f2 != null)
    54. {
    55. f2.f2_zeit = textResult.Text;
    56. }
    57. }));
    58. }
    59. private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    60. {
    61. t.Stop();
    62. }
    63. }
    64. }

    C#-Quellcode

    1. using System.Windows.Forms;
    2. namespace Variablenübergabe_Test
    3. {
    4. public partial class Form2 : Form
    5. {
    6. public string f2_zeit { set { textBox1.Text = value; } }
    7. public Form2()
    8. {
    9. InitializeComponent();
    10. }
    11. }
    12. }
    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!
    @Kilu
    Ganz wunderbar, was RodFromGermany dazu schreibt. Entscheidend ist das:
    Durch public string f2_zeit { set { textBox1.Text = value; } } in Form2 wird die Variable aus Form1 sichtbar.
    Form1 kann dann mit f2.f2_zeit = textResult.Text; auf die Variable in Form2 zugreifen und sie verändern.

    Mit dem Übergeben von Variablenwerten, wie das in dem dem Video gezeigt wird, hat das nichts zu tun.
    Man macht die Variablen public und greift über die setter Methode darauf zu.
    Das habe ich dazu mal auf die Schnelle gefunden Getter und Setter.

    Kilu schrieb:

    Sollte es hier andere Möglichkeiten geben, nur her damit
    Ich seh immer zu, derlei Dinge mit formübergreifendem Databinding hinzukriegen.
    Das erfordert aber einiges an Infrastruktur.
    Ist diese aber einmal geschaffen, so ist das Problem vom Tisch - sei es nun für ein Sensor-Wertchen oder auch für umfassende komplexe Datenmodelle.
    guggemol Daten laden, speichern, verarbeiten - einfachste Variante

    formübergreifendes Databinding ist nicht auf typDatasets beschränkt, man kanns auch auf selbstgebastelte Datenklassen anwenden.
    (Ich persönlich spare mir aber das Selber-Basteln.)