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:

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:

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.VisualBasic.FileIO.TextFieldParser. 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 263x (96.09 kB)
Aplikace je včetně zdrojových kódů v jazyce VB