Grafikus C# – Windows Forms tanfolyam › 4.1 lecke

Windows Forms · 4.1 · önálló gyakorlás

Önálló feladat I.: Osztálykirándulás – vezérlőelemek és események

Itt nem követsz lépésről lépésre egy leckét, hanem magadnak építesz egy kész alkalmazást. A feladat az 1. fejezet vezérlőit (TextBox, Label, Button, RadioButton, CheckBox, ComboBox, ListBox, MenuStrip, MessageBox) használja, és olyan, mint egy kisebb számonkérés: kapsz egy leírást, egy pontozást és egy időkeretet. Kész kódot nem kapsz, csak támpontokat. A megoldás a te munkád lesz.

  • 120 perc
  • önálló munka
  • 100 pontos feladat
Anime stílusú fiú és lány egy C# programozási feladatot beszél meg

A feladat végére

  • önállóan megtervezel és felépítesz egy többvezérlős Windows Forms alkalmazást;
  • beszédes nevekkel dolgozol, és a kódot rendezetten, metódusokra bontva írod;
  • kezeled az üres, hibás és ismétlődő bevitelt;
  • a vezérlők állapotát a megfelelő tulajdonságból olvasod ki (Text, Checked, SelectedItem);
  • menüt és megerősítő kérdést építesz;
  • a tesztlistával és az önértékelő szempontokkal ellenőrzöd a saját munkádat.

Mielőtt elkezded

Ehhez a feladathoz az 1. fejezet leckéit érdemes ismerned. Ha elakadsz, a megfelelő rész ott részletesen le van írva. Készíts egy tiszta, új projektet, és a megoldás közben csak a saját jegyzeteidet és a korábbi leckéket használd.

1.13 Adatbekérő és kalkulátor →

A feladat leírása

Az osztályfőnök kirándulást szervez, és szüksége van egy kis programra, amellyel a diákok jelentkezhetnek. Készíts egy Osztálykirándulás nevű Windows Forms alkalmazást, amelyben a jelentkező:

  • megadja a nevét, és a program köszönti;
  • kiválasztja, mivel utazik (busz vagy vonat);
  • bejelöli, kér-e ebédet, és hogy van-e szüksége pótjegyre;
  • a legördülő listából kiválasztott helyszíneket felveszi a programlistába, a duplikációkat a program megakadályozza;
  • és a program összefoglalja a jelentkezés adatait.
📷 Képernyőkép helye

Mit tegyél ide: egy példa-tervrajz (rajz vagy drótváz) az ablak elrendezéséről: a név mezője felül, a választó vezérlők középen, a helyszínek és a lista alul, a menüsor és az összefoglaló felirat.Javasolt fájlnév: winforms-4-1-terv.webp · Alt szöveg: Az Osztálykirándulás alkalmazás elrendezési terve

Követelmények és pontozás

RészKövetelményPont
AlapműködésNév bekérése TextBox-ból, a Jelentkezés gomb köszönti a névvel egy MessageBox-ban; üres név esetén figyelmeztet.12
A közlekedés RadioButton-pár (busz, vonat) egy GroupBox-ban; legyen alapértelmezett kijelölés.8
Két CheckBox (ebéd, pótjegy).8
Az összefoglaló Label a gombnyomásra kiírja a nevet, a közlekedést és a bejelölt extrákat.12
ListakezelésComboBox legalább 4 helyszínnel (DropDownList), egy Hozzáad gombbal.10
A kiválasztott helyszín bekerül a ListBox-ba; nincs duplikáció; kiválasztás nélkül figyelmeztet.12
A ListBox mellett egy Kijelölt törlése gomb, amely nem omlik össze, ha nincs kijelölt elem.8
Menü és hibakezelésMenuStrip: File → Új (törli az adatokat), File → Kilépés (megerősítő kérdéssel), About (a készítő neve).14
Beszédes (Name) tulajdonságok előtaggal (txt, btn, rb, chk, cmb, lst, lbl, mi).8
A program nem omlik össze üres, hibás vagy ismétlődő bevitelnél; a kód áttekinthető, felesleges ismétlés nélkül.8

