5. diel - Uloženie objektov do CSV v C# .NET - Dokončenie
V minulej lekcii, Uloženie objektov do CSV v C# .NET, sme načali databázu užívateľov pomocou CSV súborov.
V dnešnom C# .NET tutoriále dokončíme našu objektovú
formulárovú aplikáciu s databázou užívateľov s použitím
textových súborov vo formáte CSV
.
Načítanie užívateľov z CSV súboru
Uloženie nám funguje, zostáva vedieť dáta opätovne načítať.
Trieda Database
Presunieme sa do triedy Database
, kde si napíšeme metódu
Load()
.
Metóda Load()
V metóde Load()
najprv načítame riadok po riadku. Každý
riadok rozdelíme metódou Split()
a následne do kolekcie pridáme
objekt s príslušnými hodnotami. Pred načítaním si kolekciu vyprázdnime,
aby v nej neboli aj používatelia načítaní niekedy skôr (keby sa aplikácia
niekedy rozširovala):
public void Load() { users.Clear(); using (StreamReader sr = new StreamReader(file)) { string line; while ((line = sr.ReadLine()) != null) { string[] values = line.Split(';'); string name = values[0]; int age = int.Parse(values[1]); DateTime registered = DateTime.Parse(values[2]); AddUser(name, age, registered); } } }
Metóda Save()
Zamyslíme sa nad tým, čo sa stane, keď niekto do mena vloží
bodkočiarku. Aplikácia sa rozbije. Preto musíme v metóde
Save()
odstraňovať bodkočiarky z mena, presnejšie ich
nahradíme medzerami zmenou jediného riadku v metóde Save()
:
string[] values = { u.Name.Replace(';', ' '), u.Age.ToString(), u.Registered.ToShortDateString() };
Keby sme robili aplikáciu, kde by sme ich potrebovali, vybrali by sme iný
zástupný znak. Ak by sme chceli byť dokonalí, vložili by sme takú hodnotu
so bodkočiarkou do úvodzoviek. Potom však už nejde o jednoduché CSV a
metóda Split()
by nám prestala stačiť. Záujemca odkážem na
triedu Microsoft.VisualBasic.FileIO.TextFieldParser
. Ďalej by sa
to samozrejme dalo riešiť iným formátom.
Trieda Database
je teda kompletná. Teraz sa zameriame na
formulárovú časť.
Prezentačná vrstva aplikácie
Ako prvé si pripravíme nové formulárové prvky alebo ovládacie prvky z ToolBoxu. Pridáme:
- tlačidlo Load, ďalej prvky:
ListBox
preuserListBox
, u ktorého nastavímeSorted
natrue
,TextBox
pre meno nového používateľa,NumericUpDown
pre vek používateľa,DateTimePicker
pre dátum registrácie.
K ovládacím prvkom pridáme nejaké labely. Tieto prvky môžeme zoskupiť
do prvku GroupBox
. V ďalšom prvku GroupBox
budú:
- Tri labely pre detail užívateľa, tie pomenujeme
nameLabel
,ageLabel
aregisteredLabel
. - Tri labely pre popis používateľa.
- Nakoniec pridáme tlačidlo na pridanie
užívateľa a celú aplikáciu môžeme oživiť prvkom
PictureBox
.
Pokiaľ to bolo veľmi rýchle, nezúfajte, tu je obrázok výsledného formulára:
V reáli by bolo pridanie užívateľov pravdepodobne prítomné v ďalšom formulári, ktorý by sa zobrazoval ako dialóg, ale nám to bude v tutoriáli stačiť takto.
Metóda tlačidla Save
Z tlačidla Save odstránime vytvorenie testovacích užívateľov.
Samotné uloženie teraz vložíme do try
– catch
bloku. Vieme totiž, že finally
, teda using
blok v
našej databáze, výnimky nepohlcuje. To tiež chceme a budeme na ne reagovať
vo formulárovej časti, kam reakcia logicky patrí. Upozornenie na chybu, teda
komunikácia s užívateľom, priamo v triede Database
by bolo zle.
Po zachytení výnimky zobrazíme MessageBox
s chybou:
try { database.Save(); } catch { MessageBox.Show("Unable to save the database, check the file's access privileges.", "Error"", MessageBoxButtons.OK, MessageBoxIcon.Error); }
Metóda tlačidla Load
Obdobne naklikneme metódu tlačidla Load. Po načítaní databázy
vložíme objekty do prvku ListBox
. Ten predtým vymažeme, aby
nám tam nezostávali používatelia z predošlého načítania:
try { database.Load(); userListBox.Items.Clear(); userListBox.Items.AddRange(database.ReturnAll()); } catch { MessageBox.Show("Unable to load the database. The file might not exist.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); }
V reáli by sa načítanie vykonalo asi automaticky po spustení aplikácie a uložení po ukončení, pre názornosť si to však ponecháme na tlačidlách.
Metóda pre kliknutie na userListBox
Teraz spracujeme kliknutie na userListBox, ktoré vykoná zobrazenie detailu užívateľa do pripravených labelov:
if (userListBox.SelectedItem != null) { User u = (User)userListBox.SelectedItem; nameLabel.Text = u.Name; ageLabel.Text = u.Age.ToString(); registeredLabel.Text = u.Registered.ToShortDateString(); }
Kód sme opodmienkovali pre prípad, že by nebol žiadny užívateľ
vybraný, list by bol prázdny. Za reč stojí pretypovanie označenej položky
na typ User
, pretože ListBox
nie je generická
kolekcia a C# teda nevie, akého je item typu. Môžeme si vyskúšať, že
všetko funguje.
Metóda tlačidla Add
Poslednou obslužnou metódou pre pridanie nového používateľa bude
metóda tlačidla Add, ktorý si rozklikneme. Prvok musíme pridať ako
do databázy, tak do seznamu userListBox
:
string name = fullNameTextBox.Text; int age = Convert.ToInt32(ageNumericUpDown.Value); DateTime registered = registeredDateTimePicker.Value; database.AddUser(name, age, registered); userListBox.Items.Add(new User(name, age, registered));
Konštruktor formulára
Sme skoro hotoví. Zostáva nám ešte ošetriť cestu k súboru, aby viedla
do zložky AppData/
, nie do zložky s programom. To vieme z lekcie
Úvod
do práce so súbormi. Tiež vymažeme text labelov pri štarte programu.
Oboje vykonáme v konštruktore formulára, do menných
priestorov si pridáme using System.IO
:
public Form1() { InitializeComponent(); nameLabel.Text = ""; ageLabel.Text = ""; registeredLabel.Text = ""; string path = ""; try { path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "UserDatabase"); if (!Directory.Exists(path)) Directory.CreateDirectory(path); } catch { MessageBox.Show("Unable to create folder " + path + ", check your user privileges.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } database = new Database(Path.Combine(path, "users.csv")); }
A je to
Testovanie
Skúsime pridať nového používateľa:
Podobne by sme si mohli napísať aj mazanie používateľov, ale to už nechám na vás. A sme hotoví.
V nasledujúcom kvíze, Kvíz - Výnimky, text. súbory, formát CSV v C# .NET, si vyskúšame nadobudnuté skúsenosti z predchádzajúcich lekcií.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 1x (149.94 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#