C# Windows Form Rechner

Xsp

Lt. Commander
Registriert
Jan. 2010
Beiträge
1.710
Hallo Community,

ich habe grade angefangen mit Windows Forms in C#.
Es macht auf jeden fall mehr spaß als immer diese Öden Consolenanwendungen.

Nun wollte ich erstmal was einfaches machen.
Ich habe mir überlegt nacht dem Kopierer, den ich Fertig habe, einen kleiner Rechner zu Programmieren, um besser in Forms reinzukommen.

Nun muss ich nur noch das eigentliche Rechnen machen. Da klappt es nicht so wie ich es will.

Code:
private void ErgebnisButton_Click(object sender, EventArgs e)
        {
            switch (Convert.ToString(OperatorComboBox.Text))
            {
                case "+":
                    ErgebnisTextbox.Text = [COLOR="red"]Convert.ToDouble(EingabeTextBox.Text) + Convert.ToDouble(EingabeTextBox2.Text);[/COLOR]
                    break;

                case "-":
                    ErgebnisTextbox.Text = [COLOR="red"]Convert.ToDouble(EingabeTextBox.Text) - Convert.ToDouble(EingabeTextBox2.Text);[/COLOR]
                    break;

                case "/":
                    ErgebnisTextbox.Text = [COLOR="red"]Convert.ToDouble(EingabeTextBox.Text) / Convert.ToDouble(EingabeTextBox2.Text);[/COLOR]
                    break;

                case "*":
                    ErgebnisTextbox.Text = [COLOR="Red"]Convert.ToDouble(EingabeTextBox.Text) * Convert.ToDouble(EingabeTextBox2.Text);[/COLOR]
                    break;
            }
        }

In der Entwicklungsumgebung von Visual Studio 2012 C# ist der Teil rechts vom Komma rot unter kringelt.

Die Fehlermeldung lautet:
Eine implizite Konvertierung vom Typ "double" in "string" ist nicht möglich.
Und das halt 4 mal.

Ich hoffe ihr könnt mir soweit weiterhelfen, damit es Funktioniert.
 
Der Ausdruck:
Convert.ToDouble(EingabeTextBox.Text) * Convert.ToDouble(EingabeTextBox2.Text)
ergibt als Typ Double, dei Property Text muss aber ein String sein. Also einfach noch den errechneten Double-Wert einen String umwandeln. Anstatt double wäre decimal besser, dein Rechner soll ja auch genau rechnen? Du solltest auch noch abchecken, ob der Wertebereich nicht überschritten wurde.
 
Also wenn ich jetzt

Code:
case "+":
                    ErgebnisTextbox.Text = Convert.ToDecimal(EingabeTextBox.Text).ToString() + Convert.ToDecimal(EingabeTextBox2.Text).ToString();
                    break;

mache, dann geht das. Aber bei den restlichen Operatoren nicht.
Aber dennoch gibt er mir ein Fehler aus.
 
Du muss schon
Code:
(Convert.ToDouble(EingabeTextBox.Text) * Convert.ToDouble(EingabeTextBox2.Text)).ToString()
schreiben.
 
Achso, nur einmal .ToString(); das wusste ich nicht.

Perfekt funktioniert. =)
Auf euch hier im Forum kann man sich nunmal verlassen.

Danke!
 
Noch ne Anmerkung: Wenn du eh gerade mit GUI anfängst, nimm direkt WPF... Das ist wesentlich mächtiger als WinForms.
 
Also ich würde ja nicht direkt mit den Textboxen rechnen, sondern erstmal die Eingabewerte in eine Variable schreiben und bei der Gelegenheit auch gleich die Gültigkeit der eingegebenen Werte testen.

Zum Beispiel mit try-catch Blöcken.

Code:
decimal a,b;

try { a = Convert.ToDecimal(EingabeTextBox.Text); }
catch { MessageBox.Show("Wert in erster Textbox ungültig"); return; }

try { b = Convert.ToDecimal(EingabeTextBox2.Text); }
catch { MessageBox.Show("Wert in zweiter Textbox ungültig"); return; }

Danach kannste dann "switch" mit der Operatorbox verwenden.
Vortei ist, dass man das ganze viel besser lesen kann. Du schreibst dann nämlich nur:

Code:
ErgebnisTextbox.Text = (a * b).ToString();

Zweiter Vorteil: Wenn einer der eingegebenen Werte mit denen du rechnest ungültig ist (nicht in Decimal umgewandelt werden kann), erscheint die entsprechende Meldung als Popup und das Programm rechnet erst gar nicht, sondern bricht ab (return Aufruf).
 
MacGyver schrieb:
[...]Zum Beispiel mit try-catch Blöcken.[...]
C# liefert auch eine direkte Möglichkeit.(ist das Grammatikalisch richtig? :P)
Code:
decimal.tryParse(wert_text, out wert);
das ganze dann in eine if-Abfrage einbauen und fertig ist die Geschichte.

Ich bin mir allerdings nicht 100% sicher, was denn jetzt genau "schöner" ist ^^. Ist nur als kleine Randbemerkung gedacht.
 
PapstRatze schrieb:
C# liefert auch eine direkte Möglichkeit.(ist das Grammatikalisch richtig? :P)
Code:
decimal.tryParse(wert_text, out wert);
das ganze dann in eine if-Abfrage einbauen und fertig ist die Geschichte.

Ich bin mir allerdings nicht 100% sicher, was denn jetzt genau "schöner" ist ^^. Ist nur als kleine Randbemerkung gedacht.

Ich denke das kann man halten wie 'n Dachdecker. Hauptsache man fängt überhaupt irgendwie ungültige Werte ab, damit die Funktion später nicht crasht.
 
try catch ist für AUSNAHMEN!!! Nicht für das Prüfen von Werten.
 
Zurück
Oben