NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.

Lekce 5 - Uložení objektů do CSV v C# .NET - Dokončení

V minulé lekci, Uložení objektů do CSV v C# .NET, jsme načali databázi uživatelů pomocí CSV souborů.

V C# .NET tutoriálu dokončíme naši objektovou formulářovou aplikaci s databází uživatelů s použitím textových souborů ve formátu CSV.

Načtení uživatelů z CSV souboru

Uložení nám funguje, zbývá umět data opětovně načíst.

Třída Databaze

Přesuneme se do třídy Databaze, kde si napíšeme metodu Nacti().

Metoda Nacti()

V metodě Nacti()nejprve načteme řá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 v ní nebyli i uživatelé načtení někdy dříve (kdyby se aplikace někdy rozšiřovala):

public void Nacti()
{
    uzivatele.Clear();
    using (StreamReader sr = new StreamReader(soubor))
    {
        string s;
        while ((s = sr.ReadLine()) != null)
        {
            string[] rozdeleno = s.Split(';');
            string jmeno = rozdeleno[0];
            int vek = int.Parse(rozdeleno[1]);
            DateTime registrovan = DateTime.Parse(rozdeleno[2]);
            PridejUzivatele(jmeno, vek, registrovan);
        }
    }
}

Metoda Uloz()

Zamysleme se nad tím, co se stane, když někdo do jména vloží středník. Aplikace se rozbije. Proto musíme v metodě Uloz() odstraňovat středníky ze jména, přesněji je nahradíme mezerami změnou jediného řádku v metodě Uloz():

string[] hodnoty = { u.Jmeno.Replace(';',' '), u.Vek.ToString(), u.Registrovan.ToShortDateString() };

Kdybychom dělali aplikaci, kde bychom středníky potřebovali, vybrali bychom jiný zástupný znak. Pokud bychom chtěli být dokonalí, vložili bychom takovou hodnotu se středníkem do uvozovek. Poté se však již nejedná o jednoduché CSV a metoda Split() by nám přestala 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.

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

Prezentační vrstva aplikace

Jako první si připravíme nové formulářové prvky neboli ovládací prvky z ToolBoxu. Přidáme:

  • tlačítko Načíst a dále prvky:
  • ListBox pro listUzivatelu, u kterého nastavíme Sorted na true,
  • TextBox pro jméno nového uživatele,
  • NumericUpDown pro věk uživatele,
  • DateTimePicker pro datum registrace.

K ovládacím prvkům přidáme nějaké labely. Tyto prvky můžeme seskupit do prvku GroupBox. V dalším prvku GroupBox budou:

  • Tři labely pro detail uživatele, které pojmenujeme labelJmena, labelVeku a labelRegistrace.
  • Tři labely pro popisek uživatele.
  • Nakonec přidáme tlačítko k přidání uživatele a celou aplikaci můžeme oživit prvkem PictureBox.

Pokud to bylo moc rychlé, nezoufejte, tady je obrázek výsledného formuláře:

Formulář databáze uživatelů v CSV - Soubory v C# .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.

Metoda tlačítka Uložit

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, tedy komunikace s uživatelem, přímo ve třídě Databaze by bylo špatně. Po zachycení výjimky zobrazíme MessageBox s chybou:

try
{
    databaze.Uloz();
}
catch
{
    MessageBox.Show("Databázi se nepodařilo uložit, zkontrolujte přístupová práva k souboru.",
        "Chyba", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

Metoda tlačítka Načíst

Obdobně naklikneme metodu tlačítka Načíst. Po načtení databáze vložíme objekty do prvku ListBox. Ten předtím vymažeme, aby nám tam nezůstávali uživatelé z předešlého načtení:

try
{
    databaze.Nacti();
    listUzivatelu.Items.Clear();
    listUzivatelu.Items.AddRange(databaze.VratVsechny());
}
catch
{
    MessageBox.Show("Databázi se nepodařilo načíst, soubor zřejmě neexisituje.",
        "Chyba", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

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 pro kliknutí na listUzivatelu

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

if (listUzivatelu.SelectedItem != null)
{
    Uzivatel u = (Uzivatel)listUzivatelu.SelectedItem;
    labelJmena.Text = u.Jmeno;
    labelVeku.Text = u.Vek.ToString();
    labelRegistrace.Text = u.Registrovan.ToShortDateString();
}

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

Metoda tlačítka Přidat

Poslední obslužnou metodou pro přidání nového uživatele bude metoda tlačítka Přidat, které si rozklikneme. Prvek musíme přidat jak do databáze, tak do seznamu listUzivatelu:

private void tlacitkoPridat_Click(object sender, EventArgs e)
{
    string jmeno = jmenoTextBox.Text;
    int vek = Convert.ToInt32(vekNumericUpDown.Value);
    DateTime registrovan = registrovanDateTimePicker.Value;
    databaze.PridejUzivatele(jmeno, vek, registrovan);
    listUzivatelu.Items.Add(new Uzivatel(jmeno, vek, registrovan));
}

Konstruktor formuláře

Jsme skoro hotovi. 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é vymažeme text labelů při startu programu. Obojí vykonáme v konstruktoru formuláře, do jmenných prostorů si přídáme using System.IO;:

public Form1()
{
    InitializeComponent();
    labelJmena.Text = "";
    labelVeku.Text = "";
    labelRegistrace.Text = "";
    string cesta = "";
    try
    {
        cesta = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "DatabazeUzivatelu");
        if (!Directory.Exists(cesta))
            Directory.CreateDirectory(cesta);
    }
    catch
    {
         MessageBox.Show("Nepodařilo se vytvořit složku " + cesta + ", zkontrolujte prosím svá oprávnění.",
           "Chyba", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }

    databaze = new Databaze(Path.Combine(cesta, "uzivatele.csv"));
}

A je to :)

Testování

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

Formulář databáze uživatelů v CSV - Soubory v C# .NET

Podobně bychom si mohli napsat i mazání uživatelů, ale to již nechám na vás. A jsme hotoví.

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

 

Předchozí článek
Uložení objektů do CSV v C# .NET
Všechny články v sekci
Soubory v C# .NET
Přeskočit článek
(nedoporučujeme)
Kvíz - Výjimky, text. soubory, formát CSV v C# .NET
Článek pro vás napsal David Hartinger
Avatar
Uživatelské hodnocení:
80 hlasů
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity