Grafikus C# – Windows Forms tanfolyam › 1.2 lecke

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

TextBox, Button, Label, MessageBox – név bekérése

A konzolos programban a Console.ReadLine() kérte be az adatot. Az ablakos programban erre a beviteli mező, a TextBox való: a felhasználó beleír, a gomb Click eseménye pedig felolvassa a tartalmát, és egy felugró ablakban megjeleníti.

  • kb. 45–60 perc
  • kezdő szint
  • adatbekérés
Diák C# programozást gyakorol egy tanulósarokban

A lecke végére

  • a TextBox tartalmát a Text tulajdonsággal kiolvasod;
  • a MessageBox.Show() metódussal felugró ablakot nyitsz, címmel és ikonnal;
  • szöveginterpolációval beilleszted a bevitt adatot az üzenetbe;
  • kezeled az üres és a szóközökből álló bevitelt;
  • törlöd a mezőt, és visszaadod a kurzort a Clear() és a Focus() segítségével;
  • érted, miért nem használható a Console.ReadLine() ablakos programban.

Mielőtt elkezded

Ehhez a leckéhez kell az 1.1 lecke: gomb, felirat és az első Click eseménykezelő. A szöveginterpolációt ($"...") a C# alapok adatbekérés leckéjében ismerted meg.

1.1 Első Windows Forms projekt →

Adatbekérés C#-ban →

A felület: három vezérlő

Készíts új Windows Forms projektet (vagy másold le az előzőt), és tegyél az ablakra három vezérlőt:

lblNevEgy Label, a Text: Írd be a neved!
txtNevEgy TextBox: ide ír a felhasználó.
btnKoszontEgy Button, a Text: Köszöntés
Előtagoklbl = Label, txt = TextBox, btn = Button (1.1 lecke).
📷 Képernyőkép helye

Mit tegyél ide: a tervezőnézet a három vezérlővel: felül a „Írd be a neved!” felirat, alatta a beviteli mező, majd a Köszöntés gomb.Javasolt fájlnév: winforms-1-2-felulet.webp · Alt szöveg: Az ablak felirattal, beviteli mezővel és gombbal a Visual Studio tervezőjében

A TextBox tartalmának kiolvasása

A beviteli mező tartalma a Text tulajdonságban van, és mindig string típusú. Az ablakos programban nem kérdezzük meg külön a felhasználót, mint a konzolban, hanem akkor olvassuk ki a mezőt, amikor történik valami (például megnyomnak egy gombot).

A felhasználó beír valamit→Megnyomja a gombot→A Click eseménykezelő kiolvassa a txtNev.Text értékét→A program válaszol
Form1.csC#
private void btnKoszont_Click(object sender, EventArgs e)
{
string nev = txtNev.Text;
MessageBox.Show($"Szia, {nev}!", "Köszöntés");
}
string nev = txtNev.Text;Kiolvassuk a mező tartalmát egy változóba. A változó nem kötelező, de jól mutatja a sorrendet: előbb kiolvasunk, utána felhasználunk.
$"Szia, {nev}!"Szöveginterpoláció: a kapcsos zárójelben lévő változó értéke bekerül a szövegbe.
MessageBox.Show(üzenet, cím)Felugró ablakot nyit. Az első paraméter az üzenet, a második az ablak címsora.

Jósolj!

A mezőbe azt írod, hogy Anna, és megnyomod a gombot. Mi áll az üzenetben, és mi az ablak címe? Mi történik, ha ezután átírod a mezőt Bence-re, de nem nyomod meg újra a gombot?

Jóslat ellenőrzése

Az üzenet: Szia, Anna!, az ablak címe: Köszöntés. Ha átírod a nevet, de nem nyomod meg a gombot, semmi nem történik, mert az eseménykezelő csak kattintáskor fut le. A régi, már megjelent üzenetablak nem változik meg.

A MessageBox: cím és ikon

A MessageBox.Show() többféleképpen hívható. A legfontosabb változatok:

