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

Ostatní jazyky Visual Basic .NET Práce se soubory Uložení objektů do CSV ve VB.NET část 2

V minulém dílu seriálu tutoriálů o 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

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

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. Příště se podíváme na formát XML.


 

Stáhnout

Staženo 225x (96.09 kB)
Aplikace je včetně zdrojových kódů v jazyce VB

 

  Aktivity (1)

Článek pro vás napsal Michal Žůrek (misaz)
Avatar
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.

Jak se ti líbí článek?
Celkem (2 hlasů) :
55555


 


Miniatura
Všechny články v sekci
Práce se soubory v Visual Basic .NET
Miniatura
Následující článek
Úvod do XML a zápis SAXem

 

 

Komentáře

Avatar
Vetva
Člen
Avatar
Vetva:

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.

Editováno 11.11.2013 17:31
 
Odpovědět 11.11.2013 17:28
Avatar
Odpovídá na Vetva
Michal Žůrek (misaz):

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.

Odpovědět 12.11.2013 17:18
Nesnáším {}, proto se jim vyhýbám.
Avatar
Vetva
Člen
Avatar
Odpovídá na Michal Žůrek (misaz)
Vetva:

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

 
Odpovědět 12.11.2013 20:58
Avatar
Odpovídá na Vetva
Michal Žůrek (misaz):

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

Odpovědět 13.11.2013 17:53
Nesnáším {}, proto se jim vyhýbám.
Avatar
dave_23
Člen
Avatar
dave_23:

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.

 
Odpovědět 21.3.2014 21:57
Avatar
Odpovídá na dave_23
Michal Žůrek (misaz):

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

Odpovědět 21.3.2014 22:08
Nesnáším {}, proto se jim vyhýbám.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.