Grafikus C# – Windows Forms tanfolyam › 1.3 lecke Windows Forms · 1.3 lecke · önálló gyakorlá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.Számolás TextBoxokkal – TryParse és hibajelzés

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
outparaméter, a!és a||szerepét; - a
returnsegí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.
A felület
Tegyél az ablakra három beviteli mezőt és egy gombot:
ReadOnly tulajdonsága legyen True: így megjelenik az érték, de a felhasználó nem írhat bele.Text: Összeadás.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:
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ódszer | Hibá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. |
int szam;
bool sikerult = int.TryParse(txtElso.Text, out szam);out azt jelenti: a metódus ebbe a változóba teszi az eredményt, ha sikerül az átalakítás.TryParse visszatérési értéke: true, ha a szöveg szám volt, false, ha nem.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:
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();
}!int.TryParse(...) akkor igaz, ha az átalakítás nem sikerült.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).
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.
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' keywordHiba é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:
- Tegyél az ablakra négy gombot:
btnOsszead,btnKivon,btnSzoroz,btnOszt. - Mindegyik ellenőrizze a két bemenetet
double.TryParse()segítségével. - Az osztásnál ellenőrizd, hogy a második szám nem nulla, különben figyelmeztess.
- Az eredményt a
txtEredmenymutassa.
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. Az ellenőrzés (Egy lehetséges megoldás
txtEredmeny.Text = (elso - masodik).ToString();
txtEredmeny.Text = (elso * masodik).ToString();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? 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 Egy lehetséges megoldás
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. Az Megoldás megnyitása
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.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. A tizedes számokhoz a Megoldás megnyitása
double.TryParse kell. A magyar nyelvű Windowson a tizedesjel a vessző (2,5). A Math.Round(érték, 2) két tizedesre kerekít.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 ( A beolvasást külön, +, -, *, /), amelyek ugyanazt a beolvasó metódust használják. Nullával osztáskor jelezzen hibát.Megoldás megnyitása
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.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 ( A három beolvasást egy feltételben ellenőrizzük, az átlag pedig az összeg osztva hárommal.txtA, txtB, txtC) számold ki az átlagot, két tizedesre kerekítve.Megoldás megnyitása
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. A Megoldás megnyitása
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.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 ( A visszaváltás képlete: F = C × 9 / 5 + 32), illetve vissza.Megoldás megnyitása
C = (F − 32) × 5 / 9. A mezőt mindkét gomb közösen használja.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. Mert hibás bevitelnél nem áll le a program, hanem A metódus az eredményt ebbe a változóba teszi. A Kilép az eseménykezelőből, a mögötte lévő sorok nem futnak le. Mert a TextBox Text tulajdonsága csak szöveget fogad el, a számot előbb szöveggé kell alakítani.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?
false értéket ad vissza, amelyet ellenőrizhetünk.3. Mit jelent az out kulcsszó?
4. Mit jelent a ! és a || ?
! a „nem”, a || a „vagy” logikai művelet.5. Mit csinál a return az eseménykezelőben?
6. Miért kell a ToString() az eredményhez?
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.




