Cvičenie 8
Cieľom dnešného cvičenia bude vytvoriť UI pre knižnicu, ktorú sme robili minule.
1.0
Vytvorte si nový Windows forms projekt (v tom istom solution ako minule) a pridajte si do referencií knižnicu, čo ste robili minulý týždeň.
Pridajte si na formulár DataGridView, tento nástroj slúži na automatické zobrazenie dát obsiahnutých v kolekcií - informácie o zamestnancoch, ktoré ste si pripravili na minulom cvičení. Na to, aby sme však dáta vedeli zobraziť si potrebujeme pripraviť niekoľko vecí. Pre jednoduchosť sa dnes nebudeme zaoberať s obojsmerným previazaním dát medzi DataGridView a kolekciou, poskytujúcou dáta (v tomto prípade by sa nám zmeny v DataGridView prejavili priamo v kolekcií, napr. BindingList).
Budeme potrebovať:
- referenciu na objekt CompanyEmployees
- BindingSource - slúži na zaobalenie kolekcie pre využitie DataGridView; BindingSource obsahuje neparametrický konštruktor, ktorý použite
následne si nastavte zdroj dát pre DataGridView:
bindingSource.DataSource = companyEmployees.GetEmployees();
DataGridViewEmplyees.DataSource = bindingSource;
Nevykonajte túto akciu priamo pri načítaní formuláru, ale priajte si tlačítko, ktoré je zodpovedné za zistenie cesty k súboru (OpenFileDialog) a predaniu tejto cesty knižnici, ktorá ho otvorí a načíta. Následne zobrazte obsah na obrazovke.
OpenFileDialog dokumentácia - https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.openfiledialog?view=netframework-4.8
1.1
Pridajte si na formulár TextBox, ktorý bude slúžiť ako vyhľadávanie - pridajte si preň event TextChanged a v rámci tohoto eventu zabezpečte, že sa nám budú zobrazené hodnoty filtrovať - uvažujte, že zadaný reťazec môže byť časť mena alebo priezviska (tzn. nemusíte hľadať osobitne). Nástroje, ktoré k tomu potrebujete:
GetEmployees(Func<Employee, bool> predicate)
- vlastná lambda fukcia, ktorá vykonáva filtrovanie - stačí, ak je priamo ako parameter v GetEmployees - GetEmployees(x => ...)
String.Contains(substring)
- fragment kódu na aktualizovanie DataGridView (keďže nemáme automatické aktualizovanie)
bindingSource.DataSource = employees.GetEmployees(x => ...); //nie je nutné, ak sa nemení filter
bindingSource.ResetBindings(false); // false -> metadata nezmenené, ak by ste sem dali úplne novú kolekciu, napr. Items / Users, trebalo by nastaviť na true
2.0
Pridajte si nový formulár - FormEditEmployee, pridajte si do neho niekoľko TextBox-ov, pre všetky hodnoty, ktoré má v sebe Employee (na popisky použite komponent Label). Pridajte si ešte dva tlačítka - submit a cancel. Následne si pridajte konštruktor s jedným parametrom typu Employee (pozor, v tomto prípade chceme pracovať s týmto konkrétnym zamestnancom, nie jeho kópiou, teda referencia (pointer) musí zostať nezmenená).
2.1
Pridajte si do DataGridView event pre DoubleClick, v ktorom vytvoríte formulár a umožníte editáciu zvolených hodnôt:
dataGridView.CurrentRow.DataBoundItem
nám vráti referenciu na objekt ktorý je v riadku, na ktorý sme dali dvojklik. Pozor, DataBoundItem je triedy object - treba ho správne pretypovať na Employee.
Form obsahuje v sebe property DialogResult
- táto slúži na predanie informácie o úspechu / neúspechu daného formuláru - napr. či užívateľ potvrdil alebo zrušil zmenu.
V rámci akcií tlačidiel Submit a Cancel, okrem iného, nastavte túto hodnotu na DialogResult.OK
/ DialogResult.Cancel
a zavolajte this.Close();
Otvorte si formulár z predchádzajúceho kroku pomocou:
using (FormEditEmployee form = new FormEditEmployee(employee))
{
form.ShowDialog(); //nutné zavolať Dispose alebo použiť IDisposable pattern
if (form.DialogResult == DialogResult.OK)
{
...
}
else if (form.DialogResult == DialogResult.Cancel)
{
...
}
}
//v prípade, že chcete mať na sebe nezávislé okná, je potrebné použiť
form.Show(); //teraz toto nechceme
//následne
form.Close();
Pomocou Null-conditional operator zabezpečte, aby neskončil program chybou, ak sa pokúsite zobraziť properties zamestnanca, keď nemá hodnotu (null).
Zabezpečte, aby sa pri dvojkliku na prázdny riadok rovnako otvoril formulár ale po jeho zavretí sa nám pridá nový užívateľ - na získanie nového užívateľa môžete vytvoriť metódu v rámci FormEditEmployee, nepridávajte ho tam však do employees.