Hi zusammen,
vvlt kann mir einer helfen. Ich möchte den BMI berechnen, was auch soweit klappt. Die Berechnung läuft so bald der zweite Wert eingegeben wird. Blöderweise bricht as Programm ab wenn ich einen der beiden Werte nachträglich änderen will. Kann mir jemand auf die Sprünge helfen?
private void txtbWeight_TextChanged(object sender, EventArgs e)
{
string stKg;
stKg = txtbWeight.Text;
decimal snKg = Convert.ToDecimal(stKg);
string stMeter;
stMeter = txtbHight.Text;
decimal snMeter = Convert.ToDecimal(stMeter);
decimal BMI = snKg / (snMeter * snMeter);
label14.Text = BMI.ToString("0.00");
}
Denke das mir klar ist warum ein Fehler eintritt. Danke schon mal.
gruss
Kannst du uns bitte sagen, was für ein Fehler auftrifft?
Hallo masen,
bitte beachte [Hinweis] Wie poste ich richtig? Punkt 5 - wie p!lle schon gefragt hat.
Siehe auch [Artikel] Debugger: Wie verwende ich den von Visual Studio?
Schau dir auch das Konzept von "Datenbindung" an, dann umgehst du schon etwaige Konvertierungsfehler. Erstell dir dazu eine Klasse
public class Person
{
public decimal Height { get; set; }
public decimal Mass { get; set; }
public decimal BMI { get; set; }
}
und binde diese an die UI-Elemente.
In der Berechnung solltest du auch sicher stellen, dass keine Division durch 0 auftritt.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Hi und Danke schon mal
und sorry das ich mich so unklar ausgedrückt habe. Ich gebe zuerst die Größe und im Anchluss das Gewicht ein. Sobald ich das Gewicht eingegeben habe wird der BMI berechnet. Ändere ich nun das Gewicht ab bekomme ich
Fehlermeldung:
"FormatException wurde nicht behandelt."
Fehlermeldung:
"Zusätzliche Information: Die Eingabezeichenfolge hat das flsche Format."
Ich hatte mir überlegt wie ich es am benutzerfreundlcihsten gestalten kann. Nur leider berücksichtigt meine Art der Berechnung keine potentiellen Fehlerquellen. Die Idee mit der Klasse ist schon mal ganz gut.
Hallo masen,
Die Idee mit der Klasse ist schon mal ganz gut.
Danke 😉 Anders ist es einfach ein Murks. Schau mal:
using System;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private readonly BmiCalculationService _bmiService = new BmiCalculationService();
private readonly Person _person = new Person();
public Form1()
{
InitializeComponent();
heightTextBox.TextChanged += this.TextBox_TextChanged;
massTextBox.TextChanged += this.TextBox_TextChanged;
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
bindingSource1.DataSource = _person;
}
private void TextBox_TextChanged(object sender, EventArgs e)
{
_bmiService.CalculateBmi(_person);
}
}
public class Person
{
public decimal HeightInMeter { get; set; }
public decimal MassInKg { get; set; }
public decimal? BMI { get; set; }
}
public class BmiCalculationService
{
public void CalculateBmi(Person person)
{
if (person.HeightInMeter == 0)
{
person.BMI = null;
return;
}
person.BMI = person.MassInKg / (person.HeightInMeter * person.HeightInMeter);
}
}
}
Grob und so einfach kanns gehen.
Wie du auch siehst wird im Code der Form keine Berechnung durchgeführt, sondern dazu gibt es eine eigene (Service-) Klasse.
Wenn du nicht schon über das Stichwort "MVC" gestolpert bist, so wird dir das früher od. später sicher unterkommen. Hier ist das Beispiel aber genau nach MVC umgesetzt.
Model: Person und der BmiCalculationService
View: die Form
Controller: die Ereignishandler der Form
Durch diese Vorgehensweise ist der Code sauber getrennt. Wobei normalerweise auch noch jede Klasse in eine eigene Datei kommen würde.
Den Rest überlegst du dir selbst.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Vielen Dank 😃
Ich werde mich gleich mal daran setzen. Was mir schon mal aufgefallen ist...
person.BMI = NULL;
...geht so nicht, oder? Evtl.
person.BMI = 0;
Eines ist mir nicht ganz so klar...
bindingSource1.DataSource = _person;
Worauf bezieht sich die bindingsource? Versteh ich net ganz!
gruss
Hallo,
Ich werde mich gleich mal daran setzen. Was mir schon mal aufgefallen ist...
person.BMI = NULL;
...geht so nicht, oder?
Doch, in gfoidls Beispiel geht das, weil BMI als decimal?
(achte auch das Fragezeichen) deklariert ist.
Es handelt sich dabei um ein Nullable<decimal>.
bindingSource1 ist eine BindingSource, die an die View gebunden wird.
Wie die beiden Dinge funktionieren, kannst Du den verlinkten Doku-Seiten entnehmen.
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca