Grafikus C# – Windows Forms tanfolyam › 1.3 lecke

Windows Forms · 1.3 lecke · önálló gyakorlás

Számolás TextBoxokkal – TryParse és hibajelzés

A TextBox tartalma mindig szöveg, akkor is, ha számot írsz bele. Ha számolni akarsz vele, át kell alakítanod számmá, és ellenőrizned kell, hogy a felhasználó tényleg számot írt-e. Ebben a leckében egy összeadó programot készítünk, amely a hibás bevitelre is felkészült.

  • kb. 60 perc
  • kezdő szint
  • számok és TryParse
Anime stílusú fiú és lány egy C# programozási feladatot beszél meg

A lecke végére

  • érted, miért nem lehet a TextBox tartalmával közvetlenül számolni;
  • az int.TryParse() metódussal szövegből egész számot készítesz;
  • érted az out paraméter, a ! és a || szerepét;
  • a return segítségével befejezed az eseménykezelőt hibás bevitelnél;
  • az eredményt a ToString() metódussal visszaalakítod szöveggé;
  • kezeled a tizedes számokat és a nullával osztást.

Mielőtt elkezded

Ehhez a leckéhez kell az 1.2 lecke (TextBox, Click, MessageBox), valamint az if–else és a változók alapjai a C# alapokból. A TryParse a C# alapok adatbekérés leckéjében is szerepelt.

1.2 TextBox, Button, MessageBox →

Adatbekérés C#-ban →

A felület

Tegyél az ablakra három beviteli mezőt és egy gombot:

txtElsoAz első szám beviteli mezője.
txtMasodikA második szám beviteli mezője.
txtEredmenyAz eredmény mezője. A ReadOnly tulajdonsága legyen True: így megjelenik az érték, de a felhasználó nem írhat bele.
btnOsszeadA gomb, a Text: Összeadás.
📷 Képernyőkép helye

Mit tegyél ide: a tervezőnézet a három TextBoxszal és az Összeadás gombbal. A Properties ablakban látszik a txtEredmeny ReadOnly tulajdonsága True értékkel.Javasolt fájlnév: winforms-1-3-felulet.webp · Alt szöveg: Az összeadó program felülete három beviteli mezővel és egy gombbal

Miért nem lehet közvetlenül összeadni?

A txtElso.Text és a txtMasodik.Text string típusú. Két szöveg „összeadása” összefűzést jelent, nem számolást:

Mi történik, ha közvetlenül összeadod?C#
txtEredmeny.Text = txtElso.Text + txtMasodik.Text;

Jósolj!

Az első mezőbe 7-et, a másodikba 9-et írsz. Mi jelenik meg az eredményben?

Jóslat ellenőrzése

79. A két szöveg („7” és „9”) egymás mellé kerül, nem összeadódik. Ahhoz, hogy a 7 + 9 = 16 jöjjön ki, előbb számmá kell alakítani a szövegeket.

Szövegből szám: Parse, Convert és TryParse

Háromféle módon alakíthatsz szöveget számmá:

MódszerHibás bevitelnél (például „alma”)Mikor jó?
int.Parse(szöveg)Futás közbeni hibával leáll a program (FormatException).Ha biztosan számot kapunk.
Convert.ToInt32(szöveg)Ugyanígy hibával áll meg.Ugyanaz, mint a Parse.
int.TryParse(szöveg, out szam)Nem áll meg: false értéket ad vissza.Felhasználói bevitelnél mindig ezt használd.
Form1.csC#
int szam;
bool sikerult = int.TryParse(txtElso.Text, out szam);
int szam;Létrehozunk egy üres egész szám típusú változót.
out szamAz out azt jelenti: a metódus ebbe a változóba teszi az eredményt, ha sikerül az átalakítás.
bool sikerultA TryParse visszatérési értéke: true, ha a szöveg szám volt, false, ha nem.
Mikor false?Üres szövegnél, betűknél, tizedesvesszőnél (egész számnál) és olyan túl nagy számnál, amely már nem fér el az int típusban.

Jósolj!

Mit ad vissza az int.TryParse(), ha a szöveg: 12, -5, 3,5, alma, vagy üres?

Jóslat ellenőrzése

A 12 és a -5 esetén true (a negatív szám is egész szám). A 3,5, az alma és az üres szöveg esetén false, mert ezek nem egész számok.

A teljes eseménykezelő

Két számot kell ellenőriznünk. Ha bármelyik hibás, figyelmeztetünk, és befejezzük az eseménykezelőt:

