Wie kann ich in C# Variablen erstellen?

  • C#

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

    Wie kann ich in C# Variablen erstellen?

    Ich habe im Visual Studio 2022 als ein neues Projekt die Vorlage :

    Windows Forms-App (Net.Framework ) C# verwendet.

    Im Formularentwurf befinden sich nur eine Textbox und ein Label. Ich würde gerne verstehen, wie ich in der Programmiersprache C# über verschiedene Textboxen verschiedene Zahlen einlesen kann , um mit diesen Zahlen etwas zu errechnen und dann die Rechenergebnisse auf einem oder mehreren Labels auszugeben. In Bezug auf die Frage, wie ich die durch eine Textbox eingelesenen Zahlen jeweils in einer Variablen speichern kann bin ich unter dem Link:
    social.msdn.microsoft.com/Foru…ren-?forum=visualcsharpde

    auf die folgende Antwort gestoßen : Gar nicht. Du kannst jedoch eine public static class machen, die ein public static field enthält.

    C#-Quellcode

    1. public static GlobaleVariablen {
    2. public static int Variable1;
    3. }


    Diesen Code habe ich versucht in mein Programm einzufügen. Das hat aber erst ohne Fehlermeldung funktioniert als ich den Code wie folgt verändert habe :

    C#-Quellcode

    1. public static class GlobaleVariablen
    2. {
    3. public static int Variable1;
    4. }



    Innerhalb der Funktion :

    C#-Quellcode

    1. privatevoidtextBox1_TextChanged (objectsender, EventArgs e)


    kann ich aber trotzdem nicht der Variablen1 den Text von Textbox.1 zuweisen. Die Variable1 wird im Programm rot markiert und es wird mir angezeigt, dass diese im aktuellen Kontext nicht vorhanden ist.
    Wie muss ich den folgenden Code verändern, um den den Text von Textbox.1 in einer Variablen abzuspeichern welche ich dann über das Label1 wieder eventuell verändert ausgeben kann ?

    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.Threading.Tasks;
    9. using System.Windows.Forms;
    10. namespace Variablentest_App
    11. {
    12. public partial class Form1 : Form
    13. {
    14. public Form1()
    15. {
    16. InitializeComponent();
    17. }
    18. public static class GlobaleVariablen {
    19. public static int Variable1;
    20. }
    21. private void textBox1_TextChanged(object sender, EventArgs e)
    22. {
    23. Variable1 = textBox1.Text;
    24. }
    25. }
    26. }


    Thema verschoben; Das Thema wird automatisch dort erstellt, wo man sich befindet, wenn man auf [* Neues Thema] klickt. ~VaporiZed

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

    Hier statisch zu arbeiten ergibt keine Sinn. Kannst du mir den Unterschied zwischen statisch und nicht statisch nennen? Der Zugriff auf Variable1 würde so gehen GlobaleVariablen.Variable1 = ...

    Aber statisch muss das nicht sein.

    C#-Quellcode

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


    Wenn du dann den Wert als Zahl haben willst, kommt TryParse ins Spiel, schaue hier im Forum. Evtl. besser ein NumericUpDown nehmen, dann hast du direkt Zahlen.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Da passt einiges nicht. Eine Klasse die "global" funktionieren soll gehört nicht in die Form-Klasse, sondern als seperate Klasse, ab besten sogar in einem eigenen Namespace in einer eigenen Datei.
    der Einfachkeit halber mal so wie du dir das wohl gedacht hast:

    C#-Quellcode

    1. namespace Variablentest_App
    2. {
    3. public partial class Form1 : Form
    4. {
    5. public Form1()
    6. {
    7. InitializeComponent();
    8. }
    9. public void Test2(List<string> files)
    10. {
    11. Int32.TryParse(textBox1.Text, out int tbInt);
    12. GlobaleVariablen.Variable1 = tbInt;
    13. }
    14. }
    15. public static class GlobaleVariablen
    16. {
    17. public static int Variable1;
    18. }
    19. }


    Beachte: Die Textbox kann auch "Leberwurst mit Marmelade" enthalten,was wohl kaum ein Int32 ist.. Du musst also den Text parsen. Noch besser du verhinderst, dass falsche Werte erfasst werden können mit einem NumericUpDown-Steuerelement.
    Nachtrag: während des Edits und Test war @DTF schneller. Kommt aber auf's selbe raus.
    Vielen Dank für die bisherigen Hinweise

    Ich habe mein Programm nun ein klein wenig verändert :

    C#-Quellcode

    1. namespace Variablentest_App
    2. {
    3. public partial class Form1 : Form
    4. {
    5. public Form1()
    6. {
    7. InitializeComponent();
    8. }
    9. public void Test2(List<string> files)
    10. {
    11. Int32.TryParse(textBox1.Text, out int tbInt);
    12. GlobaleVariablen.Variable1 = tbInt;
    13. }
    14. public static class GlobaleVariablen {
    15. public static int Variable1;
    16. public static string Variable2;
    17. }
    18. private void textBox1_TextChanged(object sender, EventArgs e)
    19. {
    20. GlobaleVariablen.Variable1 = GlobaleVariablen.Variable1 + 1;
    21. GlobaleVariablen.Variable2 = ToString(GlobaleVariablen.Variable1,32);
    22. label1.Text = GlobaleVariablen.Variable2;
    23. }
    24. }
    25. }
    26. ;

    Mein Versuch mit der Methode ToString eine veränderte integer
    Variable1 in eine String Variable2 umzuwandeln erzeugt die
    Fehlermeldung CS1501. Im Code wird das Wort ToString rot markiert.

    Aus dem Beispiel von der Seite :learn.microsoft.com/en-us/dotn…%3Droslyn%26k%3Dk(CS1501)
    werde ich aber nicht schlau in Bezug darauf wie ich diese Funktion
    benutzen kann um die veränderte integer Variable1 in eine String
    Variable2 umwandeln zu können.

    Könnte mir jemand zeigen wie ich meinen Code dahin verändern kann,
    dass es funktioniert ?

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

    Danke, ich wollte das Variable1 Integer bleibt, weil ich damit ja noch rechnen wollte. In Bezug auf das Rechnen habe ich noch eine Frage : in dem Programm habe ich geschrieben :

    C#-Quellcode

    1. GlobaleVariablen.Variable1 = GlobaleVariablen.Variable1 + 1;

    Wenn ich das Programm starte und eine Zahl eingebe wird mir immer nur eine 1 angezeigt und nicht Zahl +1 , wenn ich innerhalb der Funktion :

    C#-Quellcode

    1. private void textBox1_TextChanged(object sender, EventArgs e)

    das Wort Test 2 schreiben will, erhalte ich eine Fehlermeldung. Wie kann ich innerhalb des Codes :

    C#-Quellcode

    1. namespace Variablentest_App
    2. {
    3. public partial class Form1 : Form
    4. {
    5. public Form1()
    6. {
    7. InitializeComponent();
    8. }
    9. public void Test2(List<string> files)
    10. {
    11. Int32.TryParse(textBox1.Text, out int tbInt);
    12. GlobaleVariablen.Variable1 = tbInt;
    13. }
    14. public static class GlobaleVariablen {
    15. public static int Variable1;
    16. public static string Variable2;
    17. }
    18. private void textBox1_TextChanged(object sender, EventArgs e)
    19. {
    20. GlobaleVariablen.Variable1 = GlobaleVariablen.Variable1 + 1;
    21. GlobaleVariablen.Variable2 = GlobaleVariablen.Variable1.ToString();
    22. label1.Text = GlobaleVariablen.Variable2;
    23. }
    24. }
    25. }
    26. ;


    Die Funktion Test2 so aufrufen das Variable1 den Wert aus Textbox1 + 1 erhält.
    Ich habe das Problem jetzt selbst gelöst, falls es eine bessere Lösung gibt kann jemand diese gerne hier hinzufügen.

    C#-Quellcode

    1. ​namespace Variablentest_App
    2. {
    3. public partial class Form1 : Form
    4. {
    5. public Form1()
    6. {
    7. InitializeComponent();
    8. }
    9. public static class GlobaleVariablen {
    10. public static int Variable1;
    11. public static string Variable2;
    12. }
    13. private void textBox1_TextChanged(object sender, EventArgs e)
    14. {
    15. Int32.TryParse(textBox1.Text, out int tbInt);
    16. GlobaleVariablen.Variable1 = tbInt;
    17. GlobaleVariablen.Variable1 = GlobaleVariablen.Variable1 + 1;
    18. GlobaleVariablen.Variable2 = GlobaleVariablen.Variable1.ToString();
    19. label1.Text = GlobaleVariablen.Variable2;
    20. }
    21. }
    22. }
    23. ;
    Eine Verbesserung kann ich dir gerade nicht anbieten aber Anregungen. Zum einen Verwendest du TryParse falsch, TryParse gibt dir eine boolesche Variable zurück die du auswerten solltest bevor du den Out Parameter nutzt. Zum anderen ist die Benennung der Klasse GlobaleVariablen irre führend. Die ist nämlich alles andere als global. Du kannst dir mal eine 2 Form anlegen und versuchen von dieser auf GlobaleVariablen zuzugreifen. Besser wäre es wenn du dir für diese Klasse eine eigene Datei erstellt.
    Die in post#7 gezeigten globalen Variablen sind durchaus global.
    Sie innerhalb der Form-Klasse anzusiedeln ist natürlich abwegig. Aber global sind sie, weil public static ist numa von überall zugreifbar - also "global".
    "global" ist übrigens kein wirklicher Fachbegriff. Es gibt ein global - Schlüsselwort - das bedeutet aber was ganz anderes.
    Daher sollte man besser gleich von public static sprechen

    Allerdings: Ich sehe noch garnet, dass man hier public static Variablen brauchen würde - ich hab mal vereinfacht:

    C#-Quellcode

    1. namespace Variablentest_App {
    2. public partial class Form1 : Form {
    3. public Form1() { InitializeComponent(); }
    4. private static int Variable1;
    5. private static string Variable2;
    6. private void textBox1_TextChanged(object sender, EventArgs e) {
    7. Int32.TryParse(textBox1.Text, out int tbInt);
    8. Variable1 = tbInt.Variable1 + 1;
    9. Variable2 = tbInt.ToString();
    10. label1.Text = Variable2;
    11. }
    12. }
    13. }

    Danke für die Hinweise, hier ist eine neue Version, in der ich die boolesche Variable,
    welche die Funktion Tryparse zurückgibt, auswerte.

    C#-Quellcode

    1. ​namespace Variablentest_App
    2. {
    3. public partial class Form1 : Form
    4. {
    5. public Form1()
    6. {
    7. InitializeComponent();
    8. }
    9. private static int Variable1;
    10. private static string Variable2;
    11. private void textBox1_TextChanged(object sender, EventArgs e)
    12. {
    13. bool Erfolg = Int32.TryParse(textBox1.Text, out int tbInt);
    14. if (Erfolg)
    15. {
    16. Variable1 = tbInt;
    17. Variable1 = Variable1 + 1;
    18. Variable2 = Variable1.ToString();
    19. label1.Text = Variable2;
    20. }
    21. else
    22. {
    23. label1.Text = " Es wurde keine Zahl eingegeben ";
    24. }
    25. }
    26. }
    27. }
    28. ;


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

    Wie in Post#2 bereits erwähnt: Warum wird hier überhaupt mit static gearbeitet? Das ergäbe m.E. nur Sinn, wenn es mehrere Form1-Klasseninstanzen gäbe, die alle auf dieselbe Variable zugreifen wollen. Also wenn Instanz1 von Form1 die Variable1 von 666 auf 42 ändert, dann bekommen Instanz2 und Instanz3 von Form1 das insofern mit, dass eben Variable1 den Wert 42 hat, da er nicht instanzspezifisch, sondern klassenspezifisch ist, also Instanz2 und Instanz3 nicht ihre eigenen Variable1-Objekte haben. Aber beim hiesigen Code wird solch ein Verhalten doch gar nicht benötigt. Also braucht man auch static nicht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.