Exercițiu
Construiești un catalog de cărți cu o arhitectură separată în straturi. Datele trăiesc într-o clasă statică FakeDatabase, care simulează o sursă de date externă. Repository-ul este un intermediar care expune operațiile CRUD către restul aplicației. Formularele de UI nu accesează niciodată FakeDatabase direct.
Modelul, baza de date și repository-ul
Enumerația GenCarte:
Valorile:
Roman,Stiinta,Fictiune,Biografie,Tehnic,Altele
Clasa Carte:
Guid Idstring Titlustring Autorint AnAparitieGenCarte Gen
Clasa statică FakeDatabase:
O singură proprietate statică:
static List<Carte> Carti, inițializată cu câteva cărți de testNu conține nicio logică, este doar un container de date
Clasa CarteRepository:
Implementează metodele CRUD care accesează exclusiv FakeDatabase.Carti:
List<Carte> GetAll()- returnează toate cărțile din listăCarte GetById(Guid id)- returnează cartea cu id-ul dat saunullvoid Add(Carte c)- adaugă înFakeDatabase.Cartivoid Update(Carte c)- înlocuiește cartea cu acelașiIdvoid Delete(Guid id)- elimină cartea cu id-ul dat
Repository-ul nu conține validare și nu știe nimic despre UI.
Fereastra principală cu ListView
ListViewPe Form1 adaugă:
Un
ListView(lvCarti) configurat în modulDetailscu coloanele:Titlu,Autor,An,Gencu lățimile 30%, 30%, 20% și 20% (folosește proprietatealvCarti.ClientSize.Width)Trei butoane:
btnAdauga,btnEditeaza,btnStergeUn
Labelde status (lblStatus)
Configurează lvCarti:
View = DetailsFullRowSelect = trueMultiSelect = falseGridLines = trueAllowColumnReorder = true
Declară în Form1 un CarteRepository privat și instanțiează-l în constructor.
Implementează metoda RefreshLista() care golește lvCarti și repopulează din repository.GetAll(). Stochează referința la obiectul Carte în proprietatea Tag a fiecărui ListViewItem.
Adaugă coloanele și apelează RefreshLista() în Form1_Load. Dezactivează btnEditeaza și btnSterge la pornire.
Formularul secundar FormCarte
FormCartePe FormCarte adaugă:
TextBoxpentru Titlu (txtTitlu)TextBoxpentru Autor (txtAutor)NumericUpDownpentru An apariție (numAn) - minim 1000, maxim anul curentComboBoxpentru Gen (cmbGen) - populat din enum cuEnum.GetValuesButoane
btnOkșibtnAnuleaza(legate laAcceptButtonșiCancelButtonaleFormCarte)Un
ErrorProvider(epCarte)
FormCarte primește în constructor doar Guid? id - null pentru adăugare, id-ul cărții pentru editare. Instanțiază propriul CarteRepository intern.
În Form_Load:
Dacă
idestenull: mod adăugare, câmpuri goale,Text = "Carte nouă"Dacă
idare valoare: mod editare, completează câmpurile dinrepository.GetById(id.Value),Text = "Editează carte"
La click pe btnOk:
Validează câmpurile cu
ErrorProvider(Titlu și Autor obligatorii, An și Preț numere valide)Dacă adăugare: creează un
Carteși apeleazărepository.Add()Dacă editare: preia obiectul cu
GetById, modifică proprietățile, apeleazărepository.Update()Setează
this.DialogResult = DialogResult.OK
Operațiile CRUD în Form1
Form1Adăugare:
Editare:
Verifică dacă un element este selectat
Obține cartea selectată din
lvCarti.SelectedItems[0].TagDeschide
FormCartetransmițândid-ul cărțiiDacă
DialogResult.OK, apeleazăRefreshLista()
Ștergere:
Verifică selecția
Afișează
MessageBoxde confirmare cu titlul cărțiiDacă confirmat, apelează
repository.Delete(id)șiRefreshLista()
Activează și dezactivează btnEditeaza și btnSterge în SelectedIndexChanged.
Last updated