Form1.csC#
private void btnOsszead_Click(object sender, EventArgs e)
{
int elso;
int masodik;

if (!int.TryParse(txtElso.Text, out elso) || !int.TryParse(txtMasodik.Text, out masodik))
{
MessageBox.Show("Két egész számot adj meg!", "Hibás bevitel", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}

txtEredmeny.Text = (elso + masodik).ToString();
}
!„Nem”: megfordítja az igaz/hamis értéket. !int.TryParse(...) akkor igaz, ha az átalakítás nem sikerült.
||„Vagy”: elég, ha az egyik feltétel igaz. Itt: ha az első vagy a második szám hibás.
return;Kilép az eseménykezelőből: a mögötte lévő sorok már nem futnak le.
(elso + masodik).ToString()A szám szöveggé alakítása, mert a Text tulajdonságba csak szöveg kerülhet.

Miért kell a return?

A C# csak akkor engedi használni az elso és a masodik változót az összeadásnál, ha biztos benne, hogy mindkettő kapott értéket. Ez csak akkor garantált, ha hibás bevitelnél a return kilép az eseménykezelőből. A return nélkül fordítási hibát kapnál (CS0165).

📷 Képernyőkép helye

Mit tegyél ide: két kép egymás mellett. Az egyiken a program az eredménnyel (7 + 9 = 16), a másikon a figyelmeztető ablak „Két egész számot adj meg!” szöveggel, amikor az egyik mezőbe „alma” került.Javasolt fájlnév: winforms-1-3-osszeadas.webp · Alt szöveg: Az összeadó program eredménnyel és a hibás bevitelre figyelmeztető ablakkal

Tizedes számok és osztás

Ha tizedes törteket is szeretnél kezelni (például 3,5), használj double típust és a double.TryParse() metódust. A magyar Windows beállításokkal a tizedesjel általában a vessző, a pont nem működik.

Form1.csC#
private void btnAtlag_Click(object sender, EventArgs e)
{
double a;
double b;

if (!double.TryParse(txtElso.Text, out a) || !double.TryParse(txtMasodik.Text, out b))
{
MessageBox.Show("Hibás szám!");
return;
}

txtEredmeny.Text = ((a + b) / 2).ToString();
}

Nullával nem osztunk

Osztásnál ellenőrizd, hogy a második szám nem nulla. Egész számok osztása nullával futás közben hibát okoz, tizedes számoknál pedig értelmetlen eredményt ad. Erről az önálló feladatok között lesz szó.

Hibakeresés: te vagy a hibadetektív

Mi a baj, és hogyan javítod?

Gondold végig az okot, és csak utána nyisd le a megoldást.

1. Szám a szöveg helyén

txtEredmeny.Text = elso + masodik;
// CS0029: Cannot implicitly convert type 'int' to 'string'
Hiba és javítás

Fordítási hiba (CS0029): a Text szöveget vár, az összeadás eredménye viszont szám. Javítás: (elso + masodik).ToString().

2. Összeomlik az alma szónál

int elso = int.Parse(txtElso.Text);
Hiba és javítás

Futás közbeni hiba (FormatException), ha a felhasználó betűket vagy üres szöveget ír a mezőbe. A Parse nem ellenőriz, hanem leáll. Használd az int.TryParse() metódust, és ellenőrizd az eredményét.

3. Elfelejtett out

int.TryParse(txtElso.Text, elso);
// CS1620: Argument 2 must be passed with the 'out' keyword
Hiba és javítás

Fordítási hiba (CS1620): a második paramétert az out kulcsszóval kell megadni: int.TryParse(txtElso.Text, out elso).

4. Hiányzik a return

if (!int.TryParse(txtElso.Text, out elso) || !int.TryParse(txtMasodik.Text, out masodik))
{
MessageBox.Show("Hibás szám!");
}
txtEredmeny.Text = (elso + masodik).ToString();
// CS0165: Use of unassigned local variable 'masodik'
Hiba és javítás

Fordítási hiba (CS0165): a program hibás bevitelnél is eljutna az összeadásig, ahol a változó még nem biztos, hogy kapott értéket. Tegyél a MessageBox után return; sort.

5. Fordított feltétel

if (int.TryParse(txtElso.Text, out elso) || int.TryParse(txtMasodik.Text, out masodik))
{
MessageBox.Show("Hibás szám!");
return;
}
Hiba és javítás

Rossz működés: a ! jel hiányzik, ezért a figyelmeztetés akkor jelenik meg, amikor a bevitel jó. A hiba ellenőrzéséhez a TryParse eredményét tagadni kell: !int.TryParse(...).

Mini projekt: kétszámos számológép

Bővítsd az összeadó programot négy művelettel, hibaellenőrzéssel:

  1. Tegyél az ablakra négy gombot: btnOsszead, btnKivon, btnSzoroz, btnOszt.
  2. Mindegyik ellenőrizze a két bemenetet double.TryParse() segítségével.
  3. Az osztásnál ellenőrizd, hogy a második szám nem nulla, különben figyelmeztess.
  4. Az eredményt a txtEredmeny mutassa.
📷 Képernyőkép helye

Mit tegyél ide: a kész számológép négy gombbal, két kitöltött beviteli mezővel és az eredménnyel.Javasolt fájlnév: winforms-1-3-szamologep.webp · Alt szöveg: A kétszámos számológép négy művelettel

Három önálló gyakorlófeladat

Egyszerre csak egyet csinálj: tervezd meg, írd meg, futtasd, ellenőrizd, és csak utána nyisd ki a megoldást.

1. Kivonás és szorzás

Készíts kivonó és szorzó gombot, amelyek ugyanúgy ellenőrzik a bemenetet.

Egy lehetséges megoldás
txtEredmeny.Text = (elso - masodik).ToString();
txtEredmeny.Text = (elso * masodik).ToString();

Az ellenőrzés (TryParse és return) mindkét eseménykezelőben ugyanaz, mint az összeadásnál.

2. Osztás nullával

Írd meg az osztást úgy, hogy nullával való osztásnál a program figyelmeztessen.

Egy lehetséges megoldás
if (b == 0)
{
MessageBox.Show("Nullával nem lehet osztani!");
return;
}

txtEredmeny.Text = (a / b).ToString();

3. Átlag tizedes számokkal

Próbáld ki az átlagot tizedes számokkal. Mit tapasztalsz, ha a vesszőt és ha a pontot használod tizedesjelként?

Egy lehetséges megoldás

Magyar Windows beállításoknál a vesszővel írt szám (például 3,5) általában elfogadott, a ponttal írt (3.5) viszont a TryParse szerint hibás szám. A tizedesjelet a számítógép nyelvi beállítása határozza meg.

Gyakorlótár: 6 további feladat

Három szinten gyakorolhatsz: alap, közepes és kihívás. Minden feladathoz két beviteli mező (txtA, txtB), egy gomb és egy lblEredmeny felirat tartozik, hacsak nem írom mást.

Alap szint

1. Két egész szám összege

Írd meg a gomb eseménykezelőjét: adja össze a két egész számot, és ha valamelyik mező nem szám, jelezzen hibát.

Megoldás megnyitása

Az int.TryParse megpróbálja számmá alakítani a szöveget, és megmondja, sikerült-e. Az eredmény az out változóba kerül.

Form1.csC#
private void btnOsszead_Click(object sender, EventArgs e)
{
int a;
int b;

if (!int.TryParse(txtA.Text, out a) || !int.TryParse(txtB.Text, out b))
{
lblEredmeny.Text = "Mindkét mezőbe egész számot írj!";
return;
}

lblEredmeny.Text = $"Az összeg: {a + b}";
}

2. Tizedes szám szorzása

Szorozd össze a két tizedes számot, és két tizedesre kerekítve írd ki az eredményt.

Megoldás megnyitása

A tizedes számokhoz a double.TryParse kell. A magyar nyelvű Windowson a tizedesjel a vessző (2,5). A Math.Round(érték, 2) két tizedesre kerekít.

Form1.csC#
private void btnSzoroz_Click(object sender, EventArgs e)
{
double a;
double b;

if (!double.TryParse(txtA.Text, out a) || !double.TryParse(txtB.Text, out b))
{
lblEredmeny.Text = "Számot írj be (tizedesvesszővel)!";
return;
}

lblEredmeny.Text = "A szorzat: " + Math.Round(a * b, 2);
}

Közepes szint

3. Négy művelet, nullával osztás

Készíts négy gombot (+, -, *, /), amelyek ugyanazt a beolvasó metódust használják. Nullával osztáskor jelezzen hibát.

Megoldás megnyitása

A beolvasást külön, bool visszatérésű metódusba tesszük, amely két out paraméterben adja vissza a számokat. Így a négy eseménykezelő rövid marad.

Form1.csC#
private bool SzamokBeolvasasa(out double a, out double b)
{
a = 0;
b = 0;

if (double.TryParse(txtA.Text, out a) && double.TryParse(txtB.Text, out b))
{
return true;
}

lblEredmeny.Text = "Mindkét mezőbe számot írj!";
return false;
}

private void btnPlusz_Click(object sender, EventArgs e)
{
double a;
double b;

if (SzamokBeolvasasa(out a, out b))
{
lblEredmeny.Text = "Eredmény: " + (a + b);
}
}

private void btnOszt_Click(object sender, EventArgs e)
{
double a;
double b;

if (!SzamokBeolvasasa(out a, out b))
{
return;
}

if (b == 0)
{
lblEredmeny.Text = "Nullával nem lehet osztani!";
return;
}

lblEredmeny.Text = "Eredmény: " + (a / b);
}

4. Három szám átlaga

Három mezőből (txtA, txtB, txtC) számold ki az átlagot, két tizedesre kerekítve.

Megoldás megnyitása

A három beolvasást egy feltételben ellenőrizzük, az átlag pedig az összeg osztva hárommal.

Form1.csC#
private void btnAtlag_Click(object sender, EventArgs e)
{
double a;
double b;
double c;

if (!double.TryParse(txtA.Text, out a) || !double.TryParse(txtB.Text, out b) || !double.TryParse(txtC.Text, out c))
{
lblEredmeny.Text = "Mindhárom mezőbe számot írj!";
return;
}

lblEredmeny.Text = "Az átlag: " + Math.Round((a + b + c) / 3, 2);
}

Kihívás szint

5. Négyzetgyök

Egy mezőből olvass be számot, és írd ki a négyzetgyökét két tizedesre. Negatív számnál jelezz hibát.

Megoldás megnyitása

A Math.Sqrt a négyzetgyököt számolja. Negatív számra nem értelmezett (az eredmény NaN lenne), ezért előbb ellenőrizzük.

Form1.csC#
private void btnGyok_Click(object sender, EventArgs e)
{
double szam;

if (!double.TryParse(txtA.Text, out szam))
{
lblEredmeny.Text = "Számot írj be!";
return;
}

if (szam < 0)
{
lblEredmeny.Text = "Negatív számnak nincs valós négyzetgyöke.";
return;
}

lblEredmeny.Text = "Négyzetgyök: " + Math.Round(Math.Sqrt(szam), 2);
}

6. Hőmérséklet-átváltó

Két gombbal váltsd át a Celsius-fokot Fahrenheitre (F = C × 9 / 5 + 32), illetve vissza.

Megoldás megnyitása

A visszaváltás képlete: C = (F − 32) × 5 / 9. A mezőt mindkét gomb közösen használja.

Form1.csC#
private void btnCF_Click(object sender, EventArgs e)
{
double c;

if (!double.TryParse(txtA.Text, out c))
{
lblEredmeny.Text = "Számot írj be!";
return;
}

lblEredmeny.Text = $"{c} °C = {Math.Round(c * 9 / 5 + 32, 1)} °F";
}

private void btnFC_Click(object sender, EventArgs e)
{
double f;

if (!double.TryParse(txtA.Text, out f))
{
lblEredmeny.Text = "Számot írj be!";
return;
}

lblEredmeny.Text = $"{f} °F = {Math.Round((f - 32) * 5 / 9, 1)} °C";
}

Gyors önellenőrzés

Válaszolj fejben, és csak utána nyisd le a választ.

1. Milyen típusú a txtElso.Text?

string (szöveg), akkor is, ha számot írtak bele.

2. Miért biztonságosabb a TryParse, mint a Parse?

Mert hibás bevitelnél nem áll le a program, hanem false értéket ad vissza, amelyet ellenőrizhetünk.

3. Mit jelent az out kulcsszó?

A metódus az eredményt ebbe a változóba teszi.

4. Mit jelent a ! és a || ?

A ! a „nem”, a || a „vagy” logikai művelet.

5. Mit csinál a return az eseménykezelőben?

Kilép az eseménykezelőből, a mögötte lévő sorok nem futnak le.

6. Miért kell a ToString() az eredményhez?

Mert a TextBox Text tulajdonsága csak szöveget fogad el, a számot előbb szöveggé kell alakítani.

Mit tudsz már?

  • Érted, miért szöveg a TextBox tartalma.
  • Használod az int.TryParse() és a double.TryParse() metódust.
  • Érted az out, a ! és a || szerepét.
  • A return segítségével befejezed az eseménykezelőt hibás bevitelnél.
  • Kezeled a nullával osztást.

Következő lecke: CheckBox és RadioButton

Eddig beírt adatot dolgoztunk fel. A következő leckében a felhasználó kiválaszthat lehetőségeket jelölőnégyzettel és választógombbal.