C# Wenn Textbox leer dann Null einsetzten und damit Rechnen
Hallo, ich bin Programmieranfänger und habe folgendes Problem
private void button1_Click(object sender, EventArgs e)
{
double QuotenWette =
(1/Convert.ToDouble(tbxQoute1.Text)) +
(1/Convert.ToDouble(tbxQuote2.Text)) +
(1 / Convert.ToDouble(tbxQuote3.Text));
QuotenWette = Math.Round(QuotenWette, 3);
if (tbxQuote3.Text == "" )
{
tbxQuote3.Text = null;
}
if (QuotenWette < 1)
{
tbxErtrag.Text = Convert.ToString(QuotenWette);
}
else
{
tbxErtrag.Text = "Kein Surebet!";
}
}
und zwar wenn die Textbox von Qoute3 leer ist, soll Automatisch der Wert 0 eingesetzt werden und mit dieser Wert 0 soll dann oben bei (1/Convert.ToDouble(tbxQuote3.Text) gerechnet werden.
Ich sitze da jetzt schon 3 Stunden dran und weiß einfach nicht weiter. Beim Debuggen wird kein Fehler eingezeigt aber wenn ich dann nur 2 Qouten eingebe, kommt die Fehlermeldung, dass es eine Unerwartete Außnahme gibt.
Das ganze Sieht so aus:

2 Antworten
Mit
tbxQuote3.Text = null;
löschst du die Variable, du sagst also, sie hat keinen Inhalt.
Benutze mal
tbxQuote3.Text = "0";
und schau ob es funktioniert.
Ausserdem musst du die Abfrage vor der Rechnung einfügen, so dass es schlussendlich so aussieht:
private void button1_Click(object sender, EventArgs e)
{
if (tbxQuote3.Text == "" )
{
tbxQuote3.Text = "0";
}
double QuotenWette =
(1/Convert.ToDouble(tbxQoute1.Text)) +
(1/Convert.ToDouble(tbxQuote2.Text)) +
(1 / Convert.ToDouble(tbxQuote3.Text));
QuotenWette = Math.Round(QuotenWette, 3);
if (QuotenWette < 1)
{
tbxErtrag.Text = Convert.ToString(QuotenWette);
}
else
{
tbxErtrag.Text = "Kein Surebet!";
}
}
Also die If Abfrage 1 mit der Abfrage, ob die 3. Textbox leer ist, muss vor das double QuotenWette, weil du ja als erstes überprüfen willst ob die Textbox leer ist, dann willst du mit dem Wert aus der Textbox rechnen.
Du überprüfst also mit dem Code erst einmal ob die Textbox leer ist und rechnest dann erst. Andersherum wäre es ja nicht logisch.
Oh, oh! Teilst du etwa wirklich durch 0? Du musst vor dem Teilen prüfen, ob der Double aus tbxQuote[1,2,3].Text !=0 , ansonsten knallt dir eine Fehlermeldung vor die Augen.
Das Ersetzen mut 0 könntest du direkt während der Eingabe, genauer, nach dem Validieren, ausführen. Deine Textboxen weisen nicht nur ein Event Click auf. Wenn du einen Doppelklick auf das Event "Validated" machst, kannst du einen Code dazu eingeben. Validation ist ein Prüfvorgang, der beim Verlassen des Controls ausgeführt wird, wenn ein Button geklickt oder in ein anderes Textfeld gewechselt wird. In diesem Event könntest du eintragen (Namen der Textbox jeweils anpassen):
if (string.IsNullOrEmpty(tbxQuote1.Text))
{
tbxQuote1.Text = 0;
}
Die Methode String.IsNullOrEmpty(TextBoxName.Text) empfehle ich anstatt der einfachen Prüfung auf Null. Immerhin könnten auch ein oder mehrere Leerzeichen eingegeben werden, wodurch der Text nicht mehr Null, sondern lediglich Empty wäre. Die Prüfung auf Null würde in diesem Fall nicht mehr greifen.
Also das mit der bin ich Umgangen und zwar das er mir ein Dialogfenster ausgibt und das Feld dann leer lässt. Ist mir dann auch aufgefallen und ich hab mich selbst gefragt ob ich dumm bin =D Aber das mit dem Text daran hab ich auch gedacht und deshalb danke für den Hinweis ich hab da schon ne weile rum probiert.
Etwas anderes. Was, wenn der Anwender "51:;!)" eingibt? Das Convert wird damit nicht klar kommen! Peng, Fehlermeldung, oder sogar Absturz, weil keine übersehene Fehler mittels Try-Catch abgefangen werden. Entweder verhinderst du eine andere Eingabe als Ziffern, oder aber du fängst fehlerhafte Eingaben ab, indem du anstatt Convert das TryParse verwendest, was im Grunde immer besser ist...
double parsedValue = 0;
if (double.TryParse(tbx1Quote.Text, out parsedValue) == false || parsedValue == 0))
{
MessageBoxShow("Ändern Sie Ihre Eingabe...");
}
else
{
double quote1 = 1 / parsedValue;
}
Ok danke hat funktioniert aber nur so als Verständisfrage
Warum muss das vor Double QuotenWette? Weil ich hatte gedacht der fragt dann erst die Textbox3 ab, setzt die 0 ein und springt dann zum nächsten If block?