5. diel - Uloženie objektov do CSV v C# .NET - Dokončenie
V predchádzajúcej lekcii, Uloženie objektov do CSV v C# .NET, sme načali databázu užívateľov pomocou CSV súborov.
V dnešnej lekcii C# .NET dokončíme našu objektovú
formulárovú aplikáciu s databázou používateľov s použitím
textových súborov vo formáte CSV.
Načítanie používateľov z CSV súboru
Uloženie nám funguje, zostáva 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
s bodkočiarkou do úvodzoviek. Potom však už nejde o jednoduché CSV a
metóda Split() by nám už nestačila. Záujemcov 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:
ListBoxpreuserListBox, pri ktorom nastavímeSortednatrue,TextBoxpre meno nového používateľa,NumericUpDownpre vek používateľa,DateTimePickerpre 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 používateľa, tie pomenujeme
nameLabel,ageLabelaregisteredLabel. - Tri labely pre popis používateľa.
- Nakoniec pridáme tlačidlo na pridanie
používateľa a celú aplikáciu môžeme oživiť prvkom
PictureBox.
Ak to bolo veľmi rýchle, nezúfajte, tu je obrázok výsledného formulára:

V reáli by bolo pridanie používateľov pravdepodobne prítomné v ďalšom formulári, ktorý by sa zobrazoval ako dialóg, ale nám to bude v kurze stačiť takto.
Metóda tlačidla Save
Z tlačidla Save odstránime vytvorenie testovacích
používateľov. Samotné uloženie teraz vložíme do bloku try
– catch. Vieme totiž, že finally, teda blok
using 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 použí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 použí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 používateľ
vybraný a 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ť, či
všetko funguje.
Metóda tlačidla Add
Poslednou obslužnou metódou na 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 zoznamu 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é 10x (150.42 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

David sa informačné technológie naučil na