Grafikus C# – Windows Forms tanfolyam › 1.9 lecke Windows Forms · 1.9 lecke Az adatbekérés nem csak szövegmezőből áll. A jelszó rejtve legyen, a telefonszám megadott formátumban érkezzen, az életkor pedig csak szám lehessen. Ebben a leckében a három legfontosabb beviteli vezérlő beállításait nézzük meg, és egy regisztrációs űrlapban használjuk őket együtt.TextBox, MaskedTextBox és NumericUpDown részletesen

A lecke végére
- a
TextBoxfontos tulajdonságait használod (MaxLength,CharacterCasing,ReadOnly,Multiline); - jelszómezőt készítesz (
UseSystemPasswordChar); - a
MaskedTextBoxmaszkjával megadott formátumú adatot kérsz be, és ellenőrzöd aMaskCompletedtulajdonsággal; - a
NumericUpDownsegítségével számot kérsz be, és adecimalértéket egész számmá alakítod; - regisztrációs űrlapot készítesz ellenőrzéssel;
- felismered az új vezérlők tipikus hibáit.
Mielőtt elkezded
Ehhez a leckéhez kell az 1.8 lecke, az 1.2 lecke (TextBox és MessageBox) és az 1.3 lecke (szám és szöveg, TryParse).
A TextBox beállításai
A TextBoxnak sokkal több tulajdonsága van, mint a Text. A legfontosabbak a Properties ablakban állíthatók be:
0 azt jelenti, hogy nincs korlát.Normal, Upper (csupa nagybetű), Lower (csupa kisbetű).True, a szöveg látszik és másolható, de a felhasználó nem írhat bele.False, a mező szürke, és nem használható.True, többsoros szöveg írható bele (Enterrel), és a mező magassága is állítható.Vertical, Horizontal, Both.Kódból is beállítható
Minden tulajdonság kódban is megadható, például: txtVaros.CharacterCasing = CharacterCasing.Upper; Az Upper egy felsorolás (enum) eleme, ugyanúgy, mint a FontStyle.Bold.
Jósolj!
A txtKod mező MaxLength értéke 5, a CharacterCasing értéke Upper. Mi lesz a mező tartalma, ha ezt gépeled: abcdefgh?
Jóslat ellenőrzése
Az ABCDE. A mező csak 5 karaktert fogad el, és mindegyiket nagybetűssé alakítja.
Jelszómező és többsoros mező
A jelszót nem szabad kiírni a képernyőre. Állítsd a UseSystemPasswordChar tulajdonságot True-ra: ekkor a beírt karakterek helyén pontok jelennek meg, de a Text tulajdonság továbbra is a valódi jelszót tartalmazza. (Választhatsz saját jelet is a PasswordChar tulajdonságban, például a csillagot.)
Egy „Jelszó megjelenítése” jelölőnégyzet így készül:
private void chkMutat_CheckedChanged(object sender, EventArgs e)
{
txtJelszo.UseSystemPasswordChar = !chkMutat.Checked;
}Többsoros mezőnél (Multiline: True) a szöveg sorokból áll. Hozzáfűzni az AppendText() metódussal lehet, sortörést az Environment.NewLine ad:
txtNaplo.AppendText("Új bejegyzés" + Environment.NewLine);Jósolj!
A jelszómezőbe azt írod, hogy titok123. Mit ad vissza a txtJelszo.Text?
Jóslat ellenőrzése
A valódi szöveget: titok123. A pontok csak a megjelenítésben vannak, a program a teljes jelszót látja.
Mit tegyél ide: egy jelszómező beírt jelszóval (pontok látszanak), mellette a Jelszó megjelenítése jelölőnégyzet, majd ugyanaz bepipálva (a jelszó olvasható).Javasolt fájlnév: winforms-1-9-jelszo.webp · Alt szöveg: A jelszómező rejtett és megjelenített állapotban
MaskedTextBox: megadott formátumú bevitel
A MaskedTextBox olyan beviteli mező, amelybe csak a megadott mintának (maszknak) megfelelő szöveg írható. Ideális telefonszámhoz, irányítószámhoz vagy dátumhoz. A maszkot a Mask tulajdonságban adhatod meg:
| Maszkkarakter | Jelentése |
|---|---|
0 | Kötelező számjegy (0–9). |
9 | Elhagyható számjegy vagy szóköz. |
L | Kötelező betű. |
? | Elhagyható betű. |
A | Kötelező betű vagy számjegy. |
| bármi más | Fix jel, amely a mezőben mindig látszik (például kötőjel, zárójel). |
(00) 000-0000. A felhasználó csak a számjegyeket gépeli be, a zárójelek és a kötőjel készen vannak.0000.00.00. Az év, hónap és nap számjegyei kötelezők.0000. Pontosan négy számjegyet kér._ aláhúzás).Két tulajdonságot külön ismerned kell:
(__) ___-____), ezért a Text.Length == 0 sosem igaz.if (!mtxTelefon.MaskCompleted)
{
MessageBox.Show("Add meg a teljes telefonszámot!");
}
else
{
MessageBox.Show("Telefonszám: " + mtxTelefon.Text);
}Csak a számjegyek kellenek?
Ha a fix jelek nélkül csak a beírt számjegyeket szeretnéd megkapni, állítsd a TextMaskFormat tulajdonságot ExcludePromptAndLiterals értékre. Ekkor a Text csak a felhasználó által beírt karaktereket adja vissza.
Jósolj!
A maszk (00) 000-0000, és a felhasználó csak a „20” számjegyet írja be. Mit ad a MaskCompleted? Működik a Text.Length == 0 ellenőrzés az üres mezőre?
Jóslat ellenőrzése
A MaskCompleted értéke false, mert még hiányzik a többi kötelező számjegy. A Text.Length == 0 viszont akkor sem igaz, ha a mező üres, mert a fix jelek (zárójel, kötőjel) és az aláhúzások mindig ott vannak a szövegben. Az ellenőrzéshez tehát a MaskCompleted kell.
Mit tegyél ide: a Properties ablak egy MaskedTextBox elemmel, a Mask tulajdonságban (00) 000-0000 értékkel, és mellette a futó mező, amelyben „(20) 123-4567” látszik.Javasolt fájlnév: winforms-1-9-maskedtextbox.webp · Alt szöveg: A MaskedTextBox telefonszám maszkkal
NumericUpDown: számbevitel nyilakkal
A NumericUpDown olyan számmező, amelybe csak szám írható, és nyilakkal is állítható. Nem kell TryParse, mert a vezérlő már csak számot enged. A legfontosabb tulajdonságai:
decimal, vagyis tizedes szám.A Value típusa decimal, ezért ha egész számként (int) szeretnéd használni, típuskényszerítést (cast) kell használnod: a zárójelben megadott céltípus átalakítja az értéket:
int kor = (int)nudKor.Value;
MessageBox.Show($"Életkor: {kor}");decimal értéket egész számmá alakítja (a tizedesjegyeket levágja).A Value nem lépheti át a határokat
Ha kódból a Minimum alatti vagy a Maximum feletti értéket adsz a Value tulajdonságnak, a program futás közben hibával áll meg. Például nudKor.Value = 150; 0–120 között.
Jósolj!
A nudMennyiseg értéke 3, a DecimalPlaces értéke 0. Az árat egy decimal egysegar = 250; változó tárolja. Mennyi az egysegar * nudMennyiseg.Value?
Jóslat ellenőrzése
750. Két decimal szorzata is decimal, ezért nem kell átalakítás, és az eredmény közvetlenül kiírható.
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. Decimal az int helyén
int kor = nudKor.Value;
// CS0266: Cannot implicitly convert type 'decimal' to 'int'Hiba és javítás
Fordítási hiba (CS0266): a Value típusa decimal, és a C# nem alakítja át magától egész számmá, mert a tizedesjegyek elveszhetnek. Kérd az átalakítást: int kor = (int)nudKor.Value;
2. Az üres telefonszám nem üres
if (mtxTelefon.Text.Length == 0)
{
MessageBox.Show("Add meg a telefonszámot!");
}Hiba és javítás
Rossz működés: a MaskedTextBox szövege a fix jeleket és az aláhúzásokat is tartalmazza, ezért a hossza sosem 0. Használd a MaskCompleted tulajdonságot: if (!mtxTelefon.MaskCompleted).
3. Látszik a jelszó
A jelszómezőbe írt karakterek olvashatók a képernyőn. A Ok és javítás
UseSystemPasswordChar (vagy a PasswordChar) tulajdonság nincs beállítva. Állítsd True-ra a Properties ablakban. A chkMutat eseménykezelő csak akkor mutathatja a jelszót, ha a négyzet be van pipálva.
4. A Value túllépi a határt
nudKor.Value = 150;
// a Maximum értéke 120Hiba és javítás
Futás közbeni hiba (ArgumentOutOfRangeException): a Value nem lehet nagyobb a Maximum értéknél. Állíts be megfelelő határt, vagy kisebb értéket.
5. Nem lehet betűt beírni a mezőbe
A MaskedTextBoxba nem tudsz betűt gépelni, és a gép sípol. Ez nem hiba, ez a maszk dolga: a Ok és javítás
0 kötelező számjegyet jelent, ezért a betűt a mező visszautasítja. Ha betűket is szeretnél engedni, használd az L vagy az A maszkkaraktert.
Mini projekt: regisztrációs űrlap
Készíts regisztrációs űrlapot a három új vezérlővel:
TextBox, MaxLength: 40).UseSystemPasswordChar: True) és a megjelenítő jelölőnégyzet.Mask: (00) 000-0000).Minimum: 0, Maximum: 120, Value: 18).Multiline: True, ScrollBars: Vertical).Regisztráció gomb.private void btnRegisztral_Click(object sender, EventArgs e)
{
string nev = txtNev.Text.Trim();
string jelszo = txtJelszo.Text;
if (nev.Length == 0)
{
MessageBox.Show("Add meg a neved!");
}
else if (jelszo.Length < 6)
{
MessageBox.Show("A jelszó legalább 6 karakter legyen!");
}
else if (!mtxTelefon.MaskCompleted)
{
MessageBox.Show("Add meg a teljes telefonszámot!");
}
else
{
int kor = (int)nudKor.Value;
MessageBox.Show($"Sikeres regisztráció!{Environment.NewLine}Név: {nev}{Environment.NewLine}Telefon: {mtxTelefon.Text}{Environment.NewLine}Életkor: {kor}");
}
}decimal érték átalakítva egész számmá.Mit tegyél ide: a kész regisztrációs űrlap kitöltve (név, rejtett jelszó, telefonszám a maszkban, életkor, megjegyzés), és mellette a „Sikeres regisztráció!” üzenet.Javasolt fájlnév: winforms-1-9-regisztracio.webp · Alt szöveg: A kész regisztrációs űrlap kitöltve és a sikeres regisztráció üzenete
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. Számláló a megjegyzéshez
A többsoros megjegyzésmező alatt egy lblMegjegyzes felirat mutassa, hány karaktert írtál be (legfeljebb 200).Egy lehetséges megoldás
// txtMegjegyzes.MaxLength = 200 a tervezőben
private void txtMegjegyzes_TextChanged(object sender, EventArgs e)
{
lblMegjegyzes.Text = $"{txtMegjegyzes.Text.Length} / 200";
}
2. Árkalkulátor
Egy nudMennyiseg mezővel és egy 250 Ft-os egységárral számold ki a végösszeget, és írd ki egy lblOsszeg feliratra.Egy lehetséges megoldás
private void nudMennyiseg_ValueChanged(object sender, EventArgs e)
{
decimal egysegar = 250;
decimal osszeg = egysegar * nudMennyiseg.Value;
lblOsszeg.Text = $"Végösszeg: {osszeg} Ft";
}
3. Nagybetűs irányítószám és város
Tegyél az űrlapra egy Az mtxIranyitoszam mezőt (maszk: 0000) és egy txtVaros mezőt, amely automatikusan csupa nagybetűs.Egy lehetséges megoldás
mtxIranyitoszam Mask tulajdonsága legyen 0000. A txtVaros CharacterCasing tulajdonsága legyen Upper. Kódot nem kell írni, mindkettő a Properties ablakban beállítható.
Gyakorlótár: 6 további feladat
Három szinten gyakorolhatsz: alap, közepes és kihívás. Építsd meg a felületet, próbáld ki, és csak utána nyisd le a megoldást.
Alap szint
1. Életkor kijelzése
Egy A nudKor NumericUpDown (Minimum: 0, Maximum: 120) és egy gomb alapján a lblEredmeny írja ki: 16 éves vagy.Megoldás megnyitása
Value tulajdonság típusa decimal. Egész számmá az (int) átalakítással tehetjük. A DecimalPlaces tulajdonságot állítsd 0-ra, hogy ne jelenjen meg tizedes.private void btnKor_Click(object sender, EventArgs e)
{
int kor = (int)nudKor.Value;
lblEredmeny.Text = $"{kor} éves vagy.";
}
2. Telefonszám maszkkal
Egy A mtbTelefon MaskedTextBox maszkja legyen (00) 000-0000. A gomb jelezze, ha a szám nincs teljesen kitöltve.Megoldás megnyitása
Mask tulajdonságban a 0 kötelező számjegyet jelent, a többi karakter fix. A MaskCompleted igaz, ha minden kötelező helyre került számjegy.private void btnTelefon_Click(object sender, EventArgs e)
{
if (!mtbTelefon.MaskCompleted)
{
lblEredmeny.Text = "Töltsd ki a teljes telefonszámot!";
return;
}
lblEredmeny.Text = "Rögzítve: " + mtbTelefon.Text;
}
Közepes szint
3. Jelszó erőssége
A A txtJelszo mező (UseSystemPasswordChar: True) gépelés közben írja a lblEro feliratra a jelszó erősségét: 6 karakternél rövidebb gyenge, 10 karakternél rövidebb közepes, egyébként erős.Megoldás megnyitása
TextChanged minden karakter beírásakor lefut. A feltételeket a legkisebbtől haladjuk, és az else if miatt csak egy ág teljesül.private void txtJelszo_TextChanged(object sender, EventArgs e)
{
int hossz = txtJelszo.Text.Length;
if (hossz < 6)
{
lblEro.Text = "gyenge";
lblEro.ForeColor = Color.Firebrick;
}
else if (hossz < 10)
{
lblEro.Text = "közepes";
lblEro.ForeColor = Color.DarkOrange;
}
else
{
lblEro.Text = "erős";
lblEro.ForeColor = Color.SeaGreen;
}
}
4. Irányítószám
Egy A mtbIranyito MaskedTextBox (0000 maszk) kitöltésekor azonnal jelenjen meg a lblEredmeny feliratban: Irányítószám rögzítve: 8200. Hiányos szám esetén a felirat legyen üres.Megoldás megnyitása
MaskedTextBox TextChanged eseménye is lefut, ilyenkor a MaskCompleted tulajdonsággal ellenőrizzük, hogy kész-e a kitöltés.private void mtbIranyito_TextChanged(object sender, EventArgs e)
{
if (mtbIranyito.MaskCompleted)
{
lblEredmeny.Text = "Irányítószám rögzítve: " + mtbIranyito.Text;
}
else
{
lblEredmeny.Text = "";
}
}
Kihívás szint
5. Összeg számláló
Egy A nudAr (egységár, 0–100 000) és egy nudDb (darabszám, 1–100) alapján a lblOsszeg mutassa az összeget ezres tagolással (12 500 Ft), bármelyik érték változásakor.Megoldás megnyitása
ValueChanged esemény a számláló értékének megváltozásakor fut. Mindkét vezérlő eseményénél ugyanazt a metódust válaszd. A decimal szorzatát a ToString("N0") ezres tagolású egész számként írja ki.private void ErtekValtozott(object sender, EventArgs e)
{
decimal osszeg = nudAr.Value * nudDb.Value;
lblOsszeg.Text = osszeg.ToString("N0") + " Ft";
}
6. Regisztrációs űrlap
Egy űrlapon a A hibákat egy szövegben gyűjtjük, mezőnként új sorral. Így a felhasználó egyszerre látja, mit kell javítania. Ha a szöveg végül üres, minden adat rendben van.txtNev, a nudKor (14–120) és az mtbTelefon mező szerepel. A gomb gyűjtse össze az összes hibát, és egyszerre írja ki őket, vagy jelezze a sikert.Megoldás megnyitása
private void btnKuld_Click(object sender, EventArgs e)
{
string hibak = "";
if (txtNev.Text.Trim().Length == 0)
{
hibak = hibak + "- A név hiányzik." + Environment.NewLine;
}
if (nudKor.Value < 14)
{
hibak = hibak + "- A minimális életkor 14 év." + Environment.NewLine;
}
if (!mtbTelefon.MaskCompleted)
{
hibak = hibak + "- A telefonszám hiányos." + Environment.NewLine;
}
if (hibak.Length > 0)
{
lblEredmeny.ForeColor = Color.Firebrick;
lblEredmeny.Text = hibak;
}
else
{
lblEredmeny.ForeColor = Color.SeaGreen;
lblEredmeny.Text = "Sikeres regisztráció!";
}
}
Gyors önellenőrzés
Válaszolj fejben, és csak utána nyisd le a választ. Elrejti a beírt karaktereket (pontokat mutat), de a A A Sosem: a vezérlő csak számot enged, a Futás közbeni hiba (1. Mire való a UseSystemPasswordChar?
Text továbbra is a valódi szöveget tartalmazza.2. Mit jelent a 0 és a 9 a maszkban?
0 kötelező számjegy, a 9 elhagyható számjegy vagy szóköz.3. Hogyan ellenőrzöd, hogy a MaskedTextBox teljesen ki van-e töltve?
MaskCompleted tulajdonsággal. A Text.Length nem jó, mert a fix jelek miatt sosem 0.4. Milyen típusú a NumericUpDown Value tulajdonsága?
decimal. Egész számmá a (int) típuskényszerítéssel alakítható.5. Mikor kell a NumericUpDownnál TryParse?
Value már szám.6. Mi történik, ha a Value-t a Maximum fölé állítod?
ArgumentOutOfRangeException).
Mit tudsz már?
- Beállítod a TextBox fontos tulajdonságait.
- Jelszómezőt készítesz.
- MaskedTextBox maszkkal formátumos adatot kérsz be.
- A NumericUpDown értékét egész számmá alakítod.
- Regisztrációs űrlapot készítesz ellenőrzéssel.
Következő lecke: Label, LinkLabel és visszajelzések
A bevitel kész. A következő leckében arról lesz szó, hogyan adjunk a felhasználónak visszajelzést.




