5. diel - Uloženie objektov do CSV vo VB.NET časť 2
V minulom dieli seriálu tutoriálov o VB.NET, Uloženie objektov do CSV vo VB.NET , sme načal databázu užívateľov pomocou CSV súborov.
Teraz aplikáciu dokončíme a doladíme.
Načítanie používateľov z CSV súboru
Uloženie nám funguje, zostáva vedieť dáta opätovne načítať. Súbor budeme čítať 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 pri zmene súboru v databáze nezostal ten istý (keby sa aplikácia niekedy rozširovala).
Public Sub Nacti() uzivatele.Clear() 'Otevře soubor pro čtení Using sr As New StreamReader(soubor) Dim s As String While Not sr.EndOfStream 'Rozdělení stringu podle středníků s = sr.ReadLine() Dim rozdeleno() As String = s.Split(";") Dim jmeno = rozdeleno(0) Dim vek = rozdeleno(1) Dim registrovan = DateTime.Parse(rozdeleno(2)) 'přidá uživatele s danými hodnotami PridejUzivatele(jmeno, vek, registrovan) End While End Using End Sub
Trieda databázy je teda kompletná. Teraz sa zameriame na formulárovom časť.
Ako prvý si pripravíme nové formulárové prvky (kontroly z ToolBox). Pridáme tlačidlo načítať, ďalej listbox listUzivatelu, u ktorého nastavíme Sorted na True. Ďalej TextBox na meno nového používateľa, NumericUpDown na jeho vek a DateTimePicker na dátum registrácie. Ku kontrolujeme pridáme nejaké labely. Tieto prvky môžeme zoskupiť do GroupBoxu. V ďalšom GroupBoxu budú 3 labely na detail užívateľa, tie pomenujeme labelJmena, labelVeku a labelRegistrace. Ďalšie 3 labely pridáme ako ich popisok. Pridáme tlačidlo na pridanie používateľa a celú aplikáciu môžeme oživiť PictureBox. Ak to bolo moc 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 tutoriálu stačiť takto.
Z tlačidla Uložiť odstránime vytvorenie testovacích použí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, čo tiež chceme a budeme na ne reagovať vo formulárové časti, kam reakcie logicky patrí. Upozornenie na chybu priamo v triede Databaze by bolo zle. Po zachytení výnimky zobrazíme MessageBox s chybou. Metóda tlačidla bude teda vyzerať takto:
ate Sub tlacitkoUlozit_Click(sender As Object, e As EventArgs) Handles tlacitkoUlozit.Click Try databaze.Uloz() Catch ex As Exception MessageBox.Show("Databázi se nepodařilo uložit, zkontrolujte přístupová práva k souboru.", "Chyba", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try
Obdobne naklikne metódu tlačidla Načítať, iba po načítaní databázy vložíme objekty do listbox. Ten predtým vymastíme, aby nám tam nezostávali používatelia z predošlého načítanie. V reáli by sa načítanie vykonalo asi automaticky po spustení aplikácie a uloženie po ukončení, pre názornosť si to však ponecháme na tlačidlách. Metóda tlačidla Načítať teda vyzerá takto:
Try databaze.Nacti() listUzivatelu.Items.Clear() listUzivatelu.Items.AddRange(databaze.VratVsechny()) Catch ex As Exception MessageBox.Show("Databázi se nepodařilo načíst, soubor zřejmě neexisituje.", "Chyba", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try
Teraz spracujeme kliknutie na listUzivatelu, ktoré vykoná zobrazenie detailu užívateľa do pripravených labelov:
If Not IsNothing( listUzivatelu.SelectedItem) Then Dim u As Uzivatel = listUzivatelu.SelectedItem labelJmena.Text = u.Jmeno labelVeku.Text = u.Vek.ToString() labelRegistrace.Text = u.Registrovan.ToShortDateString() End If
Kód sme opodmínkovali pre prípad, že by nebol žiadny užívateľ vybraný (list by bol prázdny), za reč stojí pretypovanie označené položky na typ Uzivatel, pretože listbox nie je generická kolekcie a VB.NET teda nevie, akého je item typu. Môžete si vyskúšať, že všetko funguje.
Posledné tlačidlo bez metódy je Pridanie nového používateľa. Rozkliknite ho teda, vloženie bude veľmi jednoduché, prvok však musíme pridať ako do databázy, tak do listUzivatelu. Pri zložitejších aplikácií by sme použili tzv. DataBinding, ale nás by to teraz len plietlo.
Private Sub talcitkoPridat_Click(sender As Object, e As EventArgs) Handles talcitkoPridat.Click Dim jmeno As String = jmenoTextbox.Text Dim vek As Integer = vekNumericupdown.Value Dim registrovan As DateTime = registrovanDatetimepicker.Value databaze.PridejUzivatele(jmeno, vek, registrovan) listUzivatelu.Items.Add(New Uzivatel(jmeno, vek, registrovan)) End Sub
Skúsime pridať nového používateľa:
Podobne by sme si mohli napísať aj mazanie užívateľov, ale to už nechám na vás. 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 tutoriálu Úvod do práce so súbormi. Tiež by sme mohli vymazať text labelov pri štarte programu. Oboje vykonáme v konstruktoru formulára, do using si pridáme System.IO.
Public Sub New() InitializeComponent() ' vyprázdnění labelů detailu uživatele labelJmena.Text = "" labelVeku.Text = "" labelRegistrace.Text = "" ' vytvoření složky aplikace v AppData Dim cesta As String = "" Try cesta = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "DatabazeUzivatelu") If Not Directory.Exists(cesta) Then Directory.CreateDirectory(cesta) End If Catch MessageBox.Show("Nepodařilo se vytvořit složku " & cesta & ", zkontrolujte prosím svá oprávnění.", "Chyba", MessageBoxButtons.OK, MessageBoxIcon.[Error]) End Try ' vytvoření databáze databaze = New Databaze(Path.Combine(cesta, "uzivatele.csv")) End Sub
A je to
Naša aplikácia je takmer hotová, ešte sa zamyslíme nad tým, čo sa stane, keď niekto do mena vloží bodkočiarka. Aplikácia sa rozbije. Preto budeme v metóde Uloz () bodkočiarkami z mena odstraňovať. Keby sme robili aplikáciu, kde by sme ich potrebovali (čo sa nestáva príliš často), môžeme vybrať iný zástupný znak. Ak by sme chceli byť dokonalí, vložíme takú hodnotu sa bodkočiarkou do úvodzoviek. Potom sa však už nejde o jednoduché CSV a metóda Split nám prestane stačiť, záujemcov odkázať na triedu Microsoft.VisualBasic.FileIO.TextFieldParser. Ďalej by sa to samozrejme dalo riešiť iným formátom. My si teda bodkočiarkami iba odstráňme, presnejšie ich nahradíme medzerami zmenou jediného riadku v metóde Uloz ():
Dim hodnoty As String() = {u.Jmeno.Replace(";", " "), u.Vek.ToString(), u.Registrovan.ToShortDateString()}
A sme hotoví. Ak vám niečo nešlo úplne hladko, hotový projekt máte ako vždy v prílohe aj so zdrojovým kódom.
Nabudúce, Úvod do XML a zápis Saxe , sa pozrieme na formát XML.
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é 262x (96.09 kB)
Aplikácia je vrátane zdrojových kódov v jazyku VB