Laden...

Berechnung des BMI. Fehler wenn nach erfolgter Berechnung Wert geändert wird

Erstellt von masen vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.430 Views
M
masen Themenstarter:in
10 Beiträge seit 2015
vor 8 Jahren
Berechnung des BMI. Fehler wenn nach erfolgter Berechnung Wert geändert wird

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

1.040 Beiträge seit 2007
vor 8 Jahren

Kannst du uns bitte sagen, was für ein Fehler auftrifft?

6.911 Beiträge seit 2009
vor 8 Jahren

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!"

M
masen Themenstarter:in
10 Beiträge seit 2015
vor 8 Jahren

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.

6.911 Beiträge seit 2009
vor 8 Jahren

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!"

M
masen Themenstarter:in
10 Beiträge seit 2015
vor 8 Jahren

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

3.170 Beiträge seit 2006
vor 8 Jahren

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