Grafikus C# – Windows Forms tanfolyam › 1.10 lecke Windows Forms · 1.10 lecke 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).Label, LinkLabel és egyszerű visszajelzések

A lecke végére
- a
Labelfontos tulajdonságait használod (AutoSize,TextAlign,ForeColor,BorderStyle); - saját metódussal, két bemenettel (
szoveg,hiba) színes visszajelzést adsz; - az üzenetet
Timersegítségével eltünteted; - eldöntöd, mikor jobb a
MessageBox, és mikor a Label; - a
LinkLabelsegí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.
A Label tulajdonságai
A Label (felirat) a legegyszerűbb vezérlő, de sok mindent beállíthatsz rajta:
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.MiddleCenter: középre).None (nincs), FixedSingle (vékony), Fixed3D (domború).False, nem látszik, de a program tovább használhatja.True, az & jel utáni betű aláhúzott Alt-billentyűvé válik. Szövegben szereplő & jelhez írj && jelet.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ó.
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);
}
}true esetén piros, false esetén zöld lesz az üzenet.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.
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):
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();
}if–else helyett: ha a hiba igaz, az első szín, különben a második.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?
| Szempont | MessageBox | Label 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ő.
A LinkLabel: kattintható hivatkozás
A LinkLabel olyan felirat, amely hivatkozásként viselkedik: aláhúzott, kattintható, és a LinkClicked eseményt váltja ki. Weboldal megnyitásához a Windowsra bízzuk a feladatot a Process.Start metódussal:
private void lnkSugo_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
string cim = "https://learn.microsoft.com/hu-hu/dotnet/desktop/winforms/";
System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(cim) { UseShellExecute = true });
lnkSugo.LinkVisited = true;
}Biztonsági szabály
A Process.Start bármit megnyit, amit megkap. Ezért csak a programodba beírt, megbízható címet add át neki. Soha ne indíts el a felhasználó által beírt szöveget címként vagy programként, mert az veszélyes lehet.
Mit tegyél ide: az ablak egy LinkLabellel („Súgó megnyitása”) kék, aláhúzott szöveggel, és mellette a megnyílt böngészőablak a Microsoft Learn oldalával.Javasolt fájlnév: winforms-1-10-linklabel.webp · Alt szöveg: Egy LinkLabel és a megnyíló weboldal
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. Az Ok és javítás
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. Az Ok és javítás
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. A Ok és javítás
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:
- Felület:
txtNev,btnMent,lblVisszajelzes(AutoSize: False,TextAlign: MiddleLeft),tmrUzenet(Interval: 3000),lnkSugo(Text:Súgó megnyitása). - A Mentés gomb üres névre piros hibaüzenetet ad, különben zöld sikerüzenetet.
- Az üzenet három másodperc múlva eltűnik.
- 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 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ássalUzenet metódus az eltűnő változatban, a btnMent_Click, a tmrUzenet_Tick és az lnkSugo_LinkClicked.
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 A 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 });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 A 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
?: 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.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 A LinkLabel lnkOldal LinkLabel kattintásra nyissa meg a https://www.digitalisfelfedezok.hu oldalt az alapértelmezett böngészőben.Megoldás megnyitása
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.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 A Timer lblUzenet szövege 3 másodperc után tűnjön el egy tmrUzenet Timerrel.Megoldás megnyitása
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.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 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
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.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: A számjegy keresése karakterenként történik a 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
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.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 A szint egy egész szám, 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
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.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. 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ó. Ha Mert a Milliszekundum: az 1000 egy másodperc. A 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.1. Mikor jobb a Label, mint a MessageBox?
2. Mit jelent az AutoSize tulajdonság?
True, a felirat mérete a szöveghez igazodik.3. Miért állítjuk be a színt mindkét ágban?
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?
5. Melyik esemény fut a LinkLabel kattintásakor?
LinkClicked.6. Miért veszélyes a felhasználó által beírt szöveget a Process.Start-nak adni?
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.




