|
|
|
# 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:
|
|
|
|
```csharp
|
|
|
|
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)
|
|
|
|
|
|
|
|
```csharp
|
|
|
|
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:
|
|
|
|
|
|
|
|
```csharp
|
|
|
|
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();
|
|
|
|
```
|
|
|
|
|
|
|
|
Pozrite si https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/member-access-operators#null-conditional-operators--and-
|
|
|
|
|
|
|
|
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.
|
|
|
|
|