Moin aus dem Norden,
ich bin zwar jetzt kein wirklicher Anfänger mehr, stehe momentan aber echt auf den Schlauch. Ich erstelle gerade eine kleine Software Applikation, um Bücher oder ähnliches in eine Datenbank zu schreiben. Datenbankanbindung etc. steht bereits. Nur möchte ich jetzt etwas Feinarbeit leisten.
Konkret: Der Preis eines Buches aus einer Textbox und die Anzahl des Buches aus der Combobox auslesen und in ein Label, oder je nachdem auch Textbox ausgeben.
Habe Die Anzahl der Bücher in der Combobox über eine For-Schleife laufen, was auch gut funktioniert hat. Habe nun die Methode InitializeValues() gebaut, um sobald, ein Preis eingetragen und die Menge ausgewählt wurde, der gesamtbetrag im Label ausgegeben wird.
(Ich wei dass das möglich ist, da ich schonmal sowas gemacht habe und das hat auch funktioniert hat. Leider finde ich nichts mehr davon (wegen Umzug), zumal die zwar in VBA geschrieben waren, aber das eher nur am Rande.)
Meine Versuche über:
private void [tt][color]InitializeValues()[/color][/tt]
{
if(txtBuchpreis.Text != "" || cmbBuchMenge.Text != "")
{
float Gesamt = float.Parse(txtBuchpreis.Text) * float.Parse(cmbBuchMenge.SelectedIndex.Text);
Gesamt = float.Parse(lblGesamtpreis.Text);
}
}
Falls das Thema schon gibt, bitte kurze Rückmeldung, da ich es noch nicht hier oder anderswo gefunden habe. Naja Gefunden habe ich zu dem Thema zwar schon einiges, aber nicht zu dem Konkreten Problem was ich habe.
Könnte zwar auch am Parsing liegen, aber das bezweifel ich.
Wäre super für eine geeignete Schützenhilfe.
Mfg
WilliamDexter
Wann wird denn deine InitializeValues Methode aufgerufen?
Schau mit dem Debugger, was in den einzelnen Variablen steht.
P.S.: das wird knallen, wenn keine Zahl eingetragen ist.
Wenn du den berechneten Wert ausgeben möchtest, dann mußt du den Text
setzen (nicht parsen):
lblGesamtpreis.Text = Gesamt.ToString();
Das sind aber absolute Grundlagen.
PS: Und Papst hat Recht - du solltest TryParse
verwenden, damit keine Exception deine Anwendung beendet, wenn der Text nicht als Zahl interpretiert werden kann.
Die steht im public ProductScreen() {}
Also sobald das Fenster geladen ist und ich was eintragen kann, soll es halt auch berechnet werden können, unabhängig ob ich ein neues Produkt hinzufüge oder nicht, zumal ich mit dem If-Statement das ja durchaus absicher.
.... Es tut sich irgendwie gar nischt.😠
Einfach in der Methode einen Breakpoint setzen… da gibt es kein „Es tut sich irgendwie gar nischt.“
haha, glaub mir das ist mir klar, dass das Gruindlagen sind. Nur Theorie und Praxis sind teilweise zwei Paar Schuhe.
Das setzen funktioniert ja eben nicht. Ich bekomme die Werte ja als string. Die muss ich ja zuerst Konvertieren, damit ich sie berechnen kann.
Und da ist der springende Punkt.
Ohne Konvertierung bekomme ich die Werte nicht berechnet bzw ausgegeben, oder kannst du Textzeichen rechnen?. Oder reden wir aneinander vorbei?
Wie schon von Th69 geschrieben, du setzt nirgends den Inhalt deines Textfeldes. Deine Variable „Gesamt“ existiert nur im Bereich deiner Methode, die kannst du nirgendwo anders auslesen.
Du sollst nur Zeile 6 aus deinem Code mit meiner Zeile ersetzen...
PS: Und bevor du damit eine Datenbankanwendung entwickelst, solltest du auf jeden Fall vorher [Artikel] Drei-Schichten-Architektur durchlesen und anwenden.
ja das habe ich doch auch bereits gemacht. es hat bis heute alles nichts gebracht. Es kam immer wieder eine Format Exception...
Aber ich habe jetzt eine alternative Lösung gefunden.
private void btnPreisBerechnen_Click(object sender, EventArgs e)
{
double a = Convert.ToDouble(txtBuchpreis.Text);
double b = Convert.ToDouble(cmbBuchMenge.Text);
double gesamt = a * b;
txtGesamtPreis.Text = gesamt.ToString();
}
Das funktioniert, über einen button, den man dann demensprechen klicken muss, wenn man den Preis berechnen will.
Bitte [Hinweis] Wie poste ich richtig? beachten und selbst die Code Tags setzen.
Dann ist dein Problem wohl, dass dein Code gar nicht aufgerufen wurde.
Das hättest du mit dem Debugger und einem Breakpoint herausgefunden (war das dass „passiert nichts“?).
Um 8m gleichen Kontext zu bleiben: du müsstest das richtige Event von deinen Uli Elementen abonnieren und dort deinen Code auswerten.
Zwei Tipps:
Auch Convert.ToDouble (Api-Docs) wirft eine exception , wenn keine lesbare Zahl eingegeben wird. Convert ist in dem Kontext nicht die korrekte Klasse, nutze besser double.TryParse (Api-Docs).
Verwende Databinding, das wirkt erst einmal komplexer, nimmt dir aber später viel Arbeit ab!
Debugt habe ich es ja auch, mehrfach. Im Lokalfenster habe ich lediglich die normalen Werte gesehen... es wurden aber keine Variablen mit den Werten aufgelistet.
Danach habe ich es ja auch wie du sagtest, mit Breakpoints versucht. Den Fehler dort abgefangen wo er war. Nur wenn die Exception mir zwar was sagt, dass da ein Fehler ist, hat sie mir ja nicht gezeigt von welchem Code es verursacht wird.
Ich habe inzwischen die Datenbank nochmal neu gemacht, da das ständige hin und her wechseln der Datentypen, die Datenbank nicht so sehr gemocht hat.
Ist ja auch eine eher kleine. Habe das jetzt nochmal neu aufgesetzt. Es fehlten noch einige Verweise und using-Direktive. Also bei den Daten an sich gibts jetzt keine Konvertierungsprobleme mehr, da ich ja im Lokalfenster die Daten aufgelistet bekomme.
Jetzt kommt bisher noch den Fehler bei der SQLCommand.ExecuteNonQuery();
Fehlermeldung:
System.Data.SqlClient.SqlException: "Error converting data type varchar to numeric".
Jetzt ist es so ich habe aber im Lokalfenster alle Variablen, die aufgenommen werden. Von Artikelnummer, Artikelname, Artikelmenge, Artikelpreis, etc.
Auch die query Line = "insert into BuecherTb values("......."), hat alle Daten die ich in die Textboxen/Comboboxen eingetragen habe, aufgenommen.
In meiner Datenbank habe ich folgende Daten:
CREATE TABLE [dbo].[BuecherTb] (
[artikelNummer] BIGINT NOT NULL,
[artikelName] VARCHAR (50) NOT NULL,
[artikelAutor] VARCHAR (50) NOT NULL,
[artikelBuchseiten] INT NOT NULL,
[artikelGenre] VARCHAR (50) NOT NULL,
[artikelCover] VARCHAR (50) NOT NULL,
[artikelMenge] INT NOT NULL,
[artikelPreis] NUMERIC (18) NOT NULL,
[artikelGesamtpreis] NUMERIC (18) NOT NULL,
PRIMARY KEY CLUSTERED ([artikelNummer] ASC)
);
Jetzt wüsste ich eigentlich gerne, wo da mein Fehler liegt. Denn das möchte ich gerne lösen. Ich bin zwar immer noch ein Anfänger, aber wie soll man Fehler finden, wenn man nicht weiß wo man suchen soll. Sonst wäre ich nicht hier in diesem Forum, um zu fragen.
Kannst Du Dich bitte an [Hinweis] Wie poste ich richtig? orientieren und Code / SQL in Zukunft selbst in die entsprechenden Code Tags packen?
Niemand mag Plain Text lesen und ich mag nich dauernd Beiträge editieren 🙂
Danke Dir..
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Danach habe ich es ja auch wie du sagtest, mit Breakpoints versucht. Den Fehler dort abgefangen wo er war. Nur wenn die Exception mir zwar was sagt, dass da ein Fehler ist, hat sie mir ja nicht gezeigt von welchem Code es verursacht wird.
Dafür gibt es den Stack-Trace (auf deutsch: Aufrufliste): Anzeigen der Aufrufliste
Bei Datenbankenzugriffen solltest du Datenbankparameter benutzen: [Artikelserie] SQL: Parameter von Befehlen