Fraggla Geschrieben 30. August 2010 Geschrieben 30. August 2010 (bearbeitet) Hi, versuche gerade meine Consolen Anwendung auf Win nachzubauen. Das Programm soll nach vorheriger Auswahl via Radio Button den Grundwert, Zinswert oder Prozentsatz berechnen. Allerdings verzweifel ich gerade ein wenig an den Umwandlungen von string in double und wieder zurück... Hier mein bisheriger Code: private void Berechnen_Click(object sender, EventArgs e) { if (Grundwertrd.Checked == true) { string Ergebnistxt; double Zinswertz = double.Parse(Zinswerttxt.Text); double Prozentwertz = double.Parse(Prozentsatztxt.Text); double Ergebnistxtz = Zinswertz * 100 / Zinswertz; Ergebnistxtz.ToString = Ergebnistxt.Text; MessageBox.Show("Der Grundwert wurde berechnet"); //double Zinswertz = double.Parse(Zinswerttxt); }else{ MessageBox.Show("Mäh"); } } Edit: Fehlermeldung: "sting" enhält keine Definition für "Text", und es konnte keine Erweiterungsmethode "Text" gefunden werden, die ein erster Argument vom Typ "string" akzeptiert. (Fehlt eine Using-Direktive oder ein Assemblyverweis?) Der Fehler bezieht sich auf "Ergebnistxtz.ToString = Ergebnistxt.Text" Es muss doch eine elegantere Lösung dafür geben, oder? Wäre schön, wenn ihr mir hier einen Hinweis geben könntet, hab mit Google zwar schon gesucht, jedoch werde ich aus den dortigen Syntaxangaben nicht wirklich schlau Bearbeitet 30. August 2010 von Fraggla Zitieren
Fraggla Geschrieben 30. August 2010 Autor Geschrieben 30. August 2010 (bearbeitet) konnte jetzt den Fehler mit der folgenden Änderung umgehen: if (Grundwertrd.Checked == true) { double Zinswertz = double.Parse(Zinswerttxt.Text); double Prozentwertz = double.Parse(Prozentsatztxt.Text); [COLOR="Red"]Ergebnistxt.Text = string.Format("{0}", Zinswertz * 100 / Prozentwertz);[/COLOR] MessageBox.Show("Der Grundwert wurde berechnet"); }else{ MessageBox.Show("Mäh"); Gibts elegantere Möglichkeiten dafür? bin nur zufällig auf diese Lösung gestoßen Bearbeitet 30. August 2010 von Fraggla Zitieren
cätch Geschrieben 30. August 2010 Geschrieben 30. August 2010 Die rot markierte Zeile durch folgende tauschen... Ergebnistxtz.Text= Ergebnistxt.ToString(); Zitieren
oxygen Geschrieben 30. August 2010 Geschrieben 30. August 2010 ich verwende dafür immer gern die Funktion convert.toDatentyp(Variable). Funktionierte bis jetzt immer einwandfrei mit vielen Datentypen. Zitieren
Fraggla Geschrieben 31. August 2010 Autor Geschrieben 31. August 2010 Beides ausprobiert, beides Funktioniert nicht. Eine impliziete Konvertierung von string in double ist nicht möglich. D.h mit meinem 1 Befehl oben, kann ich die Berechnung und die Ausgabe mit einer Zeile machen. Glaub das ist mir am angenehmsten. Nächste Frage: Ich würde gerne, sobald via RadioButton eine Berechnung ausgewählt wurde, dass das des zu berechnenden Wertes grau wird und nicht beschrieben werden kann. Dafür benutze ich im Moment "Grundwerttxt.Enabled = false;" Das Problem, ich hab keine Ahnung wie ich das am Besten triggern kann. Direkt im Radiobutton funktioniert bisher nur zum Teil: Man kann noch eine Eingabe in dem Feld machen, die Eingabe wird jedoch ignoriert. Wenn ichs mit dem Knopf "Berechnen" mache, konnten Zahlen logischerweise schon vorher eingegeben werden, das Feld wird hier jedoch danach grau und auch hier ignoriert er die Eingabe. Wäre schön wenn man hier noch Denkanstöße geben könnte. Zitieren
Klotzkopp Geschrieben 31. August 2010 Geschrieben 31. August 2010 Nächste Frage:Mach dazu bitte demnächst einen neuen Thread auf. Ein Thread pro Thema, nicht pro User oder Programm. Direkt im Radiobutton funktioniert bisher nur zum Teil: Man kann noch eine Eingabe in dem Feld machen, die Eingabe wird jedoch ignoriert.Das wäre aber der richtige Weg. Zeig doch mal, wie du das machst. Zitieren
Fraggla Geschrieben 31. August 2010 Autor Geschrieben 31. August 2010 //Radio Buttons Definieren public void AddRadioButtons() { Grundwertrd.AutoCheck = true; Grundwertrd.Text = "Checked"; Grundwertrd.Checked = true; Grundwertrd.CheckedChanged += new EventHandler(rBut_CheckedChanged); Controls.Add(Grundwertrd); } public void AddRadioButtons2() { Zinswertrd.AutoCheck = true; Zinswertrd.Text = "Checked"; Zinswertrd.Checked = true; Zinswertrd.CheckedChanged += new EventHandler(rBut_CheckedChanged); Controls.Add(Zinswertrd); } public void AddRadioButtons3() { Prozentsatzrd.AutoCheck = true; Prozentsatzrd.Text = "Checked"; Prozentsatzrd.Checked = true; Prozentsatzrd.CheckedChanged += new EventHandler(rBut_CheckedChanged); Controls.Add(Prozentsatzrd); } //Grundwert ausblenden private void rBut_CheckedChanged(object sender, System.EventArgs e) { Grundwerttxt.Enabled = false; Zinswerttxt.Enabled = true; Prozentsatztxt.Enabled = true; } //Prozentberechnung private void Berechnen_Click(object sender, EventArgs e) { if (Grundwertrd.Checked == true) { double Zinswertz = double.Parse(Zinswerttxt.Text); double Prozentwertz = double.Parse(Prozentsatztxt.Text); Ergebnistxt.Text = string.Format("{0}", Zinswertz * 100 / Prozentwertz); MessageBox.Show("Der Grundwert wurde berechnet"); } if (Zinswertrd.Checked == true) { double Grundwertz = double.Parse(Grundwerttxt.Text); double Prozentsatzz = double.Parse(Prozentsatztxt.Text); Ergebnistxt.Text = string.Format("{0}", Grundwertz / 100 * Prozentsatzz); MessageBox.Show("Der Zinswert wurde berechnet"); } if (Prozentsatzrd.Checked == true) { double Grundwertz = double.Parse(Grundwerttxt.Text); double Zinswertz = double.Parse(Zinswerttxt.Text); Ergebnistxt.Text = string.Format("{0}", Zinswertz * 100 / Grundwertz); MessageBox.Show("Der Prozentsatz wurde berechnet"); } //Restliche Buttons belegen / Zinswert + Prozent Radio Button definieren. } private void button2_Click(object sender, EventArgs e) { Application.Exit(); } private void Zinswertrd_CheckedChanged_1(object sender, EventArgs e) { Grundwerttxt.Enabled = true; Zinswerttxt.Enabled = false; Prozentsatztxt.Enabled = true; } private void Prozentsatzrd_CheckedChanged_1(object sender, EventArgs e) { Grundwerttxt.Enabled = true; Zinswerttxt.Enabled = true; Prozentsatztxt.Enabled = false; } } } Das sollte der gesammte relevante Code sein. Hab versucht mit etwas Textkosmetik aufzuräumen, das hat mir jedoch 2x die Anwendung zerschossen. Sieht in euren Augen mit Sicherheit nicht schön aus, dafür dass es aber mein erstes Win Programm ist bin ich garnicht mal unzufrieden. Bin für jeden Hinweis/Tipp dankbar. Das mit dem Ausblenden hat jetzt z.B geklappt Zitieren
Klotzkopp Geschrieben 31. August 2010 Geschrieben 31. August 2010 Das sieht ziemlich seltsam aus. Warum fügst du deine Radiobuttons in eigenen Funktionen der Controls-Collection hinzu? Sollte das nicht der vom Designer generierte Code machen? Und was in deinem CheckedChanged-Eventhandler passiert, sollte schon irgendwie vom aktuellen Zustand der Radiobuttons abhängen. Bedenke, dass dieser Eventhandler auch aufgerufen wird, wenn sich Checked von true nach false ändert. Und schließlich kannst du dir das == true in deinen if-Anweisungen sparen. RadioButton.Checked ist bereits ein Boolean, der Vergleich mit true ist überflüssig. Zitieren
Fraggla Geschrieben 31. August 2010 Autor Geschrieben 31. August 2010 Hab die Anwendung jetzt nochmal von vorne gebaut, da ich selbst die Übersicht darüber verloren habe und vieles dank try + error drinnen geblieben ist, was so wohl nicht rein gehört. Trotzdem habe ich weiterhin das Problem, dass er das Textfeld nach Klick auf dem Radiobutton nicht sperrt. Er sperrt es erst, nachdem man 1 Zahl im Textfeld eingegeben hat, nicht jedoch sofort. private void txtGrundwert_TextChanged(object sender, EventArgs e) { if (rdGrundwert.Checked) { txtGrundwert.Enabled = false; txtProzentwert.Enabled = true; txtProzentsatz.Enabled = true; ... private void button1_Click(object sender, EventArgs e) { if (rdGrundwert.Checked) { double Prozentwertz = double.Parse(txtProzentwert.Text); double Prozentsatzz = double.Parse(txtProzentsatz.Text); txtErgebnis.Text = string.Format("{0}", Prozentwertz * 100 / Prozentsatzz); } } edit: danke übrigens für euere Hilfe. Wäre ansonsten echt aufgeschmissen Zitieren
Klotzkopp Geschrieben 31. August 2010 Geschrieben 31. August 2010 Trotzdem habe ich weiterhin das Problem, dass er das Textfeld nach Klick auf dem Radiobutton nicht sperrt. Er sperrt es erst, nachdem man 1 Zahl im Textfeld eingegeben hat, nicht jedoch sofort.Du baust die Sperr-Logik in den TextChanged-Eventhandler der Textbox und wunderst dich dann darüber, dass erst dann etwas passiert, wenn du etwas in die Textbox eingibst? Wenn etwas passieren soll, wenn du die Radiobuttons manipulierst, dann solltest du diesen Code auch in einen passenden Eventhandler der Radiobuttons stecken. Zitieren
Fraggla Geschrieben 31. August 2010 Autor Geschrieben 31. August 2010 Grade auch aufgefallen. Sorry bin wohl etwas zu bequem geworden gerade. Ich versuch mich selbst durch das Problem zu prügeln, werd aber Rückmeldung geben sobald sich was ergibt. Sorry nochmal. Zitieren
Fraggla Geschrieben 31. August 2010 Autor Geschrieben 31. August 2010 So habs jetzt komplett überarbeitet und versucht alle Fehlerquellen zu eliminieren: private void rdGrundwert_CheckedChanged(object sender, EventArgs e) { if (rdGrundwert.Checked) { txtGrundwert.Enabled = false; txtProzentwert.Enabled = true; txtProzentsatz.Enabled = true; } } private void rdProzentwert_CheckedChanged(object sender, EventArgs e) { if (rdProzentwert.Checked) { txtGrundwert.Enabled = true; txtProzentwert.Enabled = false; txtProzentsatz.Enabled = true; } } private void rdProzentsatz_CheckedChanged(object sender, EventArgs e) { if (rdProzentsatz.Checked) { txtGrundwert.Enabled = true; txtProzentwert.Enabled = true; txtProzentsatz.Enabled = false; } } private void button1_Click(object sender, EventArgs e) { if (rdGrundwert.Checked) { if (txtProzentwert.Text == "") { MessageBox.Show("Sie müssen einen Prozentwert für diese Berechnung eingeben"); } if (txtProzentsatz.Text == "") { MessageBox.Show("Sie müssen einen Prozentsatz für diese Berechnung eingeben"); } else { double Prozentwertz = double.Parse(txtProzentwert.Text); double Prozentsatzz = double.Parse(txtProzentsatz.Text); txtErgebnis.Text = string.Format("{0}", Prozentwertz * 100 / Prozentsatzz); } } if (rdProzentwert.Checked) { if (txtGrundwert.Text == "") { MessageBox.Show("Sie müssen einen Grundwert für diese Berechnung eingeben"); } if (txtProzentsatz.Text == "") { MessageBox.Show("Sie müssen einen Prozentsatz für diese Berechnung eingeben"); } else { double Grundwertz = double.Parse(txtGrundwert.Text); double Prozentsatzz = double.Parse(txtProzentsatz.Text); txtErgebnis.Text = string.Format("{0}", Grundwertz / 100 * Prozentsatzz); } } if (rdProzentsatz.Checked) { if (txtGrundwert.Text == "") { MessageBox.Show("Sie müssen einen Grundwert für diese Berechnung eingeben"); } if (txtProzentwert.Text == "") { MessageBox.Show("Sie müssen einen Prozentwert für diese Berechnung eingeben"); } else { double Grundwertz = double.Parse(txtGrundwert.Text); double Prozentwertz = double.Parse(txtProzentwert.Text); txtErgebnis.Text = string.Format("{0}", Prozentwertz * 100 / Grundwertz); } } { if (rdGrundwert.Checked != true) { if (rdProzentsatz.Checked != true) { if (rdProzentwert.Checked != true) { MessageBox.Show("Sie müssen eine Berechnung auswählen"); } } } } } private void btnBeenden_Click(object sender, EventArgs e) { Application.Exit(); } private void txtGrundwert_KeyPress(object sender, KeyPressEventArgs e) { if ("1234567890,\b".IndexOf(e.KeyChar.ToString()) < 0) { e.Handled = true; } } private void txtProzentwert_KeyPress(object sender, KeyPressEventArgs e) { if ("1234567890,\b".IndexOf(e.KeyChar.ToString()) < 0) { e.Handled = true; } } private void txtProzentsatz_KeyPress(object sender, KeyPressEventArgs e) { if ("1234567890,\b".IndexOf(e.KeyChar.ToString()) < 0) { e.Handled = true; } } } } Maximal 4stellige Prozentzahlen, Maximal 8stellige Zahlen. Keine negativen Zahlen und keine Buchstaben. Danke nochmal für die Unterstütztung, wäre schön wenn ihr beim Drübersehen noch Anregungen auf eine bessere Lösung geben könntet Zitieren
Klotzkopp Geschrieben 31. August 2010 Geschrieben 31. August 2010 Du kannst deine drei Radiobutton-CheckedChanged-Eventhandler durch einen einzigen ersetzen: private void rd_CheckedChanged(object sender, EventArgs e) { txtGrundwert.Enabled = !rdGrundwert.Checked; txtProzentwert.Enabled = !rdProzentwert.Checked; txtProzentsatz.Enabled = !rdProzentsatz.Checked; }[/code] Die Keypress-Behandlung würde ich weglassen. Sie bringt nichts. Man kann trotzdem noch ungültige Zahlen eingeben. Gültigkeitsprüfung während der Eingabe halte ich persönlich für eine Plage. Zitieren
it_crowd Geschrieben 1. September 2010 Geschrieben 1. September 2010 Hallo Fraggla, also so grob sieht der Code gar nicht so schlecht aus. Ich geb meinem vorredner recht, die KeyPress-Behandlungen kannste alle weglassen. Was mir noch aufgefallen ist, ich würde allein der übersichthalber nicht auf != true abprüfen also if(rdGrundwert.Checked != true) -> if(!rdGrundwert.Checked) aber ist nur ne Empfehlung beeinflusst nicht die richtigkeit deines Programmes. Also zu der Fehlerbehandlung bei der Eingabe würde ich ganz klar zu tryParse greifen. Die Methode funktoniert im Prinzip wie ein normales Parse oder Convert.to, nur das sie einen bool-Wert zurück gibt, ob die konvertierung geklappt hat, auf den du dann abprüfen kannst. Das wären so die Dinge, die mir aufgefallen sind. MFG it_crowd Zitieren
2K1.INC Geschrieben 7. September 2010 Geschrieben 7. September 2010 (bearbeitet) schreib einfach txtErgebnis.Text = (Prozentwertz * 100 / Grundwertz).ToString(); Bearbeitet 7. September 2010 von 2K1.INC Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.