MessageBox változatokC#
// csak üzenet
MessageBox.Show("Szia!");

// üzenet és cím
MessageBox.Show("Szia!", "Köszöntés");

// üzenet, cím, gomb és ikon
MessageBox.Show("Szia!", "Köszöntés", MessageBoxButtons.OK, MessageBoxIcon.Information);
MessageBoxButtons.OKCsak egy OK gomb. Más lehetőségek: YesNo, OKCancel. Ezeket a 0.8 és a 7.4 leckékben használjuk.
MessageBoxIcon.InformationInformációs ikon. Más ikonok: Warning, Error, Question.
📷 Képernyőkép helye

Mit tegyél ide: a felugró üzenetablak „Szia, Anna!” szöveggel, „Köszöntés” címmel és információs ikonnal, a program ablaka előtt.Javasolt fájlnév: winforms-1-2-messagebox.webp · Alt szöveg: Felugró üzenetablak a bevitt névvel

Mit tegyünk, ha üres a mező?

Ha a felhasználó nem ír be semmit, a program ezt mondaná: Szia, ! Ez nem szép. Ellenőriznünk kell, hogy van-e valódi bevitel. Az üres mező Text értéke üres szöveg (""), nem null.

Form1.csC#
private void btnKoszont_Click(object sender, EventArgs e)
{
string nev = txtNev.Text.Trim();

if (nev.Length == 0)
{
MessageBox.Show("Adj meg egy nevet!", "Hiányzó adat", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else
{
MessageBox.Show($"Szia, {nev}!", "Köszöntés");
}
}
Trim()Levágja a szöveg elejéről és végéről a szóközöket.
nev.Length == 0Üres-e a név a szóközök levágása után?
if–elseÜres név esetén figyelmeztetés, különben köszöntés.
string.IsNullOrWhiteSpace(...)Ugyanezt egyetlen hívással is megkérdezheted: igaz, ha a szöveg üres vagy csak szóközökből áll.

Jósolj!

A mezőbe csak két szóközt írsz, és megnyomod a gombot. Melyik ág fut le?

Jóslat ellenőrzése

A figyelmeztetés ága, mert a Trim() eltávolítja a szóközöket, és a név hossza 0 lesz.

Törlés és fókusz

Kényelmesebb a program, ha a köszöntés után a mező törlődik, és a kurzor visszakerül oda, hogy rögtön a következő nevet be lehessen írni:

Form1.csC#
txtNev.Clear();
txtNev.Focus();
Clear()Kitörli a TextBox teljes tartalmát.
Focus()A kurzort a mezőbe teszi, ahol a felhasználó azonnal gépelhet.

Enterre is köszönjön?

Jelöld ki az ablakot (a Form üres részét), és a Properties ablakban állítsd az AcceptButton tulajdonságot btnKoszont-ra. Ekkor az Enter megnyomása ugyanazt csinálja, mintha a gombra kattintanál. Kódot nem kell hozzá írni.

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. Console.ReadLine az ablakban

private void btnKoszont_Click(object sender, EventArgs e)
{
string nev = Console.ReadLine();
MessageBox.Show($"Szia, {nev}!");
}
Hiba és javítás

Rossz működés: az ablakos programnak nincs konzolja, a Console.ReadLine() nem a beviteli mezőből olvas. Javítás: string nev = txtNev.Text;

2. Hiányzó .Text

string nev = txtNev;
// CS0029: Cannot implicitly convert type 'TextBox' to 'string'
Hiba és javítás

Fordítási hiba (CS0029): a txtNev maga a vezérlő, nem a benne lévő szöveg. A szöveget a Text tulajdonság tartalmazza: txtNev.Text.

3. Hiányzó dollárjel

MessageBox.Show("Szia, {nev}!");
Hiba és javítás

Rossz működés: a felugró ablak szó szerint azt mutatja, hogy Szia, {nev}!. Szöveginterpolációhoz a szöveg elé $ jel kell: $"Szia, {nev}!".

4. Hiányzó típus

nev = txtNev.Text;
// CS0103: The name 'nev' does not exist in the current context
Hiba és javítás

Fordítási hiba (CS0103): a nev változót nem hoztad létre. Add meg a típusát is: string nev = txtNev.Text;

5. A mező nem törlődik

A köszöntés után a név bent marad a mezőben.

Ok és javítás

Nincs meghívva a txtNev.Clear();. Tedd az eseménykezelő végére, a MessageBox után.

Mini projekt: a köszöntő program

Állítsd össze a teljes programot:

  1. Label, TextBox és Button a megadott nevekkel.
  2. A gombnyomásra: üres név esetén figyelmeztetés, különben köszöntés a névvel.
  3. Az üzenet után a mező törlődik, és a kurzor visszakerül a mezőbe.
  4. Az Enter is működjön az AcceptButton beállításával.
Form1.csC#
private void btnKoszont_Click(object sender, EventArgs e)
{
string nev = txtNev.Text.Trim();

if (nev.Length == 0)
{
MessageBox.Show("Adj meg egy nevet!", "Hiányzó adat", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else
{
MessageBox.Show($"Szia, {nev}!", "Köszöntés", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

txtNev.Clear();
txtNev.Focus();
}
📷 Képernyőkép helye

Mit tegyél ide: a kész program futás közben: a beviteli mezőben egy név, mellette a felugró köszöntő ablak.Javasolt fájlnév: winforms-1-2-koszonto-kesz.webp · Alt szöveg: A kész köszöntő program egy névvel és a felugró üzenettel

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. Teljes név

Kérj be egy teljes nevet, és írd ki: Örülök, hogy itt vagy, ...!

Egy lehetséges megoldás
MessageBox.Show($"Örülök, hogy itt vagy, {txtNev.Text}!");

2. Az üres szöveg másik módja

Írd át az üres név ellenőrzését a string.IsNullOrWhiteSpace() metódussal.

Egy lehetséges megoldás
if (string.IsNullOrWhiteSpace(txtNev.Text))
{
MessageBox.Show("Adj meg nevet!");
}
else
{
MessageBox.Show($"Szia, {txtNev.Text}!");
}

3. Két beviteli mező

Tegyél az ablakra egy második TextBoxot txtVaros néven. A gombnyomásra egyetlen üzenetben jelenjen meg a név és a város.

Egy lehetséges megoldás
MessageBox.Show($"{txtNev.Text} – {txtVaros.Text}");

Gyakorlótár: 6 további feladat

Három szinten gyakorolhatsz: alap, közepes és kihívás. Mindegyik feladathoz használd a txtNev beviteli mezőt és egy gombot, és csak a saját próbálkozásod után nyisd le a megoldást.

Alap szint

1. Köszöntés névvel

A btnKoszon gomb egy felugró ablakban köszöntse a txtNev mezőbe írt nevet: Szia, Anna!

Megoldás megnyitása

A Text tulajdonság a beírt szöveg. A + jel a szövegeket összefűzi.

Form1.csC#
private void btnKoszon_Click(object sender, EventArgs e)
{
MessageBox.Show("Szia, " + txtNev.Text + "!");
}

2. Üres név

Ha a mező üres vagy csak szóközt tartalmaz, a program figyelmeztessen, és ne köszöntsön.

Megoldás megnyitása

A string.IsNullOrWhiteSpace igaz, ha a szöveg üres, vagy csak szóközökből áll. A return kilép a metódusból, ezért a köszöntés már nem fut le.

Form1.csC#
private void btnKoszon_Click(object sender, EventArgs e)
{
if (string.IsNullOrWhiteSpace(txtNev.Text))
{
MessageBox.Show("Írd be a neved!", "Hiányzó adat", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}

MessageBox.Show("Szia, " + txtNev.Text.Trim() + "!");
}

Közepes szint

3. Törlés gomb

Egy btnTorol gomb törölje a mező tartalmát, és a kurzor kerüljön vissza a mezőbe.

Megoldás megnyitása

A Clear() kiüríti a mezőt, a Focus() a billentyűzet fókuszát a mezőre teszi, így rögtön gépelhetsz.

Form1.csC#
private void btnTorol_Click(object sender, EventArgs e)
{
txtNev.Clear();
txtNev.Focus();
}

4. Igen vagy nem?

Egy btnKilep gomb kérdezze meg: Biztosan kilépsz? Igen esetén zárja be az ablakot, nem esetén írja ki egy lblEredmeny feliratra: Maradsz.

Megoldás megnyitása

A MessageBox.Show eredménye egy DialogResult, amelyet változóban tárolsz, és összehasonlítasz.

Form1.csC#
private void btnKilep_Click(object sender, EventArgs e)
{
DialogResult valasz = MessageBox.Show("Biztosan kilépsz?", "Kilépés", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

if (valasz == DialogResult.Yes)
{
this.Close();
}
else
{
lblEredmeny.Text = "Maradsz.";
}
}

Kihívás szint

5. A név visszafelé

A gomb írja ki a beírt név betűit fordított sorrendben (Anna → annA).

Megoldás megnyitása

A szöveget betűtömbbé alakítjuk (ToCharArray), megfordítjuk (Array.Reverse), majd új szöveget készítünk belőle.

Form1.csC#
private void btnFordit_Click(object sender, EventArgs e)
{
string nev = txtNev.Text.Trim();

if (nev.Length == 0)
{
MessageBox.Show("Írd be a neved!");
return;
}

char[] betuk = nev.ToCharArray();
Array.Reverse(betuk);

MessageBox.Show(new string(betuk));
}

6. Hossz és kezdőbetű

A program írja ki: A neved 4 karakter hosszú, a kezdőbetűje: A. Üres név esetén ne történjen hiba.

Megoldás megnyitása

A Length a karakterek száma. A szöveg első betűje a nev[0] (a számozás 0-tól indul). Üres szövegnél a nev[0] hibát okozna, ezért előbb a hosszt ellenőrizzük.

Form1.csC#
private void btnAdatok_Click(object sender, EventArgs e)
{
string nev = txtNev.Text.Trim();

if (nev.Length == 0)
{
MessageBox.Show("Írd be a neved!");
return;
}

MessageBox.Show($"A neved {nev.Length} karakter hosszú, a kezdőbetűje: {nev[0]}.");
}

Gyors önellenőrzés

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

1. Mit ad vissza a txtNev.Text?

A beviteli mezőben lévő szöveget string típusként.

2. Mikor fut le a Click eseménykezelő?

Csak akkor, amikor a felhasználó a gombra kattint.

3. Mire való a MessageBox.Show?

Felugró ablakot nyit az üzenettel, opcionálisan címmel, gombokkal és ikonnal.

4. Mit csinál a Trim()?

Levágja a szöveg elejéről és végéről a szóközöket.

5. Miért nem használható a Console.ReadLine() az ablakos programban?

Mert az ablakos programnak nincs konzolja. A beviteli mezőből a TextBox Text tulajdonságával olvasunk.

6. Mire való a Clear() és a Focus()?

A Clear kitörli a mező tartalmát, a Focus a kurzort a mezőbe teszi.

Mit tudsz már?

  • Kiolvasod a TextBox tartalmát a Text tulajdonsággal.
  • Felugró ablakot nyitsz címmel és ikonnal.
  • Kezeled az üres és a szóközös bevitelt.
  • Törlöd a mezőt, és visszaadod a kurzort.
  • Tudod, miért nem a Console.ReadLine() kell az ablakos programban.

Következő lecke: számolás TextBoxokkal és TryParse

Eddig szöveget olvastunk be. A következő leckében számokat kérünk be, és számolunk velük.