Összesen: 100 pont. Az alapműködés együtt 40 pont, a listakezelés 30, a menü és a hibakezelés 30.

A pontok a sorrendet is mutatják

Haladj az alapműködéstől a bonyolultabb felé. Ha az idő fogy, jobb, ha az alapok hibátlanok, és a menü egyszerűbb, mint ha minden félig működik.

Időbeosztás (120 perc)

PercMit csinálj?
0–10Olvasd el a feladatot, és rajzold fel papíron az ablak elrendezését. Gondold végig, melyik vezérlő melyik adatot adja.
10–30Hozd létre a projektet és az összes vezérlőt. Mindegyiknek adj beszédes (Name) nevet, és állítsd be az alapértelmezett tulajdonságokat (DropDownList, kijelölt RadioButton).
30–50A Jelentkezés gomb: névellenőrzés, köszöntés MessageBox-ban.
50–70A választó vezérlők (RadioButton, CheckBox) kiolvasása, az összefoglaló Label feltöltése.
70–85A ComboBox és a ListBox: hozzáadás, duplikációk kezelése, törlés.
85–100A menü: Új, Kilépés megerősítéssel, About.
100–120A teljes tesztlista végigpróbálása, hibajavítás, tisztázás (nevek, felesleges kód törlése).

Támpontok (kész megoldás nélkül)

Csak azokra a részekre kapsz tippet, ahol a legtöbben elakadnak. A kódot neked kell megírnod.

Hol az adat? Melyik tulajdonság kell?
VezérlőMit olvasol ki?Tulajdonság
TextBoxA beírt névText (használd a Trim()-et)
RadioButtonMelyik van kijelölveChecked (igaz/hamis)
CheckBoxBe van-e jelölveChecked (igaz/hamis)
ComboBoxA választott helyszínSelectedItem (lehet null!) vagy Text
ListBoxA kijelölt sorSelectedIndex (-1, ha nincs)
Duplikáció elkerülése

A ListBox elemei között a lstProgramok.Items.Contains(elem) metódus megmondja, hogy szerepel-e már az elem. Háromféle eset van, ezeket kell kezelned: nincs kiválasztott helyszín, a helyszín már a listában van, és a helyszín még nincs a listában. Melyik feltételt melyik üzenethez használod?

Az összefoglaló összeállítása

A Label szövegét több részből állíthatod össze. A sortörést az Environment.NewLine adja, a bepipált extrákat if feltételekkel fűzheted egy szöveghez. Készíts külön metódust (például OsszefoglaloEpites()), amelynek visszatérési értéke a kész szöveg (string), és a gomb eseménykezelője csak ezt jeleníti meg.

Kilépés megerősítéssel

Az 1.7 leckében látott minta: MessageBox.Show(..., MessageBoxButtons.YesNo) eredményét egy DialogResult változóban tárold, és csak Yes esetén hívd a this.Close() metódust.

Új: az adatok törlése

Az „Új” menüpontnak minden bevitt adatot vissza kell állítania: a TextBox kiürítése (Clear()), a ListBox kiürítése (Items.Clear()), a jelölőnégyzetek kikapcsolása (Checked = false), az alapértelmezett RadioButton visszaállítása és az összefoglaló törlése. Érdemes ezt külön metódusba tenni.

Mintamegoldás

Előbb oldd meg önállóan!

A mintamegoldás csak az ellenőrzésre való. Nem az egyetlen helyes megoldás: ha a tiéd másképp épül fel, de átmegy a tesztlistán, az is jó. Előbb próbálkozz saját kóddal, és csak elakadásnál vagy a végén nyisd meg.

Megoldás: a felület beállításai
Vezérlő(Name)Beállítás
TextBoxtxtNev
ButtonbtnJelentkezesText: Jelentkezés
GroupBoxgrpKozlekedesbenne a két RadioButton
RadioButtonrbBusz, rbVonataz rbBusz Checked: True
CheckBoxchkEbed, chkPotjegyText: Ebédet kérek, Pótjegyet kérek
ComboBoxcmbHelyszinDropDownStyle: DropDownList; Items: Balaton, Bakony, Eger, Pécs
ButtonbtnHozzaad, btnTorolHozzáadás, Kijelölt törlése
ListBoxlstProgramok
LabellblOsszefoglaloAutoSize: False, nagyobb méret
MenuStripmiFile, miUj, miKilepes, miAboutFile: Új, Kilépés; About
Megoldás: Form1.cs (teljes kód)
Form1.csC#
using System;
using System.Windows.Forms;

