Grafikus C# – Windows Forms tanfolyam › 1.9 lecke

Windows Forms · 1.9 lecke

TextBox, MaskedTextBox és NumericUpDown részletesen

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.

  • kb. 75 perc
  • kezdő–közepes szint
  • beviteli vezérlők
Diák C# programozást gyakorol egy tanulósarokban

A lecke végére

  • a TextBox fontos tulajdonságait használod (MaxLength, CharacterCasing, ReadOnly, Multiline);
  • jelszómezőt készítesz (UseSystemPasswordChar);
  • a MaskedTextBox maszkjával megadott formátumú adatot kérsz be, és ellenőrzöd a MaskCompleted tulajdonsággal;
  • a NumericUpDown segítségével számot kérsz be, és a decimal é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).

1.8 ProgressBar és Timer →

1.3 Számolás és 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:

MaxLengthA beírható karakterek legnagyobb száma. A 0 azt jelenti, hogy nincs korlát.
CharacterCasingAutomatikus kis- és nagybetűre alakítás: Normal, Upper (csupa nagybetű), Lower (csupa kisbetű).
ReadOnlyHa True, a szöveg látszik és másolható, de a felhasználó nem írhat bele.
EnabledHa False, a mező szürke, és nem használható.
MultilineHa True, többsoros szöveg írható bele (Enterrel), és a mező magassága is állítható.
ScrollBarsTöbbsoros mezőnél a görgetősávok: 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:

Form1.csC#
private void chkMutat_CheckedChanged(object sender, EventArgs e)
{
txtJelszo.UseSystemPasswordChar = !chkMutat.Checked;
}
chkMutat.CheckedIgaz, ha be van pipálva a „Jelszó megjelenítése” négyzet.
!chkMutat.CheckedA tagadása: ha nincs bepipálva, a jelszót el kell rejteni.

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:

Form1.csC#
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.

📷 Képernyőkép helye

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:

MaszkkarakterJelentése
0Kötelező számjegy (0–9).
9Elhagyható számjegy vagy szóköz.
LKötelező betű.
?Elhagyható betű.
AKötelező betű vagy számjegy.
bármi másFix jel, amely a mezőben mindig látszik (például kötőjel, zárójel).
TelefonszámMask: (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.
DátumMask: 0000.00.00. Az év, hónap és nap számjegyei kötelezők.
IrányítószámMask: 0000. Pontosan négy számjegyet kér.
PromptCharA hiányzó karakterek helyén megjelenő jel (alapból _ aláhúzás).

Két tulajdonságot külön ismerned kell:

MaskCompletedIgaz, ha az összes kötelező karaktert beírták. Ezzel ellenőrizheted, hogy teljes-e a bevitel.
TextA mező tartalma. Alapból a fix jeleket és az aláhúzásokat is tartalmazza (például (__) ___-____), ezért a Text.Length == 0 sosem igaz.
Form1.csC#
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.

📷 Képernyőkép helye

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:

Minimum és MaximumAz engedélyezett tartomány. Az alap 0 és 100.
ValueAz aktuális érték. A típusa decimal, vagyis tizedes szám.
IncrementA nyilak lépésköze (alapból 1).
DecimalPlacesA tizedesjegyek száma (alapból 0).

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:

Form1.csC#
int kor = (int)nudKor.Value;
MessageBox.Show($"Életkor: {kor}");
(int)nudKor.ValueA decimal értéket egész számmá alakítja (a tizedesjegyeket levágja).
ValueChangedAz esemény, amely az érték megváltozásakor fut le.

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.

Ok és javítás

A 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 120
Hiba é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.

Ok és javítás

Ez nem hiba, ez a maszk dolga: a 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:

txtNevA név (TextBox, MaxLength: 40).
txtJelszo és chkMutatA jelszómező (UseSystemPasswordChar: True) és a megjelenítő jelölőnégyzet.
mtxTelefonA telefonszám (Mask: (00) 000-0000).
nudKorAz életkor (Minimum: 0, Maximum: 120, Value: 18).
txtMegjegyzesTöbbsoros mező (Multiline: True, ScrollBars: Vertical).
btnRegisztralA Regisztráció gomb.
Form1.csC#
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}");
}
}
if – else if – elseSorban ellenőrzi a feltételeket. Az első hibánál megáll, és csak azt az üzenetet mutatja.
jelszo.Length < 6A jelszó rövidebb, mint hat karakter.
!mtxTelefon.MaskCompletedA telefonszám nincs teljesen kitöltve.
(int)nudKor.ValueA decimal érték átalakítva egész számmá.
📷 Képernyőkép helye

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 mtxIranyitoszam mezőt (maszk: 0000) és egy txtVaros mezőt, amely automatikusan csupa nagybetűs.

Egy lehetséges megoldás

Az 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 nudKor NumericUpDown (Minimum: 0, Maximum: 120) és egy gomb alapján a lblEredmeny írja ki: 16 éves vagy.

Megoldás megnyitása

A 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.

Form1.csC#
private void btnKor_Click(object sender, EventArgs e)
{
int kor = (int)nudKor.Value;
lblEredmeny.Text = $"{kor} éves vagy.";
}

2. Telefonszám maszkkal

Egy mtbTelefon MaskedTextBox maszkja legyen (00) 000-0000. A gomb jelezze, ha a szám nincs teljesen kitöltve.

Megoldás megnyitása

A 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.

Form1.csC#
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 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

A TextChanged minden karakter beírásakor lefut. A feltételeket a legkisebbtől haladjuk, és az else if miatt csak egy ág teljesül.

Form1.csC#
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 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

A MaskedTextBox TextChanged eseménye is lefut, ilyenkor a MaskCompleted tulajdonsággal ellenőrizzük, hogy kész-e a kitöltés.

Form1.csC#
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 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

A 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.

Form1.csC#
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 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

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.

Form1.csC#
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.

1. Mire való a UseSystemPasswordChar?

Elrejti a beírt karaktereket (pontokat mutat), de a Text továbbra is a valódi szöveget tartalmazza.

2. Mit jelent a 0 és a 9 a maszkban?

A 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?

A 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?

Sosem: a vezérlő csak számot enged, a Value már szám.

6. Mi történik, ha a Value-t a Maximum fölé állítod?

Futás közbeni hiba (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.