class Objektno Programiranje private string programski Jezik C
class Objektno. Programiranje { private string programski. Jezik = “C#”; public string autor = “Miloš Kabiljo”; } Akademija poslovnih strukovnih studija Beograd
{ Klase; Interfejsi; Objekti }
Klasa je sastavljena od osobina objekta koje se izražavaju podacima koje ih opisuju (atributa) i akcija koje objekti mogu sprovoditi (metoda). Klasa opisuje sve objekte datog tipa, na taj način što definiše koji će podaci biti korišćeni za opis svakog pojedinačnog objekta. Zato je klasa apstraktna struktura bez pojedinačnih vredosti za podatke kojima se opisuju objekti. Objekta je jedna konkretizacija klase, odnosno objekat je jedan konkretan primerak sa konkretnim atributima koji ga razlikuju od drugih objekata iz iste klase.
Primer klase osoba public class Osoba { //konstruktor public Osoba() { } //atributi public string Ime { get; set; } public string Prezime { get; set; } public string Jmbg { get; set; } //metoda public void Stampa() { Console. Write. Line("Ime: {0}n. Prezime: {1}n. Jmbg: {2}", Ime, Prezime, Jmbg); } }
Deklarisanje i inicijalizacija objekta //deklaracija i instancijranje Osoba o = new Osoba(); //popunjavanje atributa o. Ime = "Miki"; o. Prezime = "Peric"; o. Jmbg = “ 1234567890"; //pozivanje funkcije o. Stampa();
Pravila za davanje imena klasama Ime klase mora početi slovom iza koga može da sledi niz slova (A-Z, velika i/ili mala), cifre (0 -9) i znak “donja povlaka” (_) Specijalna slova kao što su ? - + * / ! @ # $ % ^ ( ) [ ] { } , ; : . ne smeju se koristiti u imenu klase. Ime klase ne sme da bude neka od službenih reči C#, kao što su reči using, public, itd Ime klase treba da bude sa značenjem koje opisuje klasu, a najbolje je da bude neka imenica (na primer Osoba za klasu osoba, automobil za klasu automobil).
Modifikatori pristupa (Accessibility Levels) Public – pristup nije ograničen Protected – pristup je ograničen u klasi i na izvedene klase Internal – Pristup je ograničen u okviru istog sklopa Protected internal – Pristup je ograničen u okviru sklopa ili izvedene klase Private – pristup dozvoljen samo u klasi
Učaurivanje, enkapsulacija (Encapsulation, data hiding) Enkapsulacija je jedan važan koncept u OO programiranju. Spoljni svet, kako je već rečeno, pristupa samo onim atributima i metodama koje su označene kao public. Programer koji koristi neku klasu ne mora da zna kako su atributi i metode u samoj klasi kodirane. Sve što je njemu potrebno je da poznaje intefejs preko kojeg pristupa metodama i atributima klase. Potrebno je da razume i značenje atributa i metoda kojima pristupa, ali ne mora da zna kako su same metode programirane. Na taj način je obezbeđeno da se greške koje se pojave u klasi otklanjaju u samoj klasi, bez potrebe za promenom onog dela programa koji tu klasu koristi.
Nasleđivanje (Inheritance) Nasleđivanje omogućava da neka klasa (sub klasa) bude bazirana na drugoj klasi (bazna klasa) i da od nje nasledi svu funkcionalnost. Kroz dodatni kod (atribute metode) sub klasa može biti specijalizovana za posebne potrebe. Na primer, kod klase vozila (kao bazne klase) možemo kreirati sub klase automobili i motorcikli. Obe ove klasen nasledile bi sve metode klase vozila, ali bi takođe mogle da imaju I svoje specijalizovane metode i atribute. Ili (sub klasa) Student koja nasleđuje iz (bazneklase) Osoba ima sledeće atribute Ime, Prezime, Jmbg, Pol, a student nasledjuje sve te atribute i metode i ima svoj atribut broj indeksa i svoju metodu stampaj.
Polimorfizam (Polymorphism) Polimorfizam je sposobnost objekta da menja ponašanje u zavisnosti od načina na koji se koristi. Polimorfizam u najjednostavnijem obliku se pojavljuje kao niz metoda sa istim imenom ali sa različitim parametrima. Ovaj oblik polimorfizma naziva se “overloding” (overloading), a sreće se i kod operatora. U zavisnosti od parametara koje koristimo biće pozvan onaj metod koji odgovara korišćenim parametrima. Polimorfizam ima i druge oblike.
Primer nasleđivanja //bazna klasa public class Osoba { //konstruktor public Osoba() { } //atributi public string Ime { get; set; } public string Prezime { get; set; } public string Jmbg { get; set; } //metoda public void Stampa() { Console. Write. Line("Ime: {0}n. Prezime: {1}n. Jmbg: {2}", Ime, Prezime, Jmbg); } } //sub klasa public class Student : Osoba { public Student() { } public string Broj. Indeksa { get; set; } }
Primer polimorfizma //bazna klasa public class Osoba { //konstruktor public Osoba() { } //atributi public string Ime { get; set; } public string Prezime { get; set; } public string Jmbg { get; set; } //metoda public virtual void Stampa() { Console. Write. Line("Ime: {0}n. Prezime: {1}n. Jmbg: {2}", Ime, Prezime, Jmbg); } } //sub klasa public class Student : Osoba { //konstruktor public Student() { } //atributi public string Broj. Indeksa { get; set; } //metoda public override void Stampa() { base. Stampa(); Console. Write. Line("Broj indeksa: {0}", Broj. Indeksa); } }
//bazna klasa public class Osoba { //konstruktor public Osoba(string ime, string prezime, string jmbg) { Ime = ime; Prezime = prezime; Jmbg = jmbg; //subklasa } //atributi public string Ime { get; set; } public string Prezime { get; set; } public string Jmbg { get; set; } //metoda public virtual void Stampa() { Console. Write. Line("Ime: {0}n. Prezime: {1}n. Jmbg: {2}", Ime, Prezime, Jmbg); } public class Student : Osoba { public Student(string ime, string prezime, string jmbg, string broj. Indeksa) : base(ime, prezime, jmbg) { Broj. Indeksa = broj. Indeksa; } //atributi public string Broj. Indeksa { get; set; } } //metoda public override void Stampa() { base. Stampa(); Console. Write. Line("Broj indeksa: {0}", Broj. Indeksa); } }
Apstraktna klasa (Abstract class) Apstrakcija je proces kojim se objekti iz realnog sveta modeliraju uprošćenom “slikom” napravljenom u klasi pomoću atributa i metoda. Poenta abstract klase je da napravis baznu klasu koja je, grubo receno, nedovrsena tj. ima apstraktne metode (bez koda). Apstraktne klase se ne mogu instancirati već se moraju naslediti nekom novom klasom koja ce implementirati te apstraktne metode.
//apstraktna klasa public abstract class Osoba { //apstraktni properti public abstract string Ime { get; set; } public abstract string Prezime { get; set; } public abstract string Jmbg { get; set; } //apstraktna metoda public abstract void Stampa(); } //sub klasa koja nasledjuje apstraktnu klasu public class Student : Osoba { public override string Ime { get; set; } public override string Prezime { get; set; } public override string Jmbg { get; set; } public override void Stampa() { Console. Write. Line("Ime: {0}n. Prezime: {1}n. Jmbg: {2}", Ime, Prezime, Jmbg); } }
Parcijalna klasa (Partial class) Klasa može da sadrži više metoda, polja i konstruktora. Neke klase mogu biti glomazne. Zato, u jeziku C# postoji mogućnost da podelite izvorni kod klase u nekoliko odvojenih fajlova tako da neka glomazna klasa može da se organizuje kao skup nekoliko manjih klasa. Ovo se koristi kod WPF (Windows Presentation Foundation) aplikacija. Npr. deo klase koji može da se menja je u jednom fajlu, a deo klase koji se ne menja je u drugom fajlu.
//parcijalna klasa 1 public partial class Pravugaonik { public Pravugaonik() { } public double Stranica. A { get; set; } public double Stranica. B { get; set; } public double Dijagonala { get { return Math. Sqrt(Stranica. A * Stranica. A + Stranica. B * Stranica. B); } } }
//parcijalna klasa 2 public partial class Pravugaonik { public double Povrsina { get { return Stranica. A * Stranica. B; } } public double Obim { get { return 2 * Stranica. A + 2 * Stranica. B; } } }
Statična klasa i članovi (Static) Pripadaju klasi a ne objektu klase Pristupa im se preko imena klase I metode i polja klase mogu biti statički Pozivaju se bez kreiranja objekata klase
//klasa sa staticnom metodom Ispis public class Pravugaonik { public Pravugaonik() { } public double Stranica. A { get; set; } public double Stranica. B { get; set; } public double Dijagonala { get { return Math. Sqrt(Stranica. A * Stranica. A + Stranica. B * Stranica. B); } } public static void Ispis(int dijagonala) { Console. Write. Line("Dijagonala je: {0}", dijagonala); } }
//staticna klasa public static class Ispis. Helper { public static void Unesite. Broj() { Console. Write("Unesite broj: "); } public static decimal Unos. Broja() { Console. Write("Unesite broj: "); return decimal. Parse(Console. Read. Line()); } public static void Unesite. Ime() { Console. Write("Unesite ime: "); } public static string Unos. Imena() { Console. Write("Unesite ime: "); return Console. Read. Line(); } }
//primer pozivanja staticne klase i njenih staticnih metoda decimal a; string ime; a = Ispis. Helper. Unos. Broja(); ime = Ispis. Helper. Unos. Imena(); Console. Write. Line("uneti broj je: {0}", a); Console. Write. Line("uneto ime je: {0}", ime);
Nabrajanje – (enumerations) Enumeracije su jednostavno definisani celobrojni tipovi konstanti. Smatraju se vrednosnim tipovima jer sadrže vlastite vrednosti, koji se ipak ne mogu nasleđivati. Enumeracije olakšavaju održavanje vašeg koda tako što garantuju da su promenjive dobile definisane legitimne vrednosti. Upotrebom enumeracija dobija se jasniji kod jer vrednostima celobrojnih tipova možete da ih referencirate korišćenjem opisnih imena umesto celobrojnih brojeva.
//enumeracija enum Meseci { Januar = 1, Februar, Mart, April, Maj, Jun, Jul, Avgust, Septembar, Oktobar, Novembar, Decembar } //primer enumeracije int mesec; Console. Write("Unesi redni broj meseca: "); mesec = int. Parse(Console. Read. Line()); if (mesec == (int)Meseci. April) Console. Write. Line("Uneli ste mesec {0}", Meseci. April);
Interfejsi (Interface) Interfejs je koncept implementacije. koji razdvaja specifikaciju metode od njene Svaka metoda u interfejsu ima samo specifikaciju bez implementacije. Interfejs se ne moze instancirati. Klasa sme da naslđuje samo od jednog roditelja, ali moze da implementira vise interfejsa.
//interfejs public interface IGeometrijski. Oblici { double Povrsina(); double Obim(); }
//klasa koja nasleđuje interfejs public partial class Pravugaonik : IGeometrijski. Oblici { public double Stranica. A { get; set; } public double Stranica. B { get; set; } public double Povrsina() { return Stranica. A * Stranica. B; } public double Obim() { return 2 * Stranica. A + 2 * Stranica. B; } }
{ Kolekcije; }
Kolekcije se upotrebljavaju za upravljenje grupama objekata i imaju više funkcionalnosti nego nizovi Veličina niza se mora unapred definisati dok to nije slučaj sa kolekcijama Klase kolekcija su definisane na bazi jasno definisanih interfejsa Mogu da budu generičke i negeneričke Generičke kolekcije se za razliku od negenerički kolekcija nalaze u imenskom prostoru System. Collections. Generic i omogućavaju vam type safe i nemate potrebe za konverzijom vaših podataka Negeneričke kolekcije rade sa tipom podataka object
Interfejsi IEnumerable sadrži enumerator koji omogućava jednostavnu iteraciju kroz kolekciju ICollection – definiše broj elemenata u kolekciji, enumeratore negeneričke kolekcije IList interfejs predstavlja negeneričku kolekciju stavki kojima se može pristupiti na osnovu indeksa IDictionary – predstavlja negeneričku kolekciju parova(ključ, vrednost)
Negeneričke kolekcije System. Collections Array. List Ova kolekcija podržava dinamičke nizove § Elementima liste pristupa se preko indeksa kao i kod niza § Za razliku od niza nije neophodno unapred poznavati broj elemenata § Neke od metoda: § § Add(object) dodaje objekat na kraj liste Clear() briše sve elemente iz liste Insert(pozicija, vrednost) ubacuje objekat vrednost na pozicuju pozicija Remove. At(index) briše elemenat sa indeksom index iz liste Queue Stack Hashtable
//deklarisanje i instanciranje objekta lista Array. List lista = new Array. List(); //dodavanje elemenata u lista. Add("test"); lista. Add(5); lista. Add(true); //insert elementa na prvu poziciju lista. Insert(0, "c#"); //ispis elemenata foreach (var element in lista) { Console. Write. Line(element); } //brisanje svih elemenata iz liste lista. Clear();
Generičke kolekcije System. Collections. Generic List svi elementi u kolekciji moraju da imaju isti tip podataka i sve generičke liste su takođe safe type Najčešće korišćena generička kolekcija u programiranju je generička lista List Ona predstavlja listu elemenata kojoj možete pristupiti preko indeksa, olakšava vam sortiranje, filtriranje, dodavanje i brisanje elemenata
//deklarisanje i instanciranje liste studenata List<Student> studenti = new List<Student>(); //dodavanje studenata studenti. Add(new Student { Ime = "Miki", Prezime = "Peric", Broj. Indeksa = "1 A 1/0001/17" }); studenti. Add(new Student { Ime = “Nina", Prezime = "Mandic", Broj. Indeksa = "1 A 1/0002/17" }); studenti. Add(new Student { Ime = “Marko", Prezime = "Lazic", Broj. Indeksa = "1 A 1/0003/17" }); //stampaj drugi element u listi studenti[1]. Stampa(); //stampa svih studenata foreach (var s in studenti) { s. Stampa(); } //brisanje elementa na poziciji 3 studenti. Remove. At(2); //brisanje svih elemenata u listi studenti. Clear();
Generički rečnici (Dictionary) Dictionary je kolekcija koja pridružuje ključ (key) nekoj vrednosti (value) Dictionary<TKey, TValue> Pronalaženje vrednosti korišćenjemu pridruženog ključa je veoma brzo Elementi rečnika su članovi Key. Value. Pair<TKey, Tvalue> strukture
//deklarisanje i instanciranje recnika kanali Dictionary<string, string> kanali = new Dictionary<string, string>(); //dodavanje elemenata u recnik kanali. Add("1", "RTS 1"); kanali. Add("2", "RTS 2"); kanali. Add("3", "Prva"); kanali. Add("4", "Prva plus"); kanali. Add("5", "Pink"); //provera da li kljuc postoji u recniku if (kanali. Contains. Key("1")) { //ispis elementa u recniku preko kljuca Console. Write. Line(kanali["1"]); } //provera da li vrednost postoji u recniku if (kanali. Contains. Value("Prva")) { Console. Write. Line("Prva postoji u recniku kanala"); } //brisanje svih elemenata iz recnika kanali. Clear();
Primer mini konzolne aplikacije Klasa Osoba public abstract class Osoba { public string Ime { get; set; } public string Prezime { get; set; } } Interfejs IStudent public interface IStudent { void Stampa(); void Unos. Indeksa(string broj. Indeksa); }
Klasa Student public class Student : Osoba, IStudent { public string Broj. Indeksa { get; private set; } public int Godina. Studija { get { return int. Parse(Broj. Indeksa. Substring(Broj. Indeksa. Length - 2)); } } public void Unos. Indeksa(string broj. Indeksa) { Broj. Indeksa = broj. Indeksa; } public void Stampa() { Console. Write. Line("Ime: {0}n. Prezime: {1}n. Broj indeksa: {2}", Ime, Prezime, Broj. Indeksa); Console. Write. Line("------------"); } public static Student Kreiraj. Novog. Studenta() { Student s = new Student(); Console. Write("Unesite Ime: "); s. Ime = Console. Read. Line(). Trim(); Console. Write("Unesite Prezime: "); s. Prezime = Console. Read. Line(). Trim(); Console. Write("Unesite broj indeksa: "); s. Broj. Indeksa = Console. Read. Line(). Trim(). To. Upper(); return s; } }
Klasa Ispis. Helper public static class Ispis. Helper { public static int Unos. Broja() { int br; while (!int. Try. Parse(Console. Read. Line(), out br)) { Console. Write. Line("Broj nije ispravan! Pokusajte ponovo. "); Console. Set. Cursor. Position(0, Console. Cursor. Top - 2); Console. Write(new String(' ', Console. Buffer. Width)); Console. Set. Cursor. Position(0, Console. Cursor. Top - 1); } Console. Write(new String(' ', Console. Buffer. Width)); return br; } }
Program. cs static List<Student> studenti = new List<Student>(); static void Centriraj. Tekst(int broj. Karaktera) { Console. Set. Cursor. Position((Console. Window. Width - broj. Karaktera) / 2, Console. Cursor. Top); } static int Ispis. Menija() { Console. Clear(); Centriraj. Tekst(21); Console. Write. Line("***********"); Centriraj. Tekst(21); Console. Write. Line("*EVIDENCIJA SUDENATA*"); Centriraj. Tekst(21); Console. Write. Line("***********"); Centriraj. Tekst(11); Console. Write. Line("1. Unos"); Centriraj. Tekst(11); Console. Write. Line("2. Stampa"); Centriraj. Tekst(11); Console. Write. Line("3. Pretraga"); Centriraj. Tekst(11); Console. Write. Line("4. Promena indeksa"); Centriraj. Tekst(11); Console. Write. Line("0. Izlaz"); return Ispis. Helper. Unos. Broja(); }
static void Unos. Studenata() { Console. Clear(); Console. Write. Line("Unesi broj studenata: "); int n = Ispis. Helper. Unos. Broja(); for (int i = 0; i < n; i++) { studenti. Add(Student. Kreiraj. Novog. Studenta()); } } static void Stampa. Studenata() { Console. Clear(); if (studenti. Count == 0) Console. Write. Line("Nema evidentiranih studenata"); else { int i = 1; foreach (var student in studenti) { Console. Write. Line("RB: {0}", i); student. Stampa(); i++; } } }
static void Pretraga. Studenta(string pretraga) { Console. Clear(); bool pronadjeno = false; foreach (var student in studenti) { if (student. Ime. To. Lower(). Contains(pretraga. To. Lower()) || student. Prezime. To. Lower(). Contains(pretraga. To. Lower()) || student. Broj. Indeksa. To. Lower(). Contains(pretraga. To. Lower()) ) { student. Stampa(); pronadjeno = true; } } if (!pronadjeno) Console. Write. Line("Nema pronadjenih studenata koji zadovoljavaju kriterijum"); }
static void Promena. Indeksa() { Stampa. Studenata(); Console. Write. Line("Unesite redni broj studenta: "); int rb = Ispis. Helper. Unos. Broja(); Console. Write. Line("Unesite novi broj indeksa: "); studenti[rb - 1]. Unos. Indeksa(Console. Read. Line()); }
static void Main(string[] args) { bool exit = false; do { switch (Ispis. Menija()) { case 0: exit = true; break; case 1: Unos. Studenata(); break; case 2: Stampa. Studenata(); break; case 3: Console. Write("Unesite kljucnu rec za pretragu: "); Pretraga. Studenta(Console. Read. Line()); break; case 4: Promena. Indeksa(); break; default: Console. Write. Line("Pogresan unos!!!"); break; } if (!exit) { Console. Write. Line("n. Pritisnite bilo koje dugme za povratak u glavni meni"); Console. Read. Key(); } } while (!exit); }
Zadatak Kreirati klasu tiket koja ima atribut ime, prezime, datum i niz od 7 brojeva. Klasa ima dve metode. Prva metoda izračunava broj pogodaka koja ima ulazni podatak niz brojeva koji trebaju da se provere a izlazna vrednost je broj pogodaka. Druga metoda ispisuje ime, prezime, datum i izabrane brojeve koje razdvaja zarezom. Aplikacija treba da omogući kreiranje više tiketa tako što ima opciju unos tiketa gde mora da se unese ime, prezime, a datum dobija vrednost trenutnog datuma pri kreiranju tiketa. Aplikacija pored opcije u meniju unos tiketa ima još tri opcije: - Generisi loto brojeve (pokreće generisanje 7 brojeva izmedju 1 i 39) - Prikaz dobijenih brojeva - Sortiranje tiketa po najviše pogodaka - Izlaz iz aplikacije
{Windows forms application; }
Projekat – windows aplikacija Reference koje su uključene u projekat Konfiguracioni fajl Prva forma u aplikaciji Klasa program koja u sebi sadrži main metodu koja se startuje prilikom pokretanja programa static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application. Enable. Visual. Styles(); Application. Set. Compatible. Text. Rendering. Default( false); Application. Run(new Form 1()); } }
Forma (Form) using using using Dizajnerski deo System; System. Collections. Generic; System. Component. Model; System. Data; System. Drawing; System. Linq; System. Text; System. Threading. Tasks; System. Windows. Forms; namespace Win. App { public partial class Form 1 : Form { public Form 1() { Initialize. Component(); } Kod forme => konstruktor private void Form 1_Load(object sender, Event. Args e) { } } } => Load događaj forme
Svojstva i događaji Svojstva Događaji
Primer događaja i setovanje svojstva forme //tokom učitavanja forme private void Form 1_Load(object sender, Event. Args e) { this. Text = "Naslov forme"; this. Back. Color = Color. Light. Sky. Blue; }
//u toku zatvaranja forme private void Form 1_Form. Closing(object sender, Form. Closing. Event. Args e) { } //posle prikazivanja forme private void Form 1_Shown(object sender, Event. Args e) { }
Prikaz pojedinih kontrola Label List. View Picture. Box Button Grid. View List. Box Text. Box Save. Dialog Group. Box Check. Box Tab. Control Check. Box. List Radio. Button Tree. View List. View Date. Time. Picker Rich. Text. Box Error. Provider Combo. Box Numeric. Up. Down Menu. Strip
Primer upotrebe osnovnih kontrola Prilikom pokretanja forme treba da se prikaže vreme pokretanja aplikacije u donjem levom uglu. Klikom na dugme saberi ili oduzmi treba da se u polje rezultat upiše rezulat izabrane operacije. Klikom na dugme “prikaži tekst” treba da se prikaže tekst iz polja u modalni prozoror. U slučaju da se pritisne enter dok ste u fokusu polja za unos teksta treba da se pokrene akcija dugmeta “prikaži tekst”. Prilikom zatvaranja aplikacije korisnik mora da da se pita da li želi da zatvori aplikaciju. Naslov forme na “Zadatak 1” Text. Box za prvi broj treba nazvati txt. Prvi. Broj Text. Box za drugi broj treba nazvati “txt. Drugi. Broj” Text. Box za rezultat treba nazvati “txt. Rezultat” Dugme saberi treba nazvati “btn. Saberi”, a ispis “Saberi” Dugme oduzmi treba nazvati “btn. Oduzmi”, a ispis “Oduzmi” Dugme poništi treba nazvati “btn. Ponisti”, a ispis “Poništi” Text. Box za unos teksta treba nazvati “txt. Tekst” Dugme za prikaz teksta treba nazvati“btn. Prikazi”, a ispis “Prikaži tekst” Labelu za prikaz vremena startovanja aplikacije treba nazvati „lbl. Vreme“
private void Form 1_Load(object sender, Event. Args e) { lbl. Vreme. Text += Date. Time. Now; } private void Form 1_Form. Closing(object sender, Form. Closing. Event. Args e) { if (Message. Box. Show("Da li ste sigurni? ", "Zatvaranje aplikacije", Message. Box. Buttons. Yes. No, Message. Box. Icon. Question) == Dialog. Result. No) e. Cancel = true; }
private void btn. Saberi_Click(object sender, Event. Args e) { try { decimal rezultat = decimal. Parse(txt. Prvi. Broj. Text) + decimal. Parse(txt. Drugi. Broj. Text); txt. Rezultat. Text = rezultat. To. String(); } catch { } } private void btn. Oduzmi_Click(object sender, Event. Args e) { try { decimal rezultat = decimal. Parse(txt. Prvi. Broj. Text) - decimal. Parse(txt. Drugi. Broj. Text); txt. Rezultat. Text = rezultat. To. String(); } catch { } } private void btn. Ponisti_Click(object sender, Event. Args e) { txt. Prvi. Broj. Clear(); txt. Drugi. Broj. Clear(); txt. Rezultat. Clear(); }
private void txt. Tekst_Key. Down(object sender, Key. Event. Args e) { if (e. Key. Code == Keys. Enter) { btn. Prikazi. Perform. Click(); } } private void btn. Prikazi_Click(object sender, Event. Args e) { if (txt. Tekst. Text. Trim() != "") Message. Box. Show(txt. Tekst. Text, "Prikaz teksta", Message. Box. Buttons. OK, Message. Box. Icon. Asterisk); }
Zadatak Kreirati klasu Predmet (naziv predmeta, ocena i datum polaganja). Kreirati klasu Indeks (ime, prezime, broj indeksa i listom predmeta, prosečna ocena). Kreirati windows aplikaciju sa poljima za upis indeksa i upis ocena u indeks. Nakon upisa indeksa dugme za unos indeksa treba da se sakrije ili onemogući a da se u labelu ispod dugmeta ispiše ime prezime i broj indeksa. Nakon toga se omogući unos ocena u indeks. Ispod labele sa podacima o studentu treba da bude deo za upis ocena. Svaki put kada se upiše ocena polja za upis se brišu. Treba zabraniti unos duplih predmeta u indeks. Takođe treba zabraniti da može da se upiše ocena manja od 6 i veća od 10. Na kraju treba da postoje dugmići sa sledećim akcijama: 1. Prikaži broj položenih ispita 2. Prikaži prosečnu ocenu studenta 3. Prikaži poslednji položeni ispit po datumu 4. Prikaži sve položene ispite sa ocenama 5. Zatvori aplikaciju sa upozorenjem
Prikaz aplikacije
Kreiranje nove forme Novu formu možete kreirati desnim klikom na projekat Add > Windows form.
Otvaranje nove forme //otvaranje nove forme (nije modalna) private void btn. Open. Form_Click(object sender, Event. Args e) { Nova. Forma frm = new Nova. Forma(); frm. Show(); } //otvaranje nove forme (kao modalni dijalog) //kada je forma otvorena kao modalni dijalog pristup parent formi nije dozvoljen private void btn. Open. Form_Click(object sender, Event. Args e) { Nova. Forma frm = new Nova. Forma(); frm. Show. Dialog(); frm. Dispose(); }
Prosledjivanje vrednosti na formu //parent forma okja otvara novu formu private void btn. Open. Form_Click(object sender, Event. Args e) { Nova. Forma frm = new Nova. Forma(); frm. Show. Dialog(); frm. txt. Tekst. Text = "C#"; frm. Dispose(); }
//properti na child formi public string Tekst { get { return txt. Tekst. Text; } set { txt. Tekst. Text = value; } } //pozivanje propertija sa parent forme private void btn. Open. Form_Click(object sender, Event. Args e) { Nova. Forma frm = new Nova. Forma(); frm. Show. Dialog(); frm. Tekst = "C#"; frm. Dispose(); }
Otvaranje fajlova (open file dialog) //naslov dijaloga za otvaranje fajlova open. File. Dialog 1. Title = "Otvaranje tekstualnog fajla"; //inicijalni direktorijum za otvaranje fajlova open. File. Dialog 1. Initial. Directory = @"c: "; //podesavanja naziva fajla open. File. Dialog 1. File. Name = ""; //podesavanja filtera za tip fajla open. File. Dialog 1. Filter = "Text|*. txt|All|*. *"; //otvaranje dialoga if (open. File. Dialog 1. Show. Dialog() == Dialog. Result. OK) { //u slucaju da je fajl izabran uraditi kod u telu. . . }
Snimanje fajlova (save file dialog) //naslov dijaloga za snimanje fajlova save. File. Dialog 1. Title = "Cuvanje tekstualnog fajla"; //inicijalni direktorijum za snimanje fajlova save. File. Dialog 1. Initial. Directory = @"c: "; //podesavanja naziva fajla save. File. Dialog 1. File. Name = "Moj tekstualni fajl. txt"; //otvaranje dialoga if (save. File. Dialog 1. Show. Dialog() == Dialog. Result. OK) { //u slucaju da je fal uspesno kreiran uraditi kod u bloku }
Zadatak Napraviti mini aplikaciju za čuvanje kontakata. Aplikacija čuva kontakte u tekstualnom fajlu a preko windows fome se vrši pregled, izmena i unos. Tekstualni fajl je u formatu id; ime; prezime; mail; brojmobilnog, svaki red pretstavlja jedan kontakt. Aplikacija prilikom otvaranja treba da učita sve kontakte u details view kako bi korisnik imao mogućnost pregleda. Na istoj formi se nalaze dugmići za dodavanje novog kontakta i izmenu koja otvaraju novu formu na kojoj se unose/menjaju podaci o kontaktu. Klikom na dugme potvrdi forma se zatvara a pregled se osvežava kako bi se prikazali novi podaci. Pored dugmeta za dodavanje nalazi se još jedno dugme za čuvanje kontakta u fajl. Kontakti se mogu pretraživati po imenu ili prezimenu. Aplikacija treba prilikom zatvaranja ako je unet novi kontakt ili izmenjen postojeći a podaci nisu sačuvani obavesti korisnika o tome, kako korisnik ne bi zatvorio aplikaciju a da nije sačuvao podatke.
{ADO. NET; }
Sql. Connection (osnovna svojstva) System. Data. Sql. Client Connection. String definiše string koji sadrži sve potrebne informacije za uspostavljanje konekcije ka SQL serverom. Data. Source database server na koji se vrši konekcija Database ime baze na koju se vrši konekcija State stanje konekcije Connection. Timeout vreme dozvoljeno za uspostavljenje konekcije nakon čega se javlja greška
Sql. Connection (metode) Open() otvara konekciju na bazu podataka Close() zatvara konekciju sa bazom podataka Begin. Transaction() otpočinje transakciju nad bazom
Sql. Connection (definisanje konekcije u app. config) //windows atentifikacija <connection. Strings> <add name=“Naziv. Konekcije" connection. String= " Data Source=. Sql. Express; Initial Catalog=Test. DB; Integrated Security=True " /> </connection. Strings> //sql atentifikacija <connection. Strings> <add name=“Naziv. Konekcije" connection. String= " Data Source=. Sql. Express; Initial Catalog=Test. DB; Integrated Security=False User ID=korisnicko. Ime; Password=sifra " /> </connection. Strings>
Sql. Command System. Data. Sql. Client Koristi se za izvršavanje SQL komandi i uskladištenih procedura Pomoću nje moguće je izvršavati SELECT, INSERT, UPDATE i DELETE naredbe nad elementima baze podataka
Sql. Command(svojstva) Command. Text predstavlja tekst SQL komande ili naziv uskladištene procedure Command. Type tip koji može biti Command. Type. Text ili Command. Type. Stored. Procedure Connection određuje objekat Sql. Connection koji će Sql. Command objekat koristiti Parameters kolekcija parametara Sql. Command objekta koji se koriste za izvršavanje parametarskih upita
Sql. Command (metode) Execute. Non. Query() izvršava SQL komande ili uskladištene procedure koje ne vraćaju vrednosti (INSERT, UPDATE, DELETE) Execute. Reader() izvršava komande koje vtaćaju tabelarne podatke (SELECT) Execute. Scalar() se koristi za izvršavanje SQL komandi ili uskladištenih procedura koje vraćaju jednu skalarnu vrednost
Sql. Data. Reader System. Data. Sql. Client Sql. Data. Reader je brz (read-only, forward-only) kursor koji se pomera kroz skup zapisa Read() metoda učitava zapis I vraća true ako ima još zapisa, false ukoliko je stgla do poslednjeg zapisa
Primer čitanja podataka iz tabele var contacts = new List<Contact>(); var con = new Sql. Connection(Connection. String); try { con. Open(); var command = new Sql. Command("SELECT * FROM Contact", con); var reader = command. Execute. Reader(); while (reader. Read()) { var c = new Contact { Contact. Id = int. Parse(reader["Contact. Id"]. To. String()), First. Name = reader["First. Name"]. To. String(), Last. Name = reader["Last. Name"]. To. String(), Email = reader["Email"]. To. String(), Mobile. Phone = reader["Mobile. Phone"]. To. String(), }; contacts. Add(c); } reader. Close(); } finally { con. Close(); }
Primer pozivanja uskladištene procedure var contacts = new List<Contact>(); var con = new Sql. Connection(Connection. String); try { con. Open(); var command = new Sql. Command("Get. Contacts", con); command. Command. Type = System. Data. Command. Type. Stored. Procedure; var reader = command. Execute. Reader(); while (reader. Read()) { var c = new Contact { Contact. Id = int. Parse(reader["Contact. Id"]. To. String()), First. Name = reader["First. Name"]. To. String(), Last. Name = reader["Last. Name"]. To. String(), Email = reader["Email"]. To. String(), Mobile. Phone = reader["Mobile. Phone"]. To. String(), }; contacts. Add(c); } reader. Close(); } finally { con. Close(); }
Primer čitanja jednog podatka (scalar) var contacts = new List<Contact>(); var con = new Sql. Connection(Connection. String); try { con. Open(); var command = new Sql. Command("SELECT count(*) FROM Contact", con); var rows = command. Execute. Scalar(); } finally { con. Close(); }
Primer pozivanja upita sa parametrima var con = new Sql. Connection(_connection); try { var command = new Sql. Command(); command. Connection = con; con. Open(); command. Command. Text = @"INSERT INTO Contact (First. Name, Last. Name, Email, Mobile. Phone) VALUES (@First. Name, @Last. Name, @Email, @Mobile. Phone)" ; command. Parameters. Add. With. Value( "@First. Name", contact. First. Name); command. Parameters. Add. With. Value( "@Last. Name", contact. Last. Name); command. Parameters. Add. With. Value( "@Email", contact. Email); command. Parameters. Add. With. Value( "@Mobile. Phone", contact. Mobile. Phone); command. Execute. Non. Query(); } finally { con. Close(); } Mini aplikacija za kontakte nadograđena sa sql primerom
Primer pozivanja uskladištene procedure sa parametrima var contacts = new List<Contact>(); var con = new Sql. Connection(Connection. String); try { con. Open(); var command = new Sql. Command("Get. Contacts", con); command. Command. Type = System. Data. Command. Type. Stored. Procedure; command. Parameters. Add. With. Value( "@Search", uslov); var reader = command. Execute. Reader(); while (reader. Read()) { var c = new Contact { Contact. Id = int. Parse(reader["Contact. Id"]. To. String()), First. Name = reader["First. Name"]. To. String(), Last. Name = reader["Last. Name"]. To. String(), Email = reader["Email"]. To. String(), Mobile. Phone = reader["Mobile. Phone"]. To. String(), }; contacts. Add(c); } reader. Close(); } finally { con. Close(); }
Sql. Data. Adapter i Data. Table var dt = new Data. Table(); var con = new Sql. Connection(Properties. Settings. Default. Connection. String); try { var command = new Sql. Command("SELECT * FROM Contact", con); var da = new Sql. Data. Adapter(command); con. Open(); da. Fill(dt); dgv. Contact. Data. Source = dt; } finally { con. Close(); }
- Slides: 80