Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

5. diel - Uloženie objektov do CSV v C# .NET - Dokončenie

V minulej lekcii, Uloženie objektov do CSV v C# .NET, sme načali databázu užívateľov pomocou CSV súborov.

V dnešnom C# .NET tutoriále dokončíme našu objektovú formulárovú aplikáciu s databázou užívateľov s použitím textových súborov vo formáte CSV.

Načítanie užívateľov z CSV súboru

Uloženie nám funguje, zostáva vedieť dáta opätovne načítať.

Trieda Database

Presunieme sa do triedy Database, kde si napíšeme metódu Load().

Metóda Load()

V metóde Load() najprv načítame 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 v nej neboli aj používatelia načítaní niekedy skôr (keby sa aplikácia niekedy rozširovala):

public void Load()
{
    users.Clear();
    using (StreamReader sr = new StreamReader(file))
    {
        string line;
        while ((line = sr.ReadLine()) != null)
        {
            string[] values = line.Split(';');
            string name = values[0];
            int age = int.Parse(values[1]);
            DateTime registered = DateTime.Parse(values[2]);
            AddUser(name, age, registered);
        }
    }
}

Metóda Save()

Zamyslíme sa nad tým, čo sa stane, keď niekto do mena vloží bodkočiarku. Aplikácia sa rozbije. Preto musíme v metóde Save() odstraňovať bodkočiarky z mena, presnejšie ich nahradíme medzerami zmenou jediného riadku v metóde Save():

string[] values = { u.Name.Replace(';', ' '), u.Age.ToString(), u.Registered.ToShortDateString() };

Keby sme robili aplikáciu, kde by sme ich potrebovali, vybrali by sme iný zástupný znak. Ak by sme chceli byť dokonalí, vložili by sme takú hodnotu so bodkočiarkou do úvodzoviek. Potom však už nejde o jednoduché CSV a metóda Split() by nám prestala stačiť. Záujemca odkážem na triedu Microsoft.VisualBasic.FileIO.TextFieldParser. Ďalej by sa to samozrejme dalo riešiť iným formátom.

Trieda Database je teda kompletná. Teraz sa zameriame na formulárovú časť.

Prezentačná vrstva aplikácie

Ako prvé si pripravíme nové formulárové prvky alebo ovládacie prvky z ToolBoxu. Pridáme:

  • tlačidlo Load, ďalej prvky:
  • ListBox pre userListBox, u ktorého nastavíme Sorted na true,
  • TextBox pre meno nového používateľa,
  • NumericUpDown pre vek používateľa,
  • DateTimePicker pre dátum registrácie.

K ovládacím prvkom pridáme nejaké labely. Tieto prvky môžeme zoskupiť do prvku GroupBox. V ďalšom prvku GroupBox budú:

  • Tri labely pre detail užívateľa, tie pomenujeme nameLabel, ageLabel a registeredLabel.
  • Tri labely pre popis používateľa.
  • Nakoniec pridáme tlačidlo na pridanie užívateľa a celú aplikáciu môžeme oživiť prvkom PictureBox.

Pokiaľ to bolo veľmi rýchle, nezúfajte, tu je obrázok výsledného formulára:

Formulár databázy používateľov v CSV - Súbory v C# .NET

V reáli by bolo pridanie užívateľov pravdepodobne prítomné v ďalšom formulári, ktorý by sa zobrazoval ako dialóg, ale nám to bude v tutoriáli stačiť takto.

Metóda tlačidla Save

Z tlačidla Save odstránime vytvorenie testovacích užívateľov. Samotné uloženie teraz vložíme do trycatch bloku. Vieme totiž, že finally, teda using blok v našej databáze, výnimky nepohlcuje. To tiež chceme a budeme na ne reagovať vo formulárovej časti, kam reakcia logicky patrí. Upozornenie na chybu, teda komunikácia s užívateľom, priamo v triede Database by bolo zle. Po zachytení výnimky zobrazíme MessageBox s chybou:

try
{
    database.Save();
}
catch
{
    MessageBox.Show("Unable to save the database, check the file's access privileges.",
                        "Error"", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

Metóda tlačidla Load

Obdobne naklikneme metódu tlačidla Load. Po načítaní databázy vložíme objekty do prvku ListBox. Ten predtým vymažeme, aby nám tam nezostávali používatelia z predošlého načítania:

try
{
    database.Load();
    userListBox.Items.Clear();
    userListBox.Items.AddRange(database.ReturnAll());
}
catch
{
    MessageBox.Show("Unable to load the database. The file might not exist.",
        "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

V reáli by sa načítanie vykonalo asi automaticky po spustení aplikácie a uložení po ukončení, pre názornosť si to však ponecháme na tlačidlách.

Metóda pre kliknutie na userListBox

Teraz spracujeme kliknutie na userListBox, ktoré vykoná zobrazenie detailu užívateľa do pripravených labelov:

if (userListBox.SelectedItem != null)
{
    User u = (User)userListBox.SelectedItem;
    nameLabel.Text = u.Name;
    ageLabel.Text = u.Age.ToString();
    registeredLabel.Text = u.Registered.ToShortDateString();
}

Kód sme opodmienkovali pre prípad, že by nebol žiadny užívateľ vybraný, list by bol prázdny. Za reč stojí pretypovanie označenej položky na typ User, pretože ListBox nie je generická kolekcia a C# teda nevie, akého je item typu. Môžeme si vyskúšať, že všetko funguje.

Metóda tlačidla Add

Poslednou obslužnou metódou pre pridanie nového používateľa bude metóda tlačidla Add, ktorý si rozklikneme. Prvok musíme pridať ako do databázy, tak do seznamu userListBox:

string name = fullNameTextBox.Text;
int age = Convert.ToInt32(ageNumericUpDown.Value);
DateTime registered = registeredDateTimePicker.Value;
database.AddUser(name, age, registered);
userListBox.Items.Add(new User(name, age, registered));

Konštruktor formulára

Sme skoro hotoví. 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 lekcie Úvod do práce so súbormi. Tiež vymažeme text labelov pri štarte programu. Oboje vykonáme v konštruktore formulára, do menných priestorov si pridáme using System.IO:

public Form1()
{
    InitializeComponent();
    nameLabel.Text = "";
    ageLabel.Text = "";
    registeredLabel.Text = "";
    string path = "";
    try
    {
        path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "UserDatabase");
        if (!Directory.Exists(path))
            Directory.CreateDirectory(path);
    }
    catch
    {
        MessageBox.Show("Unable to create folder " + path + ", check your user privileges.",
          "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    database = new Database(Path.Combine(path, "users.csv"));
}

A je to :)

Testovanie

Skúsime pridať nového používateľa:

Formulár databázy používateľov v CSV - Súbory v C# .NET

Podobne by sme si mohli napísať aj mazanie používateľov, ale to už nechám na vás. A sme hotoví.

V nasledujúcom kvíze, Kvíz - Výnimky, text. súbory, formát CSV v C# .NET, si vyskúšame nadobudnuté skúsenosti z predchádzajúcich lekcií.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 0x (149.94 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

 

Predchádzajúci článok
Uloženie objektov do CSV v C# .NET
Všetky články v sekcii
Súbory v C# .NET
Preskočiť článok
(neodporúčame)
Kvíz - Výnimky, text. súbory, formát CSV v C# .NET
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
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 sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity