Hi, ich lerne aktuell wieder etwas C# und dachte mir ich mache mir einen etwas besseren taschenrechner als mein letzter. also wollte ich nur 1 textfelt machen das gesteuert wird von der tastatur 0 - 9 nummern und * - + / ich bin dabei leider jetzt auf einen Fehler gestoßen den ich nicht verstehe, kann mir bitte jemand sagen wieso das nicht geht und wie ich das problem lösen kann?
bitte nichts weiteres spoilern, ich will alles andere gerne alleine machen 😄
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Better_Calculator
{
public partial class Form1 : Form
{
public int number1; //check
public string divisor; //check
public int number2;
public int countspaces; //check
public int result;
public Form1()
{
InitializeComponent();
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
char choice = 'a';
switch (choice)
{
case '+':
number1 = Convert.ToInt32(textBox1.Text);
divisor = "+";
break;
case '-':
number1 = Convert.ToInt32(textBox1.Text);
divisor = "-";
break;
case ':':
number1 = Convert.ToInt32(textBox1.Text);
divisor = ":";
break;
case '*':
number1 = Convert.ToInt32(textBox1.Text);
divisor = "*";
break;
}
}
private void button1_Click(object sender, EventArgs e)
{
spacecounting();
textBox1.Text = textBox1.Text.Remove(0, countspaces);
//irgendetwas passiert mit dem Textbox1.text so das es nicht das gleiche resultat ergibt
//Program cannot convert the String into a int for some reason
number2 = Convert.ToInt32(textBox1.Text);
textBox1.Clear();
//Inform yourself howw to replace the divisor with a variable
result = number1 + number2;
textBox1.Text = "Result: " + result;
}
public void spacecounting()
{
foreach (char av in textBox1.Text)
{
countspaces++;
}
}
}
}
Ich bin neu hier, und deshalb etwas unerfahren wenn du hilfreiche Tipps bezüglich dem lernen von C# hast lass sie mich wissen !
Bitte Code Tags verwenden. Niemand hat Lust auf Plaintext-Code.
[Hinweis] Wie poste ich richtig? Punkt 6
Convert.ToInt32(textBox1.Text)
kann nur funktioneren, wenn in der TextBox auch nen Int ist.
Das kann man aber alles prinzipiell debuggen:
[Artikel] Debugger: Wie verwende ich den von Visual Studio?
Für mich ist es ein Rätsel, was Du mit Spacecounting und dem Remove erreichen willst.
Die Methode macht alles - aber kein Space"counting". Sie erhöht einfach nur die Variable um die Länge der Eingabe. Spätestens bei der zweiten Eingabe muss das dermaßen knallen, dass die Korken fliegen.
Bezweifle, dass danach das in der Textbox steht, was drin stehen soll. Aber auch das siehst mit dem Debugger.
PS: Besser TryParse-Methoden (zB Int32.TryParse) statt die Convert-Methoden verwenden, wenn der Inhalt nicht garantiert von einem jeweiligen Datentypen ist.
Stichwort: defensive Programmierung.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Das Programm funktioniert, es zeigt mir beim Convertieren nur ein fehler ZEICHEN an und keine deutliche andeutung wo der Fehler liegt, ich habe aber eine relativ gute idee was ich machen kann um es zu fixen da ich es davor zum laufen brachte und jetzt nach umschreiben des codes die funktion selbst nichtmehr funktioniert ... naja egal dachte hier hat jemand evtl. ein leichten lösungsweg der sauberer ist
Ich bin neu hier, und deshalb etwas unerfahren wenn du hilfreiche Tipps bezüglich dem lernen von C# hast lass sie mich wissen !
Hallo,
was wohl gemeint ist, daß das Käse ist:
public void spacecounting()
{
foreach (char av in textBox1.Text)
{
countspaces++;
}
}
denn er berechnet keine spaces sondern nur die Textlänge.
Wenn ich mir das ansehe:
textBox1.Text = textBox1.Text.Remove(0, countspaces);
weiß ich sofort, daß du einfach nur die Leerzeichen entfernen möchtest, das geht einfacher:
String.Replace
Somit könntest dir auch die Methode spacecounting
sparen.
Die Eventmethode textBox1_KeyPress
ist auch ein Stinkekäse, denn da wird immer mit dem char
a geswitcht. Zudem bleibt in der Methode alles in der textBox1.Text
drinnen stehen oder?
Z.Bsp.: 5 + 3
Das dann bei button1_Click
in eine Nummer zu konvertieren geht natürlich nicht.
Grüße
Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄
Wenn ich mir das ansehe:
textBox1.Text = textBox1.Text.Remove(0, countspaces);
weiß ich sofort, daß du einfach nur die Leerzeichen entfernen möchtest
Nur, dass es einfach den kompletten String löscht.
countspaces
ist hier die Länge des Strings (zumindest beim ersten Durchlauf).
Remove löscht damit von Position 0 bis countspaces
alle Zeichen - und damit den gesamten String.
Im zweiten Durchlauf ist countspaces
nicht die Länge des Strings der Textbox aus dem zweiten Durchlauf - sondern die Länge aus dem aktuellen wie auch alle vorherigen Durchläufen.
countspaces
wird nirgends zurück gesetzt.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Ich hätte das evtl erklären sollen, also die idee dahinter ist
numer1 wird eingegeben, danach wird der divisor eingegeben, bevor der divisor theoretisch in die dafür vorgesehene variable gespeichert wird wird die erste nummer gespeichert nach dem druck von "+ - : *" in dem beispiel divisor gennant wird jede vom nutzer geschriebene stelle mit "countspaces" funktion gezählt also ja da werden alle bis dahin eingegebenen stellen gezählt und dann auch später gelöscht, und dannach gibt der nutzer eine neue nummer ein die nummer2 die dann mit dem click auf zeige ergebnis oder hier result in int32 convertiert werden soll und in number2 gespeichert werden soll
Ich bin neu hier, und deshalb etwas unerfahren wenn du hilfreiche Tipps bezüglich dem lernen von C# hast lass sie mich wissen !
Bessere erklärung wie mein Programm funktioniert:
!WARNING! Alle Namen der Variablen vergessen, Sie haben absolut nichts zu bedeuten !WARNING!
In diesem Programm wird später nur 0 - 9 und (- + : *) eines dieser zeichen eintippbar sein, nichts anderes, auch keine leertaste.
public int number1;
public string divisor;
public int number2;
// Hier erstelle ich eine Variable die später gefüllt wird mit der anzahl an getipten nummern UND das zeichen zb. 44566+ (6)
public int countspaces; //check
public int result;
I only show now one of the codes because the rest is irrelevant for what I am asking
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
char choice = 'a';
switch (choice)
{
case '+':
number1 = Convert.ToInt32(textBox1.Text);
divisor = "+";
break;
}
}
my friend called me his bird died, I complete this later
Ich bin neu hier, und deshalb etwas unerfahren wenn du hilfreiche Tipps bezüglich dem lernen von C# hast lass sie mich wissen !
🤔 🤔
Also space ist dann der falsche Ausdruck zu dem Sinn hier und die Spaghettischreibweise ist schwer zu lesen, tut mir leid 😉
textBox1.Text = textBox1.Text.Remove(0, countspaces);
countofspaces
wird nie zurückgesetzt, was bedeuted, daß hier irgendwann mal eine Exception geworfen wird.
Wie schon gesagt, am Ende wirst du einen Leerstring in einen int
konvertieren, was ebenfalls scheitert.
Zeig mal den aktuellen Code...
Grüße
Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄
habe es zum laufen gebracht, danke nochmal an alle die geposted haben -
Ich bin neu hier, und deshalb etwas unerfahren wenn du hilfreiche Tipps bezüglich dem lernen von C# hast lass sie mich wissen !