namespace Osztalykirandulas
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private string OsszefoglaloEpites(string nev)
{
string szoveg = "Név: " + nev + Environment.NewLine;

if (rbBusz.Checked)
{
szoveg = szoveg + "Utazás: busz" + Environment.NewLine;
}
else
{
szoveg = szoveg + "Utazás: vonat" + Environment.NewLine;
}

string extrak = "";

if (chkEbed.Checked)
{
extrak = extrak + "ebéd ";
}

if (chkPotjegy.Checked)
{
extrak = extrak + "pótjegy ";
}

if (extrak.Length == 0)
{
extrak = "nincs ";
}

return szoveg + "Extrák: " + extrak.Trim();
}

private void Alaphelyzet()
{
txtNev.Clear();
rbBusz.Checked = true;
chkEbed.Checked = false;
chkPotjegy.Checked = false;
cmbHelyszin.SelectedIndex = -1;
lstProgramok.Items.Clear();
lblOsszefoglalo.Text = "";
}

private void btnJelentkezes_Click(object sender, EventArgs e)
{
string nev = txtNev.Text.Trim();

if (nev.Length == 0)
{
MessageBox.Show("Add meg a neved!", "Hiányzó adat", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}

MessageBox.Show($"Szia, {nev}! A jelentkezésed rögzítettük.", "Köszöntés");
lblOsszefoglalo.Text = OsszefoglaloEpites(nev);
}

private void btnHozzaad_Click(object sender, EventArgs e)
{
if (cmbHelyszin.SelectedItem == null)
{
MessageBox.Show("Válassz helyszínt!");
}
else if (lstProgramok.Items.Contains(cmbHelyszin.SelectedItem))
{
MessageBox.Show("Ez a helyszín már szerepel a listában.");
}
else
{
lstProgramok.Items.Add(cmbHelyszin.SelectedItem);
}
}

private void btnTorol_Click(object sender, EventArgs e)
{
if (lstProgramok.SelectedIndex >= 0)
{
lstProgramok.Items.RemoveAt(lstProgramok.SelectedIndex);
}
else
{
MessageBox.Show("Előbb jelölj ki egy elemet!");
}
}

private void miUj_Click(object sender, EventArgs e)
{
Alaphelyzet();
}

private void miKilepes_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();
}
}

private void miAbout_Click(object sender, EventArgs e)
{
MessageBox.Show("Osztálykirándulás" + Environment.NewLine + "Készítő: Minta Anna", "About");
}
}
}
Megoldás: miért így épül fel?

Az OsszefoglaloEpites() egy string értéket ad vissza, ezért a gomb eseménykezelője rövid marad. Az Alaphelyzet() külön metódus, hogy az Új menüpont egy sorral visszaállítson mindent. A duplikáció-ellenőrzés három külön ágat használ (nincs kijelölt elem, már szerepel, még nem szerepel). A törlés a SelectedIndex >= 0 feltétellel védi a RemoveAt hívást, a kilépés pedig a DialogResult eredményét vizsgálja.

Tesztlista

Mielőtt kész állapotúnak nyilvánítod a munkát, próbáld ki sorban:

#TesztVárt eredmény
1Jelentkezés üres névvelFigyelmeztetés, nincs köszöntés.
2Jelentkezés két szóközzel a névbenUgyanaz, mint az üres név.
3Jelentkezés helyes névvelKöszöntés a névvel, az összefoglaló kitöltődik.
4A busz majd a vonat kiválasztásaAz összefoglaló a kijelöltet mutatja, a másik kikapcsol.
5Egyik, majd mindkét extra bejelöléseAz összefoglalóban a bejelölt extrák látszanak.
6Hozzáadás helyszín kiválasztása nélkülFigyelmeztetés, nem omlik össze.
7Ugyanazon helyszín kétszeri hozzáadásaMásodszor figyelmeztet, a listában egyszer szerepel.
8Kijelölt törlése kijelölés nélkülFigyelmeztetés, nem omlik össze.
9Kijelölt törlése kijelölésselAz elem eltűnik a listából.
10File → ÚjMinden adat visszaáll az alaphelyzetbe.
11AboutA készítő neve megjelenik.
12File → Kilépés: Nem, majd IgenNem: az ablak nyitva marad. Igen: bezárul.

