Laden...

Werte aus Texboxen u. Combobox berechnen und ausgeben

Erstellt von WilliamDexter vor 2 Jahren Letzter Beitrag vor 2 Jahren 416 Views
W
WilliamDexter Themenstarter:in
9 Beiträge seit 2021
vor 2 Jahren
Werte aus Texboxen u. Combobox berechnen und ausgeben

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

P
441 Beiträge seit 2014
vor 2 Jahren

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.

4.931 Beiträge seit 2008
vor 2 Jahren

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.

W
WilliamDexter Themenstarter:in
9 Beiträge seit 2021
vor 2 Jahren

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.😠

J
61 Beiträge seit 2020
vor 2 Jahren

Einfach in der Methode einen Breakpoint setzen… da gibt es kein „Es tut sich irgendwie gar nischt.“

W
WilliamDexter Themenstarter:in
9 Beiträge seit 2021
vor 2 Jahren

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?

J
61 Beiträge seit 2020
vor 2 Jahren

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.

4.931 Beiträge seit 2008
vor 2 Jahren

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.

W
WilliamDexter Themenstarter:in
9 Beiträge seit 2021
vor 2 Jahren
Format Exception

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.

Hinweis von Abt vor 2 Jahren

Bitte [Hinweis] Wie poste ich richtig? beachten und selbst die Code Tags setzen.

P
441 Beiträge seit 2014
vor 2 Jahren

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!

W
WilliamDexter Themenstarter:in
9 Beiträge seit 2021
vor 2 Jahren

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.

16.806 Beiträge seit 2008
vor 2 Jahren

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..

4.931 Beiträge seit 2008
vor 2 Jahren

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