Permalänk

Nybörjarfråga, C#, TryParse()

Håller på och meckar med ett trivialt multiplikationsprogram för att kunna lära mig hur man loopar etc.
Tanken är att användaren ska fylla i 3 textboxes med siffror.
För att programmet inte ska krascha vid fel inmatning försöker använder jag mig av TryParse.

Jag använder en if-sats och programmet ska liksom skicka ut ett meddelande via MessageBox.Show()
om och bara om något är fel, annars fortsätter allting som vanligt. Men det funkar ändå inte som det ska...

Jag leker med Windows Forms i Visual Studio Express.

namespace Loop2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int answer = 0; int loopStart; int loopEnd; loopStart = int.Parse(textBox1.Text); loopEnd = int.Parse(textBox2.Text); int multiplyBy = int.Parse(textBox3.Text); listBox1.Items.Clear(); int outputValue = 0; bool tryToConvert = int.TryParse(textBox1.Text, out outputValue); if (tryToConvert == false) { MessageBox.Show("Your not writing a number!"); } else { for (int i = loopStart; i <= loopEnd; i += 1) { answer = multiplyBy * i; listBox1.Items.Add(i + " times " + multiplyBy + " = " + answer.ToString()); } } } } }

För övrigt fungerar programmet som det ska om man tar bort kodraderna som har med TryParse() att göra.

Permalänk
Medlem

Testade lite snabbt.
Vet inte vad som är problemet, beskrivs inte direkt?

Ett fel dock får jag om rutorna är tomma, dvs textbox1-textbox3.
Är följande rader som orsakar problem.
Kolla först så : if (!textBox1.Text.Equals(String.Emptry))

loopStart = int.Parse(textBox1.Text);
loopEnd = int.Parse(textBox2.Text);
int multiplyBy = int.Parse(textBox3.Text);

EDIT:
Okej förstod felet nu.
Du måste även köra TryParse på de rader jag visar ovan, därför det krashar.

Visa signatur

| Windows 10 64-bit Pro | Asus 24" LED VG248QE 144HZ (2st) | EVGA GeForce GTX 780 3GB PhysX CUDA | Intel Core i5-4670K | MSI Z87-G45 Gaming, Socket-1150 | Corsair SSD Force Series GS 240GB 2.5" | Fractal Design Define R4 Black Pearl | Crucial DDR3 BallistiX Tactical 16GB 1600MHz CL9 2x8GB | Cooler Master V850 850W PSU | ASUS Xonar DGX | Noctua NH-U14S CPU Kylare | CM Storm QuickFire TK Keyboard Brown | Ace Laser Gaming Mouse EDGE 3200 | QPAD XXXL |

Permalänk
Medlem

Jag är inte superinsatt i C# men har några kommentarer och funderingar ändå:

Vad är det som inte fungerar? Är det så att du alltid får meddelandet "Your not writing a number!" eller är det något annat som händer? Du kan ju sätta en breakpoint på raden med TryParse så programmet stannar på den raden. Då kan du titta vad textBox1.Text har för värde. Du kan även stega dig fram och se vad outputValue samt tryToConvert får för värden.

Sedan undrar jag varför högre upp så använder du int.Parse() medans längre ner så använder du int.TryParse(). Om någon matar in bokstäver istället för siffror så kommer programmet troligtvis få exception högre upp i int.Parse() där du sätter loopStart, loopEnd eller multiplyBy.

Borde inte förresten outputValue och loopStart få samma värden eftersom båda försöker parsas om från textBox1.Text till int. Då kan du ju istället bara sätta outputValue = loopStart;

Permalänk
Medlem
Visa signatur

AW3423DW QD-OLED - Ryzen 5800x - MSI Gaming Trio X 3090 - 64GB 3600@cl16 - Samsung 980 Pro 2TB/WD Black SN850 2TB

Permalänk

Är som sagt nybörjare Det är 2:a veckan ungefär

Ska prova med era förslag...

Permalänk
Medlem
Skrivet av DiAMONDBACK:

För övrigt fungerar programmet som det ska om man tar bort kodraderna som har med TryParse() att göra.

vad är det som inte fungerar som det ska? är det så att programmet kraschar för dig?

loopStart = int.Parse(textBox1.Text); loopEnd = int.Parse(textBox2.Text); int multiplyBy = int.Parse(textBox3.Text);

Om du misslyckas med parsningen, dvs att du försöker parsa en sträng som inte kan konverteras till en integer så kommer Parse funktionen att slänga ett fel. Eftersom du inte tar hand om det felet kommer ditt program att krascha.

du kan som du gör senare i koden använda tryparse för att automatiskt fånga alla fel och returnera en bool som indikerar ifall blev ett fel (vilket som helst) eller inte.

http://www.csharp-station.com/Tutorial/CSharp/lesson15

Visa signatur

| Ryzen 5800x | Asus prime x470 pro | Asus rtx 3080 tuf oc | Gskill 32gb 3,6ghz | aw3225qf |

Permalänk
Skrivet av Ragin Pig:

vad är det som inte fungerar som det ska? är det så att programmet kraschar för dig?

loopStart = int.Parse(textBox1.Text); loopEnd = int.Parse(textBox2.Text); int multiplyBy = int.Parse(textBox3.Text);

Om du misslyckas med parsningen, dvs att du försöker parsa en sträng som inte kan konverteras till en integer så kommer Parse funktionen att slänga ett fel. Eftersom du inte tar hand om det felet kommer ditt program att krascha.

du kan som du gör senare i koden använda tryparse för att automatiskt fånga alla fel och returnera en bool som indikerar ifall blev ett fel (vilket som helst) eller inte.

http://www.csharp-station.com/Tutorial/CSharp/lesson15

Jag kikar på din länk sen! En sak i taget

Det som INTE fungerar är att om jag skriver in en sträng eller ett decimal i textBox1 så ska ett meddelande dyka upp som meddelar
att användare har skrivit fel.

int outputValue; bool tryToConvert = int.TryParse(textBox1.Text, out outputValue); if (tryToConvert == false) { MessageBox.Show("Your not writing a number!"); } else { for (int i = loopStart; i <= loopEnd; i += 1) { int answer = multiplyBy * i; listBox1.Items.Add(i + " times " + multiplyBy + " = " + answer.ToString()); } }

För övrigt finns hela programet i det första inlägget.

Permalänk
Medlem
Skrivet av DiAMONDBACK:

Jag kikar på din länk sen! En sak i taget

Det som INTE fungerar är att om jag skriver in en sträng eller ett decimal i textBox1 så ska ett meddelande dyka upp som meddelar
att användare har skrivit fel.

loopStart = int.Parse(textBox1.Text);

bool tryToConvert = int.TryParse(textBox1.Text, out outputValue);

Notera att du här försöker konvertera text strängen från samma textbox.

Visa signatur

| Ryzen 5800x | Asus prime x470 pro | Asus rtx 3080 tuf oc | Gskill 32gb 3,6ghz | aw3225qf |

Permalänk

[QUOTE=Ragin Pig;14626823]

loopStart = int.Parse(textBox1.Text);

bool tryToConvert = int.TryParse(textBox1.Text, out outputValue);

Notera att du här försöker konvertera text strängen från samma textbox.[/QUOTE]

Tack! Upptäckte felet

Fungerade med:

int loopStart; bool tryToConvert = int.TryParse(textBox1.Text, out loopStart);

Och raderade följande lite högre upp:

loopStart = int.Parse(textBox1.Text);