Gyakori hibák és önértékelés

Ezeken szoktak elcsúszni

Gondold végig, nálad előfordul-e valamelyik. Csak utána nyisd le a magyarázatot.

1. A kiválasztottság a Text tulajdonságból

A RadioButton vagy CheckBox állapotát a Text tulajdonságból próbálod kiolvasni.

Ok és javítás

A Text csak a látható felirat. A kiválasztottságot a Checked igaz/hamis tulajdonság mutatja.

2. NullReferenceException a ComboBoxnál

lstProgramok.Items.Add(cmbHelyszin.SelectedItem.ToString());
Hiba és javítás

Ha nincs kiválasztott helyszín, a SelectedItem értéke null, és a ToString() hívás futás közben hibát okoz. Előbb ellenőrizd: if (cmbHelyszin.SelectedItem != null).

3. Törlés kijelölés nélkül

lstProgramok.Items.RemoveAt(lstProgramok.SelectedIndex);
Hiba és javítás

Kijelölés nélkül a SelectedIndex értéke -1, a RemoveAt(-1) pedig futás közben hibát (ArgumentOutOfRangeException) okoz. Ellenőrizd: if (lstProgramok.SelectedIndex >= 0).

4. Az Új menüpont nem állít vissza mindent

Az Új menüpont után a RadioButton és a CheckBox régi állapota megmarad.

Ok és javítás

Az Új menüpont minden vezérlőt az alaphelyzetbe kell hogy állítson. A bejelölt CheckBox-ok kikapcsolása és az alapértelmezett RadioButton kijelölése is kell a kódban.

5. Elírt vezérlőnév

A kód nem fordul le, mert az (Name) tulajdonság nem egyezik a kódban használt névvel.

Ok és javítás

Fordítási hiba (CS0103). Ellenőrizd a Properties ablakban az (Name) mezőt: a kódban pontosan úgy kell leírni, kis- és nagybetűre is figyelve.

Az értékeléshez ellenőrizd az alábbi szempontokat is:

MűködésA tesztlista mind a 12 pontja teljesül.
HibakezelésÜres, hibás és ismétlődő bevitelre is érthetően reagál a program, és nem omlik össze.
NevekMinden vezérlő előtagos, beszédes nevet kapott.
KódszerkezetA kód metódusokra bontva áttekinthető, nincs kétszer megírt ugyanaz a rész.

Bővítési ötletek, ha kész vagy

Ha maradt időd, próbáld ki valamelyiket:

  • Létszámkorlát: legfeljebb 5 helyszín kerülhessen a listára.
  • Költségszámítás: egy NumericUpDown adja meg a jelentkezők számát, és a program számolja ki a költséget (busz: 2500 Ft/fő, vonat: 3200 Ft/fő, ebéd: 1800 Ft/fő).
  • Színes visszajelzés: a hibaüzenetek legyenek pirosak, a sikerüzenetek zöldek (1.10 lecke).
  • Dátumválasztó: egy DateTimePicker a kirándulás napját adja meg, és a program kiírja, hány nap van hátra (1.6 lecke).

Mit tudsz már?

  • Önállóan megtervezel és felépítesz egy többvezérlős alkalmazást.
  • A vezérlők adatait a megfelelő tulajdonságból olvasod ki.
  • Kezeled az üres, hibás és ismétlődő bevitelt.
  • Menüt és megerősítő kérdést építesz.
  • Tesztlistával értékeled a saját munkádat.

Következő feladat: önálló szövegszerkesztő-projekt

Az első önálló feladaton túl vagy. A következőben a 2. fejezet tudásával egy szövegszerkesztőt építesz.

Hozzászólás Írása

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük