Grafikus C# – Windows Forms tanfolyam › 1.10 lecke

Windows Forms · 1.10 lecke

Label, LinkLabel és egyszerű visszajelzések

A jó program mindig megmondja, mi történt: sikerült-e a mentés, hibás volt-e az adat. Ebben a leckében a Label vezérlő részletes beállításait nézzük meg, színes visszajelzést készítünk, az üzenetet pár másodperc után eltüntetjük, és megtanuljuk használni a kattintható hivatkozást (LinkLabel).

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

A lecke végére

  • a Label fontos tulajdonságait használod (AutoSize, TextAlign, ForeColor, BorderStyle);
  • saját metódussal, két bemenettel (szoveg, hiba) színes visszajelzést adsz;
  • az üzenetet Timer segítségével eltünteted;
  • eldöntöd, mikor jobb a MessageBox, és mikor a Label;
  • a LinkLabel segítségével biztonságosan megnyitsz egy weboldalt;
  • felismered a leggyakoribb hibákat.

Mielőtt elkezded

Ehhez a leckéhez kell az 1.9 lecke, az 1.8 lecke (Timer) és az if–else.

1.9 TextBox, MaskedTextBox, NumericUpDown →

1.8 ProgressBar és Timer →

A Label tulajdonságai

A Label (felirat) a legegyszerűbb vezérlő, de sok mindent beállíthatsz rajta:

TextA megjelenő szöveg. Kódból bármikor átírható.
AutoSizeHa True, a felirat mérete a szöveghez igazodik. Ha False, magad adhatod meg a méretet, ilyenkor a hosszabb szöveg levágódhat.
TextAlignA szöveg igazítása a felirat területén belül (például MiddleCenter: középre).
ForeColor és BackColorA betűszín és a háttérszín.
BorderStyleKeret: None (nincs), FixedSingle (vékony), Fixed3D (domború).
FontA betűtípus, méret és stílus.
VisibleLátható-e a felirat. Ha False, nem látszik, de a program tovább használhatja.
UseMnemonicHa True, az & jel utáni betű aláhúzott Alt-billentyűvé válik. Szövegben szereplő & jelhez írj && jelet.
📷 Képernyőkép helye

Mit tegyél ide: három különböző Label egymás alatt a tervezőben: egy keret nélküli, egy FixedSingle kerettel és egy színes háttérrel, középre igazított szöveggel.Javasolt fájlnév: winforms-1-10-label-beallitasok.webp · Alt szöveg: Három különbözően beállított Label vezérlő

Színes visszajelzés saját metódussal

A visszajelzésnek jól kell látszania, ezért a sikert zöld, a hibát piros betűvel írjuk ki. Ahelyett, hogy minden eseménykezelőben beírnánk a színezést, egyetlen metódust készítünk, amelynek két bemenete van: az üzenet szövege és az, hogy hibáról van-e szó.

Form1.csC#
private void Uzenet(string szoveg, bool hiba)
{
lblVisszajelzes.Text = szoveg;

if (hiba)
{
lblVisszajelzes.ForeColor = Color.Firebrick;
}
else
{
lblVisszajelzes.ForeColor = Color.SeaGreen;
}
}

private void btnMent_Click(object sender, EventArgs e)
{
if (txtNev.Text.Trim().Length == 0)
{
Uzenet("Add meg a neved!", true);
}
else
{
Uzenet($"A(z) {txtNev.Text.Trim()} adatai elmentve.", false);
}
}
Uzenet(string szoveg, bool hiba)Saját metódus két bemenettel. A hívásnál mindkettőt meg kell adni, ebben a sorrendben.
hibaIgaz/hamis érték: true esetén piros, false esetén zöld lesz az üzenet.
Color.Firebrick, Color.SeaGreenElőre megadott színek (sötétpiros és tengerzöld), olvashatóbbak, mint a tiszta piros és zöld.
Uzenet("...", true)A metódus meghívása: szöveg és jelző megadásával.

Jósolj!

Először üres névvel kattintasz a gombra (piros hiba jelenik meg), utána beírod a nevet, és újra kattintasz. Milyen színű lesz a második üzenet, ha a metódusban csak a szöveget állítanánk, a színt nem?

Jóslat ellenőrzése

Piros maradna, mert a ForeColor a korábbi értékét megtartja. Ezért állítjuk be a színt a metódusban mindkét ágban, minden üzenetnél.

📷 Képernyőkép helye

