Lekce 5 - Uložení objektů do CSV v C# .NET - Dokončení
V minulé lekci, Uložení objektů do CSV v C# .NET, jsme načali databázi uživatelů pomocí
CSV
souborů.
V C# .NET tutoriálu dokončíme naši objektovou
formulářovou aplikaci s databází uživatelů s použitím textových
souborů ve formátu CSV
.
Načtení uživatelů z CSV souboru
Uložení nám funguje, zbývá umět data opětovně načíst.
Třída Databaze
Přesuneme se do třídy Databaze
, kde si napíšeme metodu
Nacti()
.
Metoda Nacti()
V metodě Nacti()
nejprve načteme řádek po řádku. Každý
řádek rozdělíme metodou Split()
a následně do kolekce
přidáme objekt s příslušnými hodnotami. Před načtením si kolekci
vyprázdníme, aby v ní nebyli i uživatelé načtení někdy dříve (kdyby se
aplikace někdy rozšiřovala):
public void Nacti() { uzivatele.Clear(); using (StreamReader sr = new StreamReader(soubor)) { string s; while ((s = sr.ReadLine()) != null) { string[] rozdeleno = s.Split(';'); string jmeno = rozdeleno[0]; int vek = int.Parse(rozdeleno[1]); DateTime registrovan = DateTime.Parse(rozdeleno[2]); PridejUzivatele(jmeno, vek, registrovan); } } }
Metoda Uloz()
Zamysleme se nad tím, co se stane, když někdo do jména vloží
středník. Aplikace se rozbije. Proto musíme v metodě
Uloz()
odstraňovat středníky ze jména, přesněji je nahradíme
mezerami změnou jediného řádku v metodě Uloz()
:
string[] hodnoty = { u.Jmeno.Replace(';',' '), u.Vek.ToString(), u.Registrovan.ToShortDateString() };
Kdybychom dělali aplikaci, kde bychom středníky potřebovali, vybrali
bychom jiný zástupný znak. Pokud bychom chtěli být dokonalí, vložili
bychom takovou hodnotu se středníkem do uvozovek. Poté se však již nejedná
o jednoduché CSV a metoda Split()
by nám přestala stačit.
Zájemce odkáži na třídu
Microsoft.VisualBasic.FileIO.TextFieldParser
. Dále by se to
samozřejmě dalo řešit jiným formátem.
Třída Databaze
je tedy kompletní. Nyní se zaměříme na
formulářovou část.
Prezentační vrstva aplikace
Jako první si připravíme nové formulářové prvky neboli ovládací prvky z ToolBoxu. Přidáme:
- tlačítko Načíst a dále prvky:
ListBox
prolistUzivatelu
, u kterého nastavímeSorted
natrue
,TextBox
pro jméno nového uživatele,NumericUpDown
pro věk uživatele,DateTimePicker
pro datum registrace.
K ovládacím prvkům přidáme nějaké labely. Tyto prvky můžeme seskupit
do prvku GroupBox
. V dalším prvku GroupBox
budou:
- Tři labely pro detail uživatele, které pojmenujeme
labelJmena
,labelVeku
alabelRegistrace
. - Tři labely pro popisek uživatele.
- Nakonec přidáme tlačítko k přidání
uživatele a celou aplikaci můžeme oživit prvkem
PictureBox
.
Pokud to bylo moc rychlé, nezoufejte, tady je obrázek výsledného formuláře:
V reálu by bylo přidání uživatelů pravděpodobně přítomno v dalším formuláři, který by se zobrazoval jako dialog, ale nám to bude v tutoriálu stačit takto.
Metoda tlačítka Uložit
Z tlačítka Uložit odstraníme vytvoření testovacích
uživatelů. Samotné uložení nyní vložíme do
try
-catch
bloku. Víme totiž, že
finally
, tedy using
blok v naší databázi, výjimky
nepohlcuje, což také chceme a budeme na ně reagovat ve formulářové
části, kam reakce logicky patří. Upozornění na chybu, tedy komunikace s
uživatelem, přímo ve třídě Databaze
by bylo špatně. Po
zachycení výjimky zobrazíme MessageBox
s chybou:
try { databaze.Uloz(); } catch { MessageBox.Show("Databázi se nepodařilo uložit, zkontrolujte přístupová práva k souboru.", "Chyba", MessageBoxButtons.OK, MessageBoxIcon.Error); }
Metoda tlačítka Načíst
Obdobně naklikneme metodu tlačítka Načíst. Po načtení
databáze vložíme objekty do prvku ListBox
. Ten předtím
vymažeme, aby nám tam nezůstávali uživatelé z předešlého načtení:
try { databaze.Nacti(); listUzivatelu.Items.Clear(); listUzivatelu.Items.AddRange(databaze.VratVsechny()); } catch { MessageBox.Show("Databázi se nepodařilo načíst, soubor zřejmě neexisituje.", "Chyba", MessageBoxButtons.OK, MessageBoxIcon.Error); }
V reálu by se načtení vykonalo asi automaticky po spuštění aplikace a uložení po ukončení, pro názornost si to však ponecháme na tlačítkách.
Metoda pro kliknutí na listUzivatelu
Nyní zpracujeme kliknutí na listUzivatelu, které provede zobrazení detailu uživatele do připravených labelů:
if (listUzivatelu.SelectedItem != null) { Uzivatel u = (Uzivatel)listUzivatelu.SelectedItem; labelJmena.Text = u.Jmeno; labelVeku.Text = u.Vek.ToString(); labelRegistrace.Text = u.Registrovan.ToShortDateString(); }
Kód jsme opodmínkovali pro případ, že by nebyl žádný uživatel
vybrán (list by byl prázdný), za řeč stojí přetypování označené
položky na typ Uzivatel
, jelikož ListBox
není
generická kolekce a C# tedy neví, jakého je item typu. Můžeme si
vyzkoušet, že vše funguje.
Metoda tlačítka Přidat
Poslední obslužnou metodou pro přidání nového uživatele bude metoda
tlačítka Přidat, které si rozklikneme. Prvek musíme přidat jak do
databáze, tak do seznamu listUzivatelu
:
private void tlacitkoPridat_Click(object sender, EventArgs e) { string jmeno = jmenoTextBox.Text; int vek = Convert.ToInt32(vekNumericUpDown.Value); DateTime registrovan = registrovanDateTimePicker.Value; databaze.PridejUzivatele(jmeno, vek, registrovan); listUzivatelu.Items.Add(new Uzivatel(jmeno, vek, registrovan)); }
Konstruktor formuláře
Jsme skoro hotovi. Zbývá nám ještě ošetřit cestu k souboru, aby vedla
do složky AppData/
, nikoli do složky s programem. To umíme z
tutoriálu Úvod
do práce se soubory. Také vymažeme text labelů při startu programu.
Obojí vykonáme v konstruktoru formuláře, do jmenných
prostorů si přídáme using System.IO;
:
public Form1() { InitializeComponent(); labelJmena.Text = ""; labelVeku.Text = ""; labelRegistrace.Text = ""; string cesta = ""; try { cesta = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "DatabazeUzivatelu"); if (!Directory.Exists(cesta)) Directory.CreateDirectory(cesta); } catch { MessageBox.Show("Nepodařilo se vytvořit složku " + cesta + ", zkontrolujte prosím svá oprávnění.", "Chyba", MessageBoxButtons.OK, MessageBoxIcon.Error); } databaze = new Databaze(Path.Combine(cesta, "uzivatele.csv")); }
A je to
Testování
Zkusíme přidat nového uživatele:
Podobně bychom si mohli napsat i mazání uživatelů, ale to již nechám na vás. A jsme hotoví.
V následujícím kvízu, Kvíz - Výjimky, text. soubory, formát CSV v C# .NET, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 1333x (82.14 kB)
Aplikace je včetně zdrojových kódů v jazyce C#