Textbox Probleme bei Eingabe / Überprüfung

Miky

Grünschnabel
Hallo,
schreibe gerade ein Programm in Windowsform c#.
Nun habe ich folgendes Problem:

Ich möchte in "textBox9" nur die Eingabe von Zahlen zulassen, das wollte ich so lösen:

private void textBox9_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
if ("1234567890\b".IndexOf(e.KeyChar.ToString()) < 0)
{
e.Handled = true;
}
}
...........
...........

private void button3_Click(object sender, EventArgs e)
{
double Guthaben;
................
................

Guthaben = double.Parse(textBox9.Text); // hier gibt er beim debuggen die Fehlermeldung aus, sei nicht behandelt

Finde keine Möglichkeit um das zu lösen, Kann mir jemand helfen?

Gruß
Miky
 
Hallo M4st3r,

in meiner "textBox9" steht nichts drin. Wird eine Eingabe gemacht.

Poste dir mal alles, aber nicht erschrecken - manches kann man vielleicht einfacher schreiben (Aber so funktioniert mein Form).

Den Link von dir lese ich mir gleich durch.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
}

private void button2_Click(object sender, EventArgs e)
{
this.Hide();
}

private void beendenToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}

private void textBox9_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) //Damit soll gleich die Abfrage der Eingabe erfolgen
{
if ("1234567890\b".IndexOf(e.KeyChar.ToString()) < 0)
{
e.Handled = true;
}
}

private void button3_Click(object sender, EventArgs e) // Damit startet meine Berechnung
{
double Guthaben;
double Zinssatz;
double Guthabengesamt;
double a = 0.005F;
double b = 0.0076F;
double c = 0.0102F;
double d = 0.0128F;
double f = 0.0154F;
double g = 0.018F;
double h = 0.0206F;
double i = 0.0232F;
double j = 0.0258F;
double k = 0.0284F;
double Resultat;
double Resultat2;
double Resultat3;
double Resultat4;
double Resultat5;
double Resultat6;
double Resultat7;
double Resultat8;
double Resultat9;
double Resultat10;
double Endguthaben;
double Endguthaben2;
double Endguthaben3;
double Endguthaben4;
double Endguthaben5;
double Endguthaben6;
double Endguthaben7;
double Endguthaben8;
double Endguthaben9;
double Endguthaben10;
Guthaben = double.Parse(textBox9.Text); // hier markiert der Debugger die Zeile
Zinssatz = double.Parse(comboBox3.Text);
Resultat = Math.Round(Guthaben * a,0);
Resultat2 = Math.Round(Guthaben * b,0);
Resultat3 = Math.Round(Guthaben * c,0);
Resultat4 = Math.Round(Guthaben * d,0);
Resultat5 = Math.Round(Guthaben * f,0);
Resultat6 = Math.Round(Guthaben * g,0);
Resultat7 = Math.Round(Guthaben * h,0);
Resultat8 = Math.Round(Guthaben * i,0);
Resultat9 = Math.Round(Guthaben * j,0);
Resultat10 = Math.Round(Guthaben * k,0);
Guthabengesamt = (Resultat + Resultat2 + Resultat3 + Resultat4 + Resultat5 + Resultat6 + Resultat7 + Resultat8 + Resultat9 + Resultat10) * 12;
textBox10.Text = Resultat.ToString();
textBox11.Text = Resultat2.ToString();
textBox12.Text = Resultat3.ToString();
textBox13.Text = Resultat4.ToString();
textBox14.Text = Resultat5.ToString();
textBox15.Text = Resultat6.ToString();
textBox16.Text = Resultat7.ToString();
textBox17.Text = Resultat8.ToString();
textBox18.Text = Resultat9.ToString();
textBox19.Text = Resultat10.ToString();
textBox20.Text = Guthabengesamt.ToString();
Endguthaben = Math.Round((Resultat * 12) * (1 + (Zinssatz / 100)),0);
Endguthaben2 = Math.Round(Endguthaben * (1 + (Zinssatz / 100)),0) + Math.Round((Resultat2 * 12 * (1 + (Zinssatz /100))),0);
Endguthaben3 = Math.Round(Endguthaben2 * (1 + (Zinssatz / 100)),0) + Math.Round((Resultat2 * 12 * (1 + (Zinssatz / 100))),0);
Endguthaben4 = Math.Round(Endguthaben3 * (1 + (Zinssatz / 100)),0) + Math.Round((Resultat4 * 12 * (1 + (Zinssatz / 100))),0);
Endguthaben5 = Math.Round(Endguthaben4 * (1 + (Zinssatz / 100)),0) + Math.Round((Resultat5 * 12 * (1 + (Zinssatz / 100))),0);
Endguthaben6 = Math.Round(Endguthaben5 * (1 + (Zinssatz / 100)),0) + Math.Round((Resultat6 * 12 * (1 + (Zinssatz / 100))),0);
Endguthaben7 = Math.Round(Endguthaben6 * (1 + (Zinssatz / 100)),0) + Math.Round((Resultat7 * 12 * (1 + (Zinssatz / 100))),0);
Endguthaben8 = Math.Round(Endguthaben7 * (1 + (Zinssatz / 100)),0) + Math.Round((Resultat8 * 12 * (1 + (Zinssatz / 100))),0);
Endguthaben9 = Math.Round(Endguthaben8 * (1 + (Zinssatz / 100)),0) + Math.Round((Resultat9 * 12 * (1 + (Zinssatz / 100))),0);
Endguthaben10 = Math.Round(Endguthaben9 * (1 + (Zinssatz / 100)),0) + Math.Round((Resultat10 * 12 * (1 + (Zinssatz / 100))),0);
textBox21.Text = Endguthaben10.ToString();
}
}
}

Gruß
Miky
 
Eine Double.Parse auf einen leeren String bring zwangsläufig eine Exception!

Du könntest Double.TryParse benutzen um das ganze zu umgehen.
 
Der Debugger gibt erst den Fehler aus wenn:


1. "textBox9" ist Leer
2. "textBox9" stehen Buchstaben

Sobald etwas in der "textBox9" (nur Zahlen) steht funktioniert alles.

Deshalb wollte ich die Eingabe so gestalten, dass nur Zahlen eingegeben werden können.

Mit double.TryParse will er gar nicht

Danke aber für den Denkanstoß.

Miky
 
Entschuldige, war komplett daneben.
Habe meinen Code in der falschen Instanz eingegeben. Deshalb hat es nicht funktioniert.

Gelöst habe ich es wie folgt:

private void textBox9_TextChanged(object sender, EventArgs e)
{
Double Zahl;
if (Double.TryParse(textBox9.Text, out Zahl))
{

}
else
{
MessageBox.Show("Geben Sie eine Zahl ein");
}
}

Damit ich keine Fehlermeldung mehr bekomme wenn das Feld leer ist, habe ich es einfach benannt (mit einer Zahl). Also kann es nicht passieren, das es leer bleibt.

Vielen Dank für Deine Hilfe.

Grüße
Miky
 
Hi

Das Ganze ist ziemlich umständlich, unschön und fehleranfällig. Besser wäre es, wenn du RegularExpressions an der Stelle nutzt.
http://www.c-sharpcorner.com/UploadFile/Ashish1/validate01252006171747PM/validate.aspx
Als Event solltest du auch nicht TextChanged KeyPressed oder ähnliche verwenden sondern ein Event welche geworfen wird, wenn der Focus das Control verlassen soll - Leave zum Beispiel.
Noch besser wäre das Validating Event.

Und bitte setzt deinen Quelltext in Code-Tags oder Tags für die entsprechende Sprache. Das macht die Sache erheblich lesbarer! Danke!
 
Hallo Nico,

vielen Dank für den Vorschlag. Habe diesen gleich umgesetzt.

Das mit RegularExpressions habe ich hinbekommen:

private void textBox9_TextChanged(object sender, EventArgs e)
{
string Guthaben = textBox9.Text;
if (System.Text.RegularExpressions.Regex.IsMatch(Guthaben, @"^[0-9]+$") == false)
{
MessageBox.Show("Geben Sie eine Zahl ein",
Application.ProductName);
return;
}
}

Leider besteht bei mir bei Validating Event ein Fragezeichen. Habe dies nicht hinbekommen. Trotzdem vielen Dank. Ist wesentlich besser als meine Variante.

Vielleicht kannst Du mir zu Validating Event was sagen.

Gruß
Miky
 
Vielleicht kannst Du mir zu Validating Event was sagen.
Was soll ich dir dazu sagen? :confused: Ich weiß ja nicht wo dein Problem liegt!
Gehts vielleicht darum, dass das Event nicht ausgelöst wird?
Dann schau doch mal genau in der Beschreibung nach ;)
MSDN - Control.Validating Event hat gesagt.:
[...]If the CausesValidation property is set to false, the Validating and Validated events are suppressed.[...]
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validating(VS.80).aspx
 
Zurück