Grafikus C# – Windows Forms tanfolyam › 4.1 lecke Windows Forms · 4.1 · önálló gyakorlás 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.Önálló feladat I.: Osztálykirándulás – vezérlőelemek és események

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.
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.
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ész | Követelmény | Pont |
|---|---|---|
| Alapműködés | Né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és | ComboBox 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és | MenuStrip: 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)
| Perc | Mit csinálj? |
|---|---|
| 0–10 | Olvasd el a feladatot, és rajzold fel papíron az ablak elrendezését. Gondold végig, melyik vezérlő melyik adatot adja. |
| 10–30 | Hozd 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–50 | A Jelentkezés gomb: névellenőrzés, köszöntés MessageBox-ban. |
| 50–70 | A választó vezérlők (RadioButton, CheckBox) kiolvasása, az összefoglaló Label feltöltése. |
| 70–85 | A ComboBox és a ListBox: hozzáadás, duplikációk kezelése, törlés. |
| 85–100 | A menü: Új, Kilépés megerősítéssel, About. |
| 100–120 | A 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. A A Az 1.7 leckében látott minta: Az „Új” menüpontnak minden bevitt adatot vissza kell állítania: a TextBox kiürítése (Hol az adat? Melyik tulajdonság kell?
Vezérlő Mit olvasol ki? Tulajdonság TextBox A beírt név Text (használd a Trim()-et)RadioButton Melyik van kijelölve Checked (igaz/hamis)CheckBox Be van-e jelölve Checked (igaz/hamis)ComboBox A választott helyszín SelectedItem (lehet null!) vagy TextListBox A kijelölt sor SelectedIndex (-1, ha nincs)Duplikáció elkerülése
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
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
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
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 |
|---|---|---|
| TextBox | txtNev | |
| Button | btnJelentkezes | Text: Jelentkezés |
| GroupBox | grpKozlekedes | benne a két RadioButton |
| RadioButton | rbBusz, rbVonat | az rbBusz Checked: True |
| CheckBox | chkEbed, chkPotjegy | Text: Ebédet kérek, Pótjegyet kérek |
| ComboBox | cmbHelyszin | DropDownStyle: DropDownList; Items: Balaton, Bakony, Eger, Pécs |
| Button | btnHozzaad, btnTorol | Hozzáadás, Kijelölt törlése |
| ListBox | lstProgramok | |
| Label | lblOsszefoglalo | AutoSize: False, nagyobb méret |
| MenuStrip | miFile, miUj, miKilepes, miAbout | File: Új, Kilépés; About |
Megoldás: Form1.cs (teljes kód)
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:
| # | Teszt | Várt eredmény |
|---|---|---|
| 1 | Jelentkezés üres névvel | Figyelmeztetés, nincs köszöntés. |
| 2 | Jelentkezés két szóközzel a névben | Ugyanaz, mint az üres név. |
| 3 | Jelentkezés helyes névvel | Köszöntés a névvel, az összefoglaló kitöltődik. |
| 4 | A busz majd a vonat kiválasztása | Az összefoglaló a kijelöltet mutatja, a másik kikapcsol. |
| 5 | Egyik, majd mindkét extra bejelölése | Az összefoglalóban a bejelölt extrák látszanak. |
| 6 | Hozzáadás helyszín kiválasztása nélkül | Figyelmeztetés, nem omlik össze. |
| 7 | Ugyanazon helyszín kétszeri hozzáadása | Másodszor figyelmeztet, a listában egyszer szerepel. |
| 8 | Kijelölt törlése kijelölés nélkül | Figyelmeztetés, nem omlik össze. |
| 9 | Kijelölt törlése kijelöléssel | Az elem eltűnik a listából. |
| 10 | File → Új | Minden adat visszaáll az alaphelyzetbe. |
| 11 | About | A készítő neve megjelenik. |
| 12 | File → Kilépés: Nem, majd Igen | Nem: 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 A Text tulajdonságból próbálod kiolvasni.Ok és javítás
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. Az Új menüpont minden vezérlőt az alaphelyzetbe kell hogy állítson. A bejelölt Ok és javítás
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 Fordítási hiba ((Name) tulajdonság nem egyezik a kódban használt névvel.Ok és javítás
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:
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
NumericUpDownadja 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
DateTimePickera 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.




