MS Office week
Pouze tento týden sleva až 80 % na e-learning týkající se MS Office
50 % bodů zdarma na online výuku díky naší Slevové akci!

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:

Formulár databázy používateľov v CSV

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.

Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!

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:

Formulár databázy používateľov v CSV

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.Visu­alBasic.FileI­O.TextFieldPar­ser. Ď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.


 

Stiahnuť

Stiahnuté 252x (96.09 kB)
Aplikácia je vrátane zdrojových kódov v jazyku VB

 

Predchádzajúci článok
Uloženie objektov do CSV vo VB.NET
Všetky články v sekcii
Súbory a sieť vo Visual Basic .NET
Článok pre vás napísal Michal Žůrek - misaz
Avatar
Ako sa ti páči článok?
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje tvorbě aplikací pro počítače, mobilní telefony, mikroprocesory a tvorbě webových stránek a webových aplikací. Nejraději programuje ve Visual Basicu a TypeScript. Ovládá HTML, CSS, JavaScript, TypeScript, C# a Visual Basic.
Aktivity (1)

 

 

Komentáre

Avatar
Vetva
Člen
Avatar
Vetva:11.11.2013 17:28

Musel som opraviť riadok : Dim rozdeleno() As String = s.Split()
na Dim rozdeleno() As String = s.Split(";") , a už to funguje.
Rád by som však pochopil : u.Registrovan­.ToShortDateS­tring() a následne
DateTime.Parse(roz­deleno(2)) Ďakujem.

Editované 11.11.2013 17:31
 
Odpovedať
11.11.2013 17:28
Avatar
Odpovedá na Vetva
Michal Žůrek - misaz:12.11.2013 17:18

Děkuji za upozornění. Opraveno - čeká na schválení.

Metoda ToShortDateString() vám vrátí datum jako textový řetězec, metoda DateTime.Parse() ho naopak z tohoto řetězce načte.

 
Odpovedať
12.11.2013 17:18
Avatar
Vetva
Člen
Avatar
Odpovedá na Michal Žůrek - misaz
Vetva:12.11.2013 20:58

Je to nutné pretypovať ? Funguje to aj bez toho.

 
Odpovedať
12.11.2013 20:58
Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!
Avatar
Odpovedá na Vetva
Michal Žůrek - misaz:13.11.2013 17:53

ne ale hodí se to když bys náhodou kód překládal do C# nebo naopak.

 
Odpovedať
13.11.2013 17:53
Avatar
dave_23
Redaktor
Avatar
dave_23:21.3.2014 21:57

Ta podmínka na Listu: If listUzivatelu­.SelectedItem <> Nothing Then... mi nefunguje správně. Myslím si, že operátor <> tady asi nejde použít.

 
Odpovedať
21.3.2014 21:57
Avatar
Odpovedá na dave_23
Michal Žůrek - misaz:21.3.2014 22:08

Jo máš pravdu, má tam být Not IsNothink(pro­mennaListu), až budu u pc, opravím to.

 
Odpovedať
21.3.2014 22:08
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 6 správy z 6.