Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 5 - Uložení objektů do CSV ve VB.NET část 2

V minulém dílu seriálu tutoriálů o VB.NET, Uložení objektů do CSV ve VB.NET, jsme načali databázi uživatelů pomocí CSV souborů.

Nyní aplikaci dokončíme a doladíme.

Načtení uživatelů z CSV souboru

Uložení nám funguje, zbývá umět data opětovně načíst. Soubor budeme číst řá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 při změně souboru v databázi nezůstal ten samý (kdyby se aplikace někdy rozšiřovala).

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

Třída databáze je tedy kompletní. Nyní se zaměříme na formulářovou část.

Jako první si připravíme nové formulářové prvky (kontroly z ToolBoxu). Přidáme tlačítko načíst, dále ListBox listUzivatelu, u kterého nastavíme Sorted na True. Dále TextBox na jméno nového uživatele, NumericUpDown na jeho věk a DateTimePicker na datum registrace. Ke kontrolům přidáme nějaké labely. Tyto prvky můžeme seskupit do GroupBoxu. V dalším GroupBoxu budou 3 labely na detail uživatele, ty pojmenujeme labelJmena, labelVeku a labelRegistrace. Další 3 labely přidáme jako jejich popisek. Přidáme tlačítko k přidání uživatele a celou aplikaci můžeme oživit PictureBoxem. Pokud to bylo moc rychlé, nezoufejte, tady je obrázek výsledného formuláře:

Formulář databáze uživatelů v CSV - Soubory ve VB.NET

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.

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 přímo ve třídě Databaze by bylo špatně. Po zachycení výjimky zobrazíme MessageBox s chybou. Metoda tlačítka bude tedy vypadat 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

Obdobně naklikneme metodu tlačítka Načíst, pouze po načtení databáze vložíme objekty do ListBoxu. Ten předtím vymažeme, aby nám tam nezůstávali uživatelé z předešlého načtení. 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 tlačítka Načíst tedy vypadá 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

Nyní zpracujeme kliknutí na listUzivatelu, které provede zobrazení detailu uživatele do připravených labelů:

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 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 VB.NET tedy neví, jakého je item typu. Můžete si vyzkoušet, že vše funguje.

Poslední tlačítko bez metody je Přidání nového uživatele. Rozklikneme ho tedy, vložení bude velmi jednoduché, prvek ovšem musíme přidat jak do databáze, tak do listUzivatelu. U složitějších aplikací bychom použili tzv. databinding, ale nás by to nyní jen pletlo.

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

Zkusíme přidat nového uživatele:

Formulář databáze uživatelů v CSV - Soubory ve VB.NET

Podobně bychom si mohli napsat i mazání uživatelů, ale to již nechám na vás. 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é bychom mohli vymazat text labelů při startu programu. Obojí vykonáme v konstruktoru formuláře, do using si přidá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še aplikace je téměř hotová, ještě se zamyslíme nad tím, co se stane, když někdo do jména vloží středník. Aplikace se rozbije. Proto budeme v metodě Uloz() středníky ze jména odstraňovat. Kdybychom dělali aplikaci, kde bychom je potřebovali (což se nestává příliš často), můžeme vybrat jiný zástupný znak. Pokud bychom chtěli být dokonalí, vložíme takovou hodnotu se středníkem do uvozovek. Poté se však již nejedná o jednoduché CSV a metoda Split nám přestane stačit, zájemce odkáži na třídu Microsoft.Visu­alBasic.FileI­O.TextFieldPar­ser. Dále by se to samozřejmě dalo řešit jiným formátem. My si tedy středníky pouze odstraňme, přesněji je nahradíme mezerami změnou jediného řádku v metodě Uloz():

Dim hodnoty As String() = {u.Jmeno.Replace(";", " "), u.Vek.ToString(), u.Registrovan.ToShortDateString()}

A jsme hotoví. Pokud vám něco nešlo úplně hladce, hotový projekt máte jako vždy v příloze i se zdrojovým kódem.

V následujícím kvízu, Kvíz - Výjimky, text. soubory, formát CSV ve VB.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 261x (96.09 kB)
Aplikace je včetně zdrojových kódů v jazyce VB

 

Předchozí článek
Uložení objektů do CSV ve VB.NET
Všechny články v sekci
Soubory ve VB.NET
Přeskočit článek
(nedoporučujeme)
Kvíz - Výjimky, text. soubory, formát CSV ve VB.NET
Článek pro vás napsal Michal Žůrek - misaz
Avatar
Uživatelské hodnocení:
5 hlasů
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