Mit tegyél ide: két kép a programról: az egyiken a piros „Add meg a neved!” hibaüzenet, a másikon a zöld „A(z) Anna adatai elmentve.” üzenet.Javasolt fájlnév: winforms-1-10-szines-uzenet.webp · Alt szöveg: Piros hibaüzenet és zöld sikerüzenet egy űrlapon

Az üzenet eltűnik pár másodperc után

Az üzenet ne maradjon ott örökre. Az 1.8 leckében tanult Timerrel pár másodperc múlva kitörölhetjük. Tegyél az ablakra egy tmrUzenet nevű Timert, az Interval értéke legyen 3000 (három másodperc):

Form1.csC#
private void Uzenet(string szoveg, bool hiba)
{
lblVisszajelzes.Text = szoveg;
lblVisszajelzes.ForeColor = hiba ? Color.Firebrick : Color.SeaGreen;

tmrUzenet.Stop();
tmrUzenet.Start();
}

private void tmrUzenet_Tick(object sender, EventArgs e)
{
lblVisszajelzes.Text = "";
tmrUzenet.Stop();
}
hiba ? Color.Firebrick : Color.SeaGreenRövid forma az if–else helyett: ha a hiba igaz, az első szín, különben a második.
Stop() majd Start()Újraindítja a számlálást: egy új üzenet a teljes három másodpercet megkapja.
tmrUzenet_TickHárom másodperc után lefut: kitörli a feliratot, és leállítja az időzítőt.

Másodperc vagy ezredmásodperc?

Az Interval értéke milliszekundum, ezért három másodperc 3000. Ha csak 3-at írsz, az üzenet a másodperc háromezredrésze alatt eltűnik, és nem is látod.

MessageBox vagy Label?

SzempontMessageBoxLabel a felületen
Zavarja a munkát?Igen: megáll a program, amíg el nem kattintják.Nem: a felhasználó tovább dolgozhat.
Mikor jó?Fontos figyelmeztetés, kérdés (Igen/Nem), súlyos hiba.Apró visszajelzés: elmentve, hibás mező, állapot.
Kérdezhet választ?Igen (DialogResult).Nem.
Példa„Biztosan kilépsz?”„Elmentve.” vagy „Hibás e-mail cím.”

Az alapszabály

Ha a felhasználónak döntenie kell, vagy valami komolyat kell tudnia, használj MessageBoxot. Ha csak tájékoztatni szeretnéd, használj Labelt. Egy felugró ablak minden apróságnál idegesítő.

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. A hivatkozás nem nyílik meg

System.Diagnostics.Process.Start("https://www.digitalisfelfedezok.hu");
Hiba és javítás

Az újabb .NET projektben futás közbeni hiba keletkezhet (Win32Exception), mert a címet külön kérni kell a Windows rendszertől. A régi .NET Frameworkben ez a rövid forma működik. Mindkettőben jó a hosszabb változat: Process.Start(new ProcessStartInfo(cim) { UseShellExecute = true });

2. A feliratból kilóg a szöveg

Hosszú üzenetnél a felirat vége le van vágva.

Ok és javítás

Az AutoSize értéke False, és a felirat mérete kicsi. Állítsd True-ra, vagy növeld a felirat szélességét és magasságát.

3. Piros marad a siker is

private void Uzenet(string szoveg, bool hiba)
{
lblVisszajelzes.Text = szoveg;
if (hiba)
{
lblVisszajelzes.ForeColor = Color.Firebrick;
}
}
Hiba és javítás

Rossz működés: a sikernél nem állítjuk vissza a színt, ezért a hiba után piros marad. Adj hozzá else ágat, amely zöldre állítja.

4. Az üzenet azonnal eltűnik

A visszajelzés megjelenik, de szinte rögtön eltűnik.

Ok és javítás

Az Interval értéke túl kicsi. Ne felejtsd, hogy milliszekundumban kell megadni: három másodperc 3000.

5. Nem történik semmi a kattintásra

A LinkLabelre kattintasz, de semmi sem nyílik meg.

Ok és javítás

A LinkClicked eseménykezelő nincs összekötve (kézzel gépelted be, vagy a Click eseményt használtad). Hozd létre dupla kattintással, vagy az Events nézetben (villám) válaszd ki a LinkClicked sorhoz.

Mini projekt: mentés visszajelzéssel

Állítsd össze az alábbi kis űrlapot:

  1. Felület: txtNev, btnMent, lblVisszajelzes (AutoSize: False, TextAlign: MiddleLeft), tmrUzenet (Interval: 3000), lnkSugo (Text: Súgó megnyitása).
  2. A Mentés gomb üres névre piros hibaüzenetet ad, különben zöld sikerüzenetet.
  3. Az üzenet három másodperc múlva eltűnik.
  4. A hivatkozás megnyitja a Microsoft Windows Forms dokumentációt.

A hozzá szükséges kódot a leckében már megírtad: az Uzenet metódus az eltűnő változatban, a btnMent_Click, a tmrUzenet_Tick és az lnkSugo_LinkClicked.

📷 Képernyőkép helye

Mit tegyél ide: a kész űrlap: a név mezője, a Mentés gomb, a zöld visszajelzés és a Súgó megnyitása hivatkozás.Javasolt fájlnév: winforms-1-10-kesz.webp · Alt szöveg: A kész mentés-űrlap visszajelzéssel és hivatkozással

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. Ikon az üzenet előtt

A siker előtt jelenjen meg egy pipa (✔), a hiba előtt egy kereszt (✖) az üzenet szövegében.

Egy lehetséges megoldás
if (hiba)
{
lblVisszajelzes.Text = "✖ " + szoveg;
}
else
{
lblVisszajelzes.Text = "✔ " + szoveg;
}

2. E-mail hivatkozás

Készíts egy lnkEmail nevű LinkLabelt, amely a levelezőprogramot nyitja meg egy e-mail címmel.

Egy lehetséges megoldás
System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo("mailto:valaki@example.com") { UseShellExecute = true });

A mailto: kezdetű cím a levelezőprogramot nyitja meg. Itt is csak fix, megbízható címet használj.

3. Karakterszámláló a névmezőhöz

Egy lblHossz felirat mutassa, hány karaktert írtál a névmezőbe. Ha a hossz 30 fölé megy, legyen piros a szöveg.

Egy lehetséges megoldás
private void txtNev_TextChanged(object sender, EventArgs e)
{
int hossz = txtNev.Text.Length;
lblHossz.Text = hossz + " karakter";

if (hossz > 30)
{
lblHossz.ForeColor = Color.Firebrick;
}
else
{
lblHossz.ForeColor = Color.Black;
}
}

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. Színes üzenet

Írj egy Uzenet(string szoveg, bool hiba) metódust, amely a lblUzenet feliratra írja a szöveget: hibánál piros, egyébként zöld színnel. Használd egy gomb két ágában.

Megoldás megnyitása

A ?: rövid feltétel: ha a hiba igaz, az első érték, különben a második kerül a ForeColor-ba. A színmegadáshoz kell a using System.Drawing; sor, ha nem lenne meg.

Form1.csC#
private void Uzenet(string szoveg, bool hiba)
{
lblUzenet.Text = szoveg;
lblUzenet.ForeColor = hiba ? Color.Firebrick : Color.SeaGreen;
}

private void btnEllenor_Click(object sender, EventArgs e)
{
if (txtNev.Text.Trim().Length == 0)
{
Uzenet("Add meg a neved!", true);
}
else
{
Uzenet("Rendben, " + txtNev.Text.Trim() + "!", false);
}
}

2. Hivatkozás megnyitása

Egy lnkOldal LinkLabel kattintásra nyissa meg a https://www.digitalisfelfedezok.hu oldalt az alapértelmezett böngészőben.

Megoldás megnyitása

A LinkLabel LinkClicked eseményét használjuk. Az újabb .NET-ben és a .NET Frameworkben is az a biztonságos megoldás, ha a ProcessStartInfo UseShellExecute tulajdonságát igazra állítjuk. Hibakezelés is kell, mert a megnyitás sikertelen lehet.

Form1.csC#
private void lnkOldal_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
try
{
System.Diagnostics.ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo("https://www.digitalisfelfedezok.hu");
info.UseShellExecute = true;
System.Diagnostics.Process.Start(info);
}
catch (Exception ex)
{
MessageBox.Show("Nem sikerült megnyitni a hivatkozást: " + ex.Message);
}
}

Közepes szint

3. Az üzenet eltűnik

A lblUzenet szövege 3 másodperc után tűnjön el egy tmrUzenet Timerrel.

Megoldás megnyitása

A Timer Interval értéke 3000. Üzenet kiírásakor elindítjuk, a Tick eseményben pedig törli a szöveget, és megállítja magát, hogy ne ismétlődjön. Ha új üzenet jön, előbb újraindítjuk, hogy a 3 másodperc elölről számoljon.

Form1.csC#
private void Uzenet(string szoveg, bool hiba)
{
lblUzenet.Text = szoveg;
lblUzenet.ForeColor = hiba ? Color.Firebrick : Color.SeaGreen;

tmrUzenet.Stop();
tmrUzenet.Start();
}

private void tmrUzenet_Tick(object sender, EventArgs e)
{
lblUzenet.Text = "";
tmrUzenet.Stop();
}

4. Karakterlimit visszajelzés

A txtUzenet mezőbe legfeljebb 50 karakter írható (MaxLength). A lblHatra mutassa: Még 37 karakter. 10 vagy kevesebb hátralévő karakternél legyen piros.

Megoldás megnyitása

A MaxLength tulajdonság megakadályozza a hosszabb beírást. A hátralévő karakterek száma az 50 és a szöveg hossza különbsége.

Form1.csC#
private void txtUzenet_TextChanged(object sender, EventArgs e)
{
int hatra = 50 - txtUzenet.Text.Length;

lblHatra.Text = $"Még {hatra} karakter.";
lblHatra.ForeColor = hatra <= 10 ? Color.Firebrick : Color.Black;
}

Kihívás szint

5. Jelszószabályok jelzése

A jelszó beírása közben két felirat jelezze a szabályokat: lblHossz (legalább 8 karakter) és lblSzamjegy (legalább egy számjegy). Teljesült szabálynál zöld pipa, egyébként piros kereszt.

Megoldás megnyitása

A számjegy keresése karakterenként történik a foreach ciklussal, a char.IsDigit metódussal. A szabályok kiértékelését és megjelenítését külön metódusba tesszük.

Form1.csC#
private void Szabaly(Label felirat, string szoveg, bool teljesul)
{
felirat.Text = (teljesul ? "✔ " : "✖ ") + szoveg;
felirat.ForeColor = teljesul ? Color.SeaGreen : Color.Firebrick;
}

private void txtJelszo_TextChanged(object sender, EventArgs e)
{
string jelszo = txtJelszo.Text;
bool vanSzamjegy = false;

foreach (char betu in jelszo)
{
if (char.IsDigit(betu))
{
vanSzamjegy = true;
}
}

Szabaly(lblHossz, "legalább 8 karakter", jelszo.Length >= 8);
Szabaly(lblSzamjegy, "legalább egy számjegy", vanSzamjegy);
}

6. Háromszintű jelzés

Bővítsd az Uzenet metódust egy szint paraméterrel: 0 = siker (zöld), 1 = figyelmeztetés (narancs), 2 = hiba (piros). Próbáld ki mindhárom szinttel.

Megoldás megnyitása

A szint egy egész szám, az if–else if láncban a három esetet külön ágon kezeljük. Később, az enum (felsorolás) használatával olvashatóbb is lehet, de a számmal is jól működik.

Form1.csC#
private void Uzenet(string szoveg, int szint)
{
lblUzenet.Text = szoveg;

if (szint == 0)
{
lblUzenet.ForeColor = Color.SeaGreen;
}
else if (szint == 1)
{
lblUzenet.ForeColor = Color.DarkOrange;
}
else
{
lblUzenet.ForeColor = Color.Firebrick;
}
}

Gyors önellenőrzés

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

1. Mikor jobb a Label, mint a MessageBox?

Apró tájékoztatásnál, amely nem zavarja a munkát (elmentve, hibás mező). A MessageBox fontos figyelmeztetésre vagy kérdésre való.

2. Mit jelent az AutoSize tulajdonság?

Ha True, a felirat mérete a szöveghez igazodik.

3. Miért állítjuk be a színt mindkét ágban?

Mert a ForeColor megtartja a korábbi értékét, és enélkül a sikerüzenet is piros maradhatna.

4. Mi az Interval mértékegysége?

Milliszekundum: az 1000 egy másodperc.

5. Melyik esemény fut a LinkLabel kattintásakor?

A LinkClicked.

6. Miért veszélyes a felhasználó által beírt szöveget a Process.Start-nak adni?

Mert a metódus bármilyen címet vagy programot elindít, ezért a felhasználó káros dolgot is megnyithat. Csak megbízható, a programban rögzített címet használj.

Mit tudsz már?

  • Használod a Label fontos tulajdonságait.
  • Saját metódussal színes visszajelzést adsz.
  • Eltünteted az üzenetet Timerrel.
  • Eldöntöd, mikor melyik visszajelzés illik.
  • LinkLabel segítségével biztonságosan megnyitsz egy weboldalt.

Következő lecke: ErrorProvider, ToolTip és beviteli segítség

A visszajelzés kész. A következő leckében a hibás mezők mellé hibajelzést, a vezérlőkhöz súgószöveget teszünk.