You are on page 1of 59

Mala kola programiranja C# (1) Kada otvorite navedenu stranicu, kliknite na vezu

uputstva za runu instalaciju (manual installation ins-


tructions) koja vas vodi na lokaciju gde moete preuzeti
Uvod kompletnu instalaciju u IMG ili ISO formatu. Svi popularni
Namena ovog serijala jeste da nastavnike informati- programi za kopiranje kompakt diskova podravaju oba
ke i programiranja uputi u tematiku programiranja u pro- formata. Veliina instalacije je priblino 435 MB.
gramskom jeziku C# i u .NET tehnologiju.

Kroz niz primera kojima prethodi teorijska osnova


bie obraeno vie razliitih aspekata i tipova aplikacija
koje se mogu realizovati, to ukljuuje konzolne i Windows
aplikacije, kreiranje biblioteka klasa i pristup Microsoft SQL
Server bazi podataka.

Platforma u kojoj se radi jeste Microsoft Visual C#


2005 Express Edition i Microsoft SQL Server 2005 Express Tehnologija
Edition. Odluili smo da koristimo express izdanja jer su Microsoft je predstavio .NET tehnologiju 2000.
besplatna i mogu se preuzeti sa Microsoft Web lokacije. godine, uz prvu verziju programa Visual Studio 2000
Naravno, svi primeri e ispravno funkcionisati i u bilo kojoj i .NET Framework 1.0. Kasnije je usledila verzija programa
drugoj verziji programa Microsoft Visual Studio 2005. 2003 Visual Studio i 1.1 .NET Framework. Trenutno su
aktuelne verzije 2005 Visual Studio, odnosno 2.0 .NET
Express alatke Framework.
Microsoft je kreirao niz besplatnih, express izdanja
svojih razvojnih alatki i SQL Server baze podataka sa ide- .NET Framework predstavlja obiman skup klasa koje
jom da svima omogui uenje, testiranje i kreiranje aplika- se koriste u programiranju razliitih tipova aplikacija. Sve
cija u .NET framework okruenju. Ovo ne znai da se u klase su grupisane u takozvane imenovane prostore
express alatkama ne mogu napraviti ozbiljne aplikacije, (named spaces) radi lakeg snalaenja i efikasnijeg rada.
Web lokacije i baze podataka. Naprotiv, dostupna je vei- Na primer, klase za rad sa SQL bazom podataka nalaze se
na mogunosti koje postoje i u kompletnoj verziji progra- u imenovanom prostoru System.Data.SqlClient, klase za
ma Visual Studio, tako da se mogu kreirati snane i boga- rad sa datotekama nalaze se u prostoru System.IO i tako
te aplikacije i sistemi sa bazama podataka. dalje. Sve to vam ikada moe zatrebati gotovo sigurno se
moe pronai ovde. Ako ne postoji, moe se napisati od
Matina stranica za sve Express alatke je: poetka ili naslediti funkcionalnost postojeih klasa.
http://msdn.microsoft.com/vstudio/express/. Web stranica
sa koje moete preuzeti C# Express je: Nepravedno je govoriti o C#, a ne pomenuti Ander-
http://msdn.microsoft.com/vstudio/express/visualcsharp/ sa Hejlsberga, koji je glavni arhitekta i projektant ovog
download/. jezika i uesnik u razvoju .NET tehnologije. Roen u Dan-
skoj 1961. godine, programer koji je poetkom osamdese-
Instalaciju moete izvriti sa Interneta ili preuzeti tih godina 20. veka napisao uveni Turbo Pascal, a kasnije
sadraj kompletnog instalacionog CD-a. Druga opcija je projektovao Delphi. 1996. godine Anders se pridruio kor-
bolja, jer kada jednom preuzmete instalaciju moete je poraciji Microsoft gde je i razvio programski jezik J++ i
kopirati na onoliko diskova koliko vam je potrebno za ko- biblioteku klasa Windows Foundation Classes.
lu, uenike i nastavnike.

2
.NET programski jezici mogu pristupiti svim ovim .NET prevoenje
klasama i u tom smislu su prilino ravnopravni, bez obzira Prilikom prevoenja koda napisanog u bilo kojem
na to da li koristite Visual Basic .NET, C#, Fortran .NET ili programskom jeziku postoje dve mogunosti: prevodioci i
neki drugi programski jezik. Razlika izmeu jezika svodi se tumai.
na sintaksu, strukturu i lini izbor. Trenutno su svi najee
korieni programski jezici prilagoeni .NET tehnologiji. Prevodioci prevode izvorni kd direktno u mainski
kd procesora. U sluaju tumaa se prilikom pokretanja
Programski jezik C# se izdvaja od drugih i smatra programa prevodi linija po linija - kako se program izvra-
se prirodnim za .NET okruenje. Ovaj programski jezik je va. NET je tuma, ali ne vri prevoenje direktno u main-
nastao kao potpuno nov i nije optereen kompatibilnou ski jezik procesora, ve u takozvani MSIL (Microsoft Inter-
sa ranijim verzijama. Radno okruenje Visual Studio je u mediate Language). Po pokretanju programa na scenu
potpunosti napisano ba u C# jeziku. On je moderno stru- stupa JIT (Just In Time) prevodilac, koji dalje prevodi MSIL
kturiran, potpuno objektno orijentisan, zasnovan na C++ u mainski jezik procesora i izvrava ga. Ovakva slojevita
jeziku i zvanino prihvaen kao standard od strane organi- arhitektura omoguava portabilnost .NET aplikacija izme-
zacija ECMA (European Computer Manufacturers Associa- u razliitih operativnih sistema u budunosti.
tion) i ISO (International Organization for Standardizati-
on).

3
Poetak izabrati stavku Aplikacija konzole (Console Application) i
Za poetak je potreban operativni sistem Windows kliknuti na dugme U redu (OK).
XP i instaliran C# Express 2005. Kada se pokrene radno Sve linije primera koda u ovom lanku su prikazane
okruenje, na uvodnom ekranu postoje opcije za kreiranje crvenom bojom, a kd koji je automatski generisalo radno
novog ili otvaranje postojeeg projekta (1). Takoe, tu se okruenje prikazan je sivom bojom.
nalazi i lista prethodno otvorenih projekata (2) koja je
sada prazna. Veoma su korisna i okna sa vezama za poe- Posle par momenata se otvara prozor za pisanje
tnike (3) i najnovijim vestima (4) koje se automatski auri- koda sa ve ispisanim kosturom aplikacije. Potrebno je
obratiti panju na liniju static void Main(string[] args). Ona
definie glavnu (Main) funkciju koja se prva pokree prili-
kom pokretanja programa. U telu ove funkcije treba upisa-
ti kd koji je potrebno izvriti. Telo funkcije je definisano
poetnom { i zavrnom } velikom zagradom, to predstav-
lja nain na koji se obeleava poetak i kraj svih segmena-
ta u C# jeziku.

Da biste probali jednostavan ispis na ekranu, u


okviru velikih zagrada upiite tekst tano kao to je prika-
zano:
class Program
{
static void Main(string[] args)
{
ra ako postoji Internet veza. Console.WriteLine ("Moja prva C# aplikacija");
Console.ReadKey ();
Potrebno je kliknuti na vezu Kreiraj: Projekat... }
(Create: Project), ime se otvara dijalog u kome treba }
izabrati tip projekta kao to je prikazano na prethodnoj Imajte na umu da C# razlikuje mala i velika slova!
slici.
Pokretanje aplikacije iz radnog okruenja vri se
Tri osnovna tipa projekta su: pomou funkcijskog tastera F5 na tastaturi. Ako je kd
Windows aplikacija (Windows application) predstavlja ispravno napisan, pojavljuje se prozor komandne linije sa
standardnu Windows aplikaciju koja se moe samostalno ispisanim tekstom:
pokretati na raunaru.
Biblioteka klasa (Class Library) je biblioteka klasa sa
svojim funkcijama i drugim elementima. Ovaj projekat ne
moe se samostalno pokrenuti, ve ga pokreu i koriste
drugi tipovi projekata.
Aplikacija konzole (Console Application) takoe
Windows aplikacija, ali bez grafikog korisnikog interfej-
sa. Komunikacija se odvija iskljuivo sa komandne linije.
Ostali tipovi predstavljaju samo razliite predloke i
demo aplikacije uz mogunost pronalaenja drugih pred-
loaka projekata na Internetu. Pritisnite bilo koji taster ime se zatvara prozor komandne
Za poetak, kao najjednostavniji tip aplikacije, treba linije, odnosno zaustavlja aplikacija.

4
Analiza koda: Za pojmove: klasa, objekat, objektno programiranje,
nasleivanje, metodi i slino uli ste ili proitali u literaturi
Linija: Console.WriteLine("Moja prva C# aplikacija"); i oni (po mom iskustvu) izazivaju odbojnost ka objektnom
je odgovorna za ispis teksta. Console objekt predstavlja programiranju, bez obzira na to da li ste poetnik ili profe-
prozor komandne linije, dok je WriteLine metod ovog sionalac. Ne treba se tako oseati jer objektno programira-
objekta kojim se ispisuje tekst. Kasnije emo videti ta su nje predstavlja nain razmiljanja koje je najblie svakod-
klasa, objekat i metoda klase. Oigledno, parametar meto- nevnom iskustvu i najuspenije modelira stvarnost.
de WriteLine je tekst koji elimo da se ispie.
U sledeem nastavku serijala o programiranju bavi-
Linija: Console.ReadKey(); emo se ba ovim pojmovima jer oni predstavljaju okosni-
postoji samo da bi se napravila pauza. Bez nje bi se otvori- cu u C# programiranju.
o prozor komandne linije, ispisao tekst i prozor bi se
odmah zatvorio jer se aplikacija zavrila. Slino kao i u
prethodnoj liniji koristi se objekat Console, a ovog puta
metod ReadKey koji eka da korisnik pritisne taster na
tastaturi. Pokuajte da obriete ovu liniju i pokrenete pro-
gram i vidite ta se dogaa.

5
Mala kola programiranja C# (2) Uenik takoe na odreeni nain reaguje na dea-
vanja u kolskom okruenju. Reakcija na dobru ili lou
U ovom nastavku male kole jezika C# posvetiemo ocenu, izostanak u sluaju bolesti i slino predstavljaju
se osnovama objektnog programiranja. Za razliku od tra- dogaaje (eng. events) klase.
dicionalnog proceduralnog programiranja koje se sastoji Sada, posle detaljne analize svih osobina, radnji i
od niza funkcija i njihovih poziva, objektno programiranje reakcija uenika mogue je kreirati klasu koja verno i deta-
bolje i skladnije oslikava realni svet i omoguava loginije ljno moe da opie uenika sa svim potrebnim karakteris-
projektovanje programskih zahteva. Da odmah u poetku tikama.
bude jasno: problem se moe reiti pomou tradicional-
nog i objektnog programiranja. Fizika implementacija klase
Ono to nam donosi objektno programiranje je
Svojstva klase su predstavljena razliitim varijabla-
skladniji programski model i jo neke lepe stvari kao to je
ma koje su javno vidljive van klase. Korisnik klase e po
ponovna upotrebljivost i nasleivanje objekata.
kreiranju objekta na osnovu klase uspostaviti odgovaraju-
Jedan objekat je uvek predstavljen jednom klasom.
e vrednosti varijabli i time definisati objekat.
Klasu treba posmatrati kao nacrt ili plan za izgradnju obje-
Metode klase su predstavljene funkcijama u klasi.
kta. Na primer, plan za izgradnju kue predstavlja klasu, a
Na primer, funkcija UradiDomaiZadatak koja bi kao
kua napravljena po tom planu predstavlja objekat zasno-
ulazne parametre verovatno trebalo da sadri opis doma-
van na klasi. Sama klasa za sebe nije objekat, ve predsta-
eg zadatka, predmet, vreme kada je zadat i rok izvrava-
vlja samo opis po kome e objekat biti napravljen. Kada
nja. Metod klase moe imati i povratnu vrednost koja se
napravimo (kae se instanciramo) objekat na osnovu
obino koristi kao status izvravanja metoda, odnosno
klase, on se kreira u memoriji raunara i tek tada se moe
funkcije. Nepisano pravilo jeste da povratna vrednost nula
koristiti. Na osnovu jedne klase moe se napraviti neogra-
znai uspeno izvrenu radnju, a vrednost razliita od nule
nieni broj objekata, odnosno broj koji je tehniki ograni-
oznaava problem definisan tim brojem.
en memorijom raunara.
Da bismo mogli da napravimo prvi primer za
demonstraciju jednostavne klase, neophodno je da se
Svojstva, metode i dogaaji upoznamo sa nainom deklaracije varijabli i funkcija u C#
Uzmimo uenika kao primer. Ako bismo hteli da ga jeziku.
predstavimo u objektnom svetu, ta bi klasa koja ga opisu-
je trebalo da sadri? Moemo poeti od fizikih karakteris- Deklaracija varijabli i funkcija
tika. Ime uenika, pol, godina roenja, boja oiju i kose,
Sve varijable u programskom jeziku C# moraju se
razred i slino. Sve pomenuto predstavlja svojstva (eng.
deklarisati pre upotrebe. Deklaracija varijable podrazume-
properties) klase. Kada instanciramo objekat na osnovu
va da definiemo naziv, tip, vidljivost i opcionalno njenu
klase Uenik, postaviemo ova svojstva da odgovaraju
poetnu vrednost. Sintaksa je sledea:
konkretnom ueniku.
Oigledno, na osnovu dobro kreirane klase uenik
vidljivost tip varijable naziv = poetna vrednost
moemo tano opisati sve uenike svoje kole. Meutim,
ovo nije dovoljno. Uenik obavlja veliki broj kolskih aktiv-
Na primer:
nosti koje takoe treba opisati. To je ono to uenik radi u
koli i kod kue, na primer, radi pismeni i domai zadatak,
public string ImeUcenika;
prisustvuje odreenom asu, dobija ocenu i slino. Ove
private int Razred = 1;
radnje koje uenik izvrava i koje se odnose na njega nazi-
vaju se metodima (eng. methods) klase.

6
U prvom primeru je deklarisana varijabla pod nazi- public void PokreniProgram (string LokacijaPrograma)
vom ImeUcenika koja pripada tipu niska (eng. string), {
to znai da moe da sadri bilo koji niz znakova i njena // kd koji pokree program...
vidljivost je javna (public). return;
Vidljivost definie odakle se varijabli moe pristupi- }
ti. Kljuna re public znai da je varijabla javna u celom
opsegu u kome je deklarisana na primer, u celoj klasi i U tom sluaju se navodi samo kljuna re return
da je takoe vidljiva korisnicima te klase. bez parametra. U primeru je takoe prikazan nain za upi-
U drugom sluaju deklarisali smo varijablu pod sivanje komentara u programskom jeziku C#. Dve kose
nazivom Razred koja pripada tipu int (pozitivni i nega- crte // oznaavaju komentar sve do kraja reda.
tivni celi brojevi u odreenom opsegu) sa privatnom vidlji- Ovaj komentar se zanemaruje prilikom prevoenja,
vou dostupna je samo u okviru dela u kome je deklari- a dobra praksa je pisati komentare uvek kada je to potreb-
sana, ali ne i korisnicima klase. Inicijalnu vrednost varijable no radi boljeg razumevanja koda.
takoe smo postavili na 1. Osim ove jednolinijske varijante komentara postoji i
vielinijski komentar koji poinje parom znakova /* i zavr-
Osim javnih (eng. public) i privatnih (eng. private) ava sa */. Sve linije izmeu smatraju se komentarom i ne
tipova vidljivosti postoji jo nekoliko varijanti o kojima e izvravaju se.
biti govora kasnije. Za poetak je dovoljno znati da privat-
ne varijable nisu vidljive van klase, a javne jesu. Primer klase
Sada znamo dovoljno da bismo mogli da kreiramo
Deklaracija funkcija je slina. Takoe se definie jednostavnu klasu kao primer. Sama deklaracija klase je
vidljivost, ime funkcije, tip (koji u sluaju funkcije znai tip jednostavna:
vrednosti koju vraa funkcija) uz dodatak deklaracije ulaz-
nih argumenata funkcije ako postoje. Class NazivKlase
{
Primer funkcije koja vraa zbir dva broja: /*
telo klase sa svim potrebnim svojstvima,
public double Zbir (double a, double b) metodima i dogaajima
{ */
return a + b; }
}
Kao i u prethodnom nastavku primer emo zasno-
Funkcija Zbir je javna (dostupna korisnicima klase) i vati na konzolnoj aplikaciji. Pokrenite C# Express, kliknite
kao rezultat vraa tip double (broj sa decimalnom ta- na vezu Kreiraj projekat (eng. Create project), izaberite
kom). Postoje dva ulazna parametra a i b koji su takoe tip projekta Konzolna aplikacija (eng. Console Application)
tipa double. Telo funkcije je odreeno otvorenom i zat- i kliknite na dugme U redu (eng. OK).
vorenom vitiastom zagradom. Naredba return oznaava Zadatak je napraviti klasu Matematika koja e
bezuslovni zavretak rada funkcije i povratnu vrednost znati da sabere i oduzme dva broja. Klasa e sadrati dva
funkcije. U naem primeru funkcije postoji samo naredba metoda (funkcije) Zbir i Razlika. Obe funkcije imaju
return koja vraa zbir dva broja. po dva ulazna parametra i brojeve koji se sabiraju, odnos-
U sloenijim klasama moe postojati puno funkcija no oduzimaju. Svi ulazni parametri i obe funkcije su tipa
koje implementiraju razliite metode klase. Neke od njih double.
e imati povratnu vrednost, a neke ne. Funkcije koje
nemaju povratnu vrednost deklariu se kao tip void. Na
primer:

7
U kodu koji vidite na ekranu prvo treba deklarisati Tehniki gledano, pravljenje objekta se svodi na
klasu Matematika. Deklaracija se upisuje posle deklaraci- kreiranje mini-programa u memoriji raunara koji sadri
je klase Program kao to je prikazano: kompletan kd iz klase. Instanca klase se jednostavno pra-
vi.
class Program NazivKlase NazivVarijable = new NazivKlase();
{ U naem primeru klasu pravimo u delu static void
static void Main(string[] args) Main kao to je prikazano:
{
} static void Main(string[] args)
} {
class Matematika Matematika M = new Matematika();
{ }

} Naredba new Matematika() pravi instancu klase


Matematika - objekat u memoriji raunara. Varijabla M
Sada, u okviru klase Matematika treba napisati funkcije je pokaziva na memorijsku lokaciju na kojoj se nalazi
Zbir i Razlika: objekat, a pomou nje se upuuje na sva svojstva i metode
u njemu.
class Matematika Sintaksa upuivanja je jednostavna: NazivVarijab-
{ le.NazivMetode (ulazni argumenti).
public double Zbir(double A, double B)
{ Sada treba testirati obe metode i ispisati njihov
return A + B; povratni rezultat. Za ovo emo, kao i u prolom nastavku
} koristiti metod WriteLine ugraenog objekta Console.
Brojevi koje prosleujemo kao ulazne parametre izabrani
public double Razlika(double A, double B) su potpuno proizvoljno.
{ Dopunite kd sledeim redovima:
return A - B;
} static void Main(string[] args)
} {
Matematika M = new Matematika();
Obe funkcije su javne kako bi bile vidljive korisnici- Console.WriteLine ( M.Zbir (3, 4) );
ma klase, imaju po dva ulazna parametra tipa double i Console.WriteLine ( M.Razlika (8, 2) );
vraaju zbir, odnosno razliku. Terminoloki, klasa Console.ReadKey();
Matematika implementira interfejs sa dva metoda iji su }
potpisi:
public double Zbir (double, double) i M.Zbir (3, 4) poziva funkciju Zbir u objektu na koji
public double Razlika (double, double) pokazuje varijabla M i prosleuje joj vrednosti parametara.
Funkcija Zbir kao povratnu vrednost vraa zbir ova dva
Klasa je za sada gotova, prelazimo na njeno broja (return 3 + 4). Ovu povratnu vrednost zatim koristi-
korienje. Kao to je reeno, klasa sama za sebe ne moe mo za ispis u konzolni prozor.
da se koristi, ve je neophodno napraviti objekat na osno- Isti princip vai za pozive funkcije Razlika.
vu nje. Red Console.ReadKey(); slui samo kao vetaka
pauza kako se konzolni prozor ne bi odmah zatvorio.

8
Pokrenite primer pritiskom na funkcijski taster F5.
Ako je kd dobro unet, dobija se rezultat kao na slici:

Ako je prijavljena greka i primer nije pokrenut,


proverite sve redove koda posebno vodei rauna o veli-
kim i malim slovima. Kao to je ranije reeno, C# razlikuje
velika i mala slova tako da su za njega, na primer funkcije
Zbir i zbir dve razliite funkcije.

Vebanje
Na osnovu primera u ovom lanku, dodajte jo dva
metoda klasi Matematika koji izvravaju proizvod i delje-
nje. Zatim u kodu ispitajte funkcionisanje ova dva nova
metoda.

U sledeem nastavku bie obraena svojstva, kao i


druge mogunosti klase.

9
Mala kola programiranja C# (3) Zatim u okviru klase Ucenik, treba uraditi deklaraciju svoj-
stava, odnosno javnih (public) varijabli, obe tipa string:
Klase - nastavak
Vreme je da nauimo vie o svojstvima klase. U class Ucenik
prolom nastavku smo se upoznali sa funkcijama i na koji {
nain se pomou njih implementiraju metode klase. Svojs- public string Prezime;
tva klase, prenesena u realni svet bi mogla da se poistove- public string Ime;
te sa osobinom objekta ili osobe u prirodi. Na primer, sva- }
ki uenik ima niz osobina (svojstava) koje ga opisuju. Ime,
godina roenja, adresa stanovanja, telefon, boja kose i Za sada, veoma jednostavno i oigledno. Kako se
oiju, u kom je razredu, koji smer i tome slino. koriste ova svojstva na strani korisnika ove klase? U okviru
U programiranju, kao to smo rekli ranije, klasa Main funkcije treba prvo deklarisati varijablu koja pokazu-
predstavlja ablon za objekat. Poto definiemo svojstva u je na objekat zasnovan na klasi Ucenik, kao to smo radili
klasi i na osnovu nje napravimo (instanciramo) vie obje- ranije. Ime varijable cu, je proizvoljno izabrano. Postavi-
kata, tipino e svaki od njih imati svoj skup svojstava, ba emo svojstva Prezime i Ime na proizvoljne vrednosti i
kao to svaki uenik ima samo svoje osobine. potom ispisati sadraj:

Programski jezik C# nudi dva osnovna naina za class Program


implementaciju svojstava klase. {
static void Main(string[] args)
{
Implementacija svojstava klase- javne varijable
Ucenik cu = new Ucenik();
Najjednostavniji nain, od koga emo i poeti se cu.Prezime = "Peri";
zasniva na deklaraciji javne (public) varijable unutar klase. cu.Ime = "Petar";
Sve to je u klasi definisano kao public, je vidljivo korisnici-
ma ove klase i mogu bez ogranienja postavljati i itati Console.WriteLine(cu.Prezime);
vrednost ovih varijabli. Console.WriteLine(cu.Ime);
Kao i do sada, radiemo sa projektom tipa Console.ReadKey();
"konzolna aplikacija" (eng. Console Application). Dakle }
pokrenite C# Express i izaberite link za novi projekt ovog }
tipa. Kao i do sada, na ekranu se po ablonu prikazuje
poetni kod sa ulaznom funkcijom static void Main. Obratite panju na pomo koju vam prua Visual
Zadatak je da napravimo klasu Ucenik sa (za sada) Studio radno okruenje prilikom unosa koda. Kada ste
svojstvima Prezime i Ime. ukucali varijablu cu i potom taku, automatski se otvorio
Kao i u prolom nastavku deklaraciju klase treba mali prozor koji vam nudi izbor iz liste svih svojstava i
uraditi posle funkcije static void Main. metoda koje poseduje klasa Ucenik:

class Program
{
static void Main(string[] args)
{
}
}
class Ucenik
{
}
10
Tehnologija koja prua ovakvu (i jo neke) vrste Rezultat izvravanja programa je oekivan. Ispisane su
pomoi se zove InteliSense i izuzetno je korisna jer skra- vrednosti svojstava Prezime i Ime kao to je prikazano na
uje vreme unosa koda i eliminie sintaksne greke. Pri- slici:
metiete da su svojstva prikazana plavom, a metode crve-
nom bojom. Takoe ete videti metode koji niste sami
napisali. O ovim metodama e biti rei kasnije.

Kada se pokrene ovaj primer (funkcijski taster F5),


dobiemo poruku koju do sada nismo imali prilike da vidi-
mo:

Napomena:
Ako umesto "Peri" na svom raunaru vidite "Peric", nema
razloga za brigu. U pitanju je podeavanje fonta koji se
koristi za komandni prozor. U svakom sluaju svojstvo

Pritisnite bilo koji taster za zavretak programa.


O emu se radi? Poto smo u kodu koristili naa
latinina slova i to u liniji cu.Prezime = "Peri"; razvojno Zatiena svojstva
okruenje nam postavlja pitanje u kom formatu elimo da
Oba svojstva u primeru, korisnik klase moe da
sauvamo izvorni kod kako se ne bi izgubili nai karakteri.
postavi na bilo koju vrednost. U ovom sluaju to ne pred-
Preciznije reeno, im se u kodu nalazi bar jedan
stavlja problem. Ali ako elimo da u klasu Ucenik dodamo
karakter van osnovnog ASCII skupa, odnosno latinica, iri-
svojstvo Razred, pod predpostavkom da je u pitanju ue-
lica, slova grke azbuke i slino, dobiemo isto upozorenje.
nik osnovne kole, validne vrednosti mogu biti samo bro-
Da se prezime Peri ne bi pretvorilo u Peric, treba kliknuti
jevi od 1 do 8. Ako svojstvo Razred napravimo kao javnu
na dugme "Sauvaj sa drugim kodiranjem" (eng. Save
(public) varijablu, nemamo naina da kontroliemo i pro-
With Other Encoding). U narednom dijalogu treba izabra-
verimo vrednost koja je upisana u nju i da zabranimo
ti opciju kao to je prikazano na slici:
pogrene vrednosti.

Da bi ovo ostvarili, moramo posedovati neki meha-


nizam koji proverava vrednost pre nego to se dodeli vari-
jabli. Ovo se postie pomou specijalnih set i get funkcija.

Tehnika je sledea: umesto da se pravi javna


(public) varijabla Razred, treba napraviti privatnu
(private) varijablu i radi bolje itljivosti joj dati slino ime
na primer prRazred (pr od private).
U ovom momentu jo uvek nemamo svojstvo Raz-
red, ali ga dodajemo pomou set i get funkcija. Sintaksa je
Kodiranje "Unicode (UTF-8 with signature)" e
jednostavna, navodi se tip i naziv svojstva koje je sada
sauvati izvorni kod u univerzalnom slovnom rasporedu
javno (public) i u okviru njega upiu set i get funkcije.
koji podrava sve svetske azbuke, pa i nau latinicu i irili-
cu. Kliknite na dugme "U redu" (eng. OK) kako bi isprav-
Izmeniemo postojei kod kako bi bilo jasnije:
no snimili kod i vie neete dobijati ovakvo upozorenje.

11
class Ucenik Rezime
{
Ako elimo da napravimo zatiena svojstva, kod
public string Ime;
kojih treba vriti proveru pre dodele vrednosti procedura
public string Prezime;
je sledea:
private int prRazred;
napraviti privatnu varijablu koja ima isto ime kao elje-
no svojstvo sa nekim prefiksom. (Ovu konvenciju ime-
public int Razred
novanja treba shvatiti kao preporuku, a ne kao vrsto
{
pravilo)
get
{ napraviti javno (public) svojstvo sa eljenim imenom i
return prRazred; tipom istim kao privatna varijabla
} unutar javnog svojstva uneti get i set delove.
u get delu korisniku pomou return naredbe vratiti
set
vrednost privatne varijable
{
prRazred = value; u set delu proveriti vrednost koju korisnik dodeljuje
} svojstvu (value) i ako je vrednost validna dodeliti je
} privatnoj varijabli. U suprotnom prikazati poruku o gre-
} ci.

Objanjenje:
Privatna varijabla prRazred nije vidljiva van klase, i Vano je primetiti da se ovde javno svojstvo koristi
korisnici klase ne mogu niti da postavljaju niti da itaju kao interfejs ka privatnoj varijabli. Kao neka vrsta zatite
njenu vrednost. Ipak, ova varijabla je ona koja je nama gde se mogu ispitati validne vrednosti pre dodele privat-
bitna i sa kojom radimo unutar svoje klase. noj varijabli. Ovo ispitivanje moe biti jednostavno, ali i
Korisnik moe da postavlja vrednost ove varijable, veoma sloeno zavisno od potrebe.
ali na posredan nain pomou public svojstva deklarisa- Dobro napravljena klasa treba sama sebe da "brani"
nog u liniji public int Razred. Svojstvo Razred se sastoji od od pogrenih vrednosti. Nekada ete je koristiti vi, a neka-
dva dela: get deo koji se automatski poziva kada korisnik da drugi programeri i to stalno treba imati u vidu.
ita vrednost svojstva Razred i set deo koji se automatski
U sledeem nastavku e biti govora o najeem
poziva kada korisnik postavlja vrednost svojstva Razred.
nainu za proveru, kako se pokree i obrauje greka u
U get delu, se korisniku zapravo vraa vrednost
sluaju da vrednost nije validna.
privatne varijable prRazred:
return prRazred;
U set delu se dodeljuje vrednost privatnoj varijabli prRaz-
Vebanje:
red.
prRazred = value; U klasi Ucenik napravite svojstvo Godiste godina
kada je roen uenik. Da li je ovom svojstvu potrebna za-
Promenjiva value je specijalna C# varijabla i pred- tita od pogrenog unosa i koje su validne vrednosti?
stavlja vrednost koju je korisnik upotrebio prilikom dodele Da li su validne vrednosti fiksne, a ako nisu od ega
vrednosti svojstvu. I ovde se nalazi klju za proveru vred- zavise?
nosti pre dodele varijabli prRazred.
Pre linije prRazred = value treba proveriti da li je sadraj
varijable value ispravan. Ako jeste dodeljuemo tu vrednost
varijabli prRazred, u suprotnom najee generiemo gre-
ku sa odgovarajuom porukom.
12
Mala kola programiranja C# (4) set
{
U predhodnom nastavku serijala smo govorili o prRazred = value;
kreiranju zatienih metoda klase. Kreiranjem privatne }
varijable i parom get i set funkcija smo implementirali }
interfejs za privatnu varijablu. Na ovaj nain smo dobili U klasi postoji javno svojstvo Razred koje definie u
potpunu kontrolu nad procesom dodele i itanja vrednosti kom razredu je uenik srednje kole. Oigledno, validne
svojstva. vrednosti za ovo svojstvo su brojevi od 1 do 4.
U ovom nastavku e biti obraena tehnika kojom se Svojstvo Razred je u stvari interfejs za privatnu vari-
vrednost svojstva moe zatititi, odnosno ograniiti samo jablu prRazred koja je tip int. Bitno je shvatiti da iako kori-
na validne vrednosti. snik klase vidi samo svojstvo Razred, za klasu je vana
samo vrednost koja se nalazi u privatnoj varijabli prRaz-
itaoci koji prate ovaj serijal treba da otvore projekt red.
na kome smo radili u prolom nastavku. Get procedura je zaduena za itanje svojstva i kao
Novi itaoci treba da urade sledee: to vidimo u kodu, ona korisniku klase jednostavno vraa
pokrenite Visual C# Express Edition vrednost varijable prRazred. S druge strane, za postavlja-
kliknite na link za kreiranje novog projekta (eng. Create nje vrednosti varijable prRazred je zaduena set funkcija
Project) koja vrednost (value) dodeljuje varijabli prRazred.
kliknite na ikonu "Konzolna Aplikacija" (eng. Console
Application) Da bi vrednost varijable prRazred ograniili na
napiite sledei kod (kod koji automatski generie rad- interval od 1 do 4, u set funkciji je potrebno izvriti prove-
no okruenje je sive boje, kod koji treba uneti je plave ru vrednosti varijable value. Vreme je da se upoznamo sa
boje): naredbom u C# jeziku koja nam ovo omuguava.

class Program
if naredba
{
static void Main(string[] args) { Kao i svi ostali programski jezici i C# poseduje ovu
Ucenik cu = new Ucenik(); osnovnu naredbu za proveru uslova. Sintaksa je jednosta-
cu.Prezime = "Peri"; vna:
cu.Ime = "Petar"; if (uslov) {
Console.WriteLine(cu.Prezime); // deo koji se izvrava ako je uslov taan
Console.WriteLine(cu.Ime); }
Console.ReadKey(); else {
} // deo koji se izvrava ako uslov nije taan
} }

class Ucenik { Na primer:


public string Ime; if (a == 5) {
public string Prezime; Console.WriteLine ("Varijabla a ima vrednost 5");
private int prRazred; }
public int Razred { else {
get { Console.WriteLine ("Varijabla a ima neku drugu
return prRazred; vrednost");
} }

13
U sluaju da varijabla a ima vrednost 5, uslov je public int Razred {
taan i izvrava se blok linija izmeu otvorene i zatvorene get {
vitiaste zagrade odmah ispod if naredbe. U naem slua- return prRazred;
ju to je samo jedna linija koda, ali ih moe biti proizvoljni }
broj. U suprotnom (eng. else), izvrie se blok linija ispod set {
naredbe else. Deo else je inae opcioni, ne mora se navo- if (value > 0 && value < 5) {
diti ako nam ne treba. prRazred = value;
}
Operator za proveru jednakosti je ==, a osim njega else {
postoje i sledei: // greska
> vee od if (a > 5) ... }
< manje od if (a < 5) ... }
!= razliito if (a != 5) ... }
>= vee ili jednako if (a >= 5) ...
<= manje ili jednako if (a <= 5) ... Na ovaj nain smo zatitili privatnu varijablu prRaz-
red od pogrenih vrednosti. Dodeljujemo joj vrednost
Uslov moe biti i sloen kada se sastoji od dva ili samo ako je value vee od 0 i manje od 5, odnosno u
vie osnovna uslova. U tom sluaju neophodno je navesti i intervalu od 1 do 4. ta raditi ako korisnik klase unese
logike operatore koji vezuju dva ili vie uslova. Na primer pogrenu vrednost? Taj sluaj se obrauje u else delu
elimo da proverimo da li varijabla a ima vrednost 5 i vari- uslova gde trenutno stoji samo komentar // greska.
jabla b ima vrednost 3.
Kompletan uslov je taan samo ako su tani iskazi Najei nain je da se generie greka u izvrava-
a == 5 i b == 3. Logiki operand koji na ovaj nain spaja nju koja se prosleuje korisniku klase. On je dalje odgovo-
dva uslova se zove i (eng. and) i simboliki se obeleava ran za obradu ove greke, a ako to ne uradi greka e zau-
se &&: staviti izvravanje programa.
if (a == 5 && b == 3)
// izraz je taan samo ako su oba uslova tana. Greke i njihovo pokretanje

Ako na primer, elimo da proverimo da li je varijab-


U .NET okruenju greka je predstavljana klasom
la a > 0 ili varijabla b <10 koristi se logiki operand ili
Exception. Tanije reeno, postoji vie vrsta ovakvih klasa
(eng. or) koji se simboliki obeleava sa dve vertikalne crte
koji se vezuju za specifine greke kao na primer rad sa
||:
datotekama, rad sa bazama podataka i slino. Klasa
if (a > 0 || b<10)
Exception predstavlja generalnu klasu za predstavljanje
// izraz je taan ako je taan ili prvi ili drugi ili oba uslova
greke koju emo mi i koristiti.
Ako se sada vratimo na poetni primer gde validna
Kao i kod svake klase, prvo je neophodno napraviti
vrednost svojstva Razred, odnosno vrednost privatne vari-
objekat pomou naredbe new:
jable prRazred treba da bude u opsegu od 1 do 4 ukljuu-
Exception greska = new Exception ("Pogrena vrednost
jui, ispitivanje bi obavili na sledei nain:
svojstva Razred");
if (value > 0 && value < 5)

U ovoj liniji koda smo napravili objekat na osnovu


U sluaju da je izraz taan dodeliemo privatnoj
klase Exception i taj objekat je predstavljen varijablom
varijabli prRazred vrednost value, a u sluaju da nije, pot-
greska. Odmah prilikom kreiranja mogue je, kao ulazni
rebno je na neki nain obavestiti korisnika klase da je nap-
parametar, napisati proizvoljni tekst koji opisuje greku.
ravio greku. Dopiite sledee linije koda:

14
U naem sluaju greka je opisana tekstom
"Pogrena vrednost svojstva Razred" i to je poruka koju e
dobiti korisnik klase kada vrednost svojstva Razred postavi
van validnog opsega.

Pokretanje ili podizanje greke (eng. raise error) se


izvrava naredbom throw gde je argument objekat koji
predstavlja greku:

throw greska; Ako sada promenimo liniju koja postavlja vrednost


svojstva Razred na nevalidnu vrednost, na primer:
Kada se izvri throw, klasa prestaje sa radom i ovu cu.Razred = 7;
greku prenosi na korisnika klase, koji potom treba da je i ponovo pokrenemo program, on se ubrzo zaustavlja i
obradi na odgovarajui nain.

Sada treba izmeniti primer kao to je prikazano:

static void Main(string[] args)


{
Ucenik cu = new Ucenik();
cu.Prezime = "Peri";
cu.Ime = "Petar";
cu.Razred = 3;
Console.WriteLine(cu.Prezime);
Console.WriteLine(cu.Ime); vraa nas u razvojno okruenje sa naom porukom o gre-
Console.WriteLine(cu.Razred); ci:
Console.ReadKey(); Obrada greaka
}
Da bi sve funkcionisalo ispravno, korisnik klase ne
treba da dozvoli da bilo koja greka nasilno zavri njegovu
i potom izmeniti set deo u klasi:
aplikaciju. Ovo se odnosi na sve mogue greke koje
mogu nastati u radu programa, a ne samo na na primer.
set
Greke moemo podeliti na tri grupe:
{
if (value > 0 && value < 5)
1. Sintaksne greke (eng. syntax errors) rezultat pogre-
{
no napisane naredbe, nedeklarisane varijable i slino.
prRazred = value;
Ove greke najee nisu problematine jer program koji
}
ih sadri ni ne moe da se kompajlira.
else
{
2. Greke u vreme izvravanja (eng. runtime errors)
Exception greska = new Exception
kao u naem primeru, greke koje se mogu ali i ne moraju
("Pogrena vrednost svojstva Razred");
dogoditi za vreme izvravanja programa. Najee su
throw greska;
rezultat neproverenih vrednosti varijabli i pogrenog uno-
}
sa korisnika. Relativno se lako pronalaze i ispravljaju.
}

15
Zanimljivost: static void Main(string[] args)
Opte prihvaen termin za greku u programiranju je {
"buba" (eng. bug). Otud i termin otklanjanje buba u pro- Ucenik cu = new Ucenik();
gramu (eng. debugging program). cu.Prezime = "Peri";
Odakle ovaj termin? cu.Ime = "Petar";
Prvi kompjuteri, pre pronalaska tranzistora su se try
zasnivali na vakumskim cevima - kao stari radio aparati i {
televizori. One su se u toku rada naravno grejale i pri cu.Razred = 7;
tome emitovale spektar svetlosti veoma privlaan za raz- }
norazne insekte. catch (Exception ex)
Jedna od dunosti osoba koji su tada odravali {
raunare je bilo redovno ienje vakumskih cevi od inse- Console.WriteLine ( ex.Message );
kata koji su se na njih zalepili i time im ometali hlaenje. }
Otud i potie ovaj termin. Console.WriteLine(cu.Prezime);
Console.WriteLine(cu.Ime);
Console.WriteLine(cu.Razred);
Obrada greke u C# se vri pomou naredbi try i Console.ReadKey();
catch. U osnovnom obliku sintaksa je sledea: }

try U obradi greke smo u konzoli ispisali tekst greke


{ koristei Message svojstvo klase Exception. Klasa
// linije koda koje mogu da generiu greku Exception je u kodu predstavljena objektnom varijablom
}
catch (Exception varijabla)
{
// obrada greke
}

Upotreba je jednostavna, svaku liniju ili vie njih


koje mogu generisati greku treba smestiti u try blok. U
sluaju da se generie greka, tok programa se automatski
preusmerava na catch blok. ex.
U njemu piemo kod koji ispravlja greku ili bar Kada pokrenemo program (obratite panju, vred-
obavetava korisnika ta nije u redu. Opciono pomou nost svojstva Razred je postavljena na pogrenu vrednost
Exception varijable moemo proveriti koja greka se 7), dobija se sledei rezultat:
dogodila, videti njen opis i zavisno od toga izvriti odgo- Ovde je vano zapaziti da program nije nasilno zau-
varajuu akciju. stavljen zbog greke, ve je ona obraena i program je
nastavio sa radom.
U naem primeru, greka se moe dogoditi na liniji Takoe vrednost svojstva Razred je ostala nepro-
gde se dodeljuje vrednost svojstvu Razred dakle ta linija menjena, odnosno ostavljena na inicijalnu vrednost nula.
se smeta u try blok. U catch bloku koji obrauje greku U sledeem nastavku serijala poinjemo sa progra-
emo u konzolnom prozoru ispisati opis greke. miranjem Windows formi odnosno sa aplikacijama koje
imaju korisniki interfejs. Konzolne aplikacije su bile neop-
Izmenite kod na sledei nain: hodni uvod u objektno programiranje, varijable i osnovne
programske strukture.

16
Mala kola programiranja C# (5) Posle par sekundi, nov projekt je kreiran i u njemu
se inicijalno nalazi poetna forma koja je prikazana na
Kreiranje Windows aplikacija
ekranu. U ovom momentu moete ak i pokrenuti program
(F5 funkcijski taster) i videti praznu formu na ekranu. Tre-
U ovom i sledeim nastavcima emo se posvetiti nutno naa aplikacija ne izgleda nita posebno, jednostav-
kreiranju Windows aplikacija u radnom okruenju Micro- na prazna forma ali ako malo bolje pogledamo ona ima
soft Visual C# Express edition. Na poetku, kada su se sve funkcionalnosti Windows forme: naslov, ikonu, mogu-
pojavile prve verzije Windowsa, programiranje Windows nost da je poveamo preko celog ekrana ili minimizujemo i
aplikacija je bilo veoma teko i dostupno samo odabranim konano zatvorimo, to ujedno i zaustavlja izvravanje pro-
profesionalcima. Pojavom vizualnih alata i takozvanog jekta.
RAD (Rapid Application Development rapidni razvoj
aplikacija) sistema, kreiranje ovakvih aplikacija je znaajno Odakle joj sve ove funkcionalnosti kada jo uvek
pojednostavljeno i postalo je dostupno irokom krugu nismo nita programirali? U predhodnim nastavcima ovog
programera. Kako je ovo postignuto? U predhodnim serijala bilo je govora o klasama, a naa forma je naslednik
poglavljima smo uili objektno programiranje i u njemu je postojee klase Form koja se nalazi u .NET Frameworku.
klju. Svi elementi koji se koriste u programiranju Svi naslednici bilo koje klase nasleuju njene funkcionalno-
Windows aplikacija su "prefabrikovani" - stoje nam na ras- sti uz mogunost dodavanja novih. Dakle puno stvari za
polaganju sa svojom paletom svojstava, metoda i dogaa- nas je unapred ve uraeno.
ja u vidu gotovih klasa. Nama samo ostaje da ih
organiyujemo na nain koji nam je potreban, postavimo Kada radimo Windows aplikacije razlikujemo dva
im odgovarajua svojstva i napiemo kod kao odgovor na osnovna dela:
akcije korisnika dogaaji klasa. Dizajn korisnikog interfejsa u kome "crtamo" i raspore-
Postavljamo se u ulogu arhitekte koji ima na raspo- ujemo kontrole na formi. Ovde takoe vrimo i pode-
laganju veliki broj elemenata koji ine jednu kuu. Na avanje svojstava i ponaanje kontrola.
nama je da dobro upoznamo te elemente, ukomponujemo
Kodiranje, deo u kome piemo kod kao odgovor na
ih i podesimo da harmonino funkcioniu.
akcije korisnika, na primer klik miem na komandno
Na vrhu hijerarhije elemenata je sama aplikacija,
dugme, izbor iz liste, zatvaranje forme i slino.
odnosno objekt Application. Ispod njega se nalazi bar
jedna, a obino i vie Windows formi. Svaka od njih sadri
standardne elemente korisnikog interfejsa Windowsa koje
nazivamo kontrole. Svakom korisniku Windowsa su poz-
nati ovi elementi u koje spadaju komandna dugmad, liste,
padajue liste, izbor opcija, meniji i tako dalje.
U ovom i sledeim nastavcima emo se upoznati sa
funkcionalnou koje nude ove kontrole i nauiti da ih
programiramo.

Na narednoj slici je dat prikaz okruenja i njegovih


elemenata potrebnih za razvoj Windows aplikacija:

17
1. Paleta sa alatima (Eng. Toolbox) lista kontrola koje se Kada elimo da napiemo kod koji se izvrava kada
mogu koristiti na formi korisnik neto uradi sa dugmetom postoji vie naina. Naj-
2. Pretraiva reenja (Eng. Solution Explorer) prikaz jednostavniji je da uradite dupli klik na komandno dugme.
svih projekata i njihovih elemenata (forme, klase, resursi i Sada je otvoren prozor za pisanje koda i kurzor se
ostalo) nalazi tano na poziciji gde treba da ponemo pisanje.

3. Svojstva (Eng. Properties) prikazuje svojstva izabrane


private void button1_Click(object sender, EventArgs e)
kontrole ili forme
{
Napomena:
Ako ne vidite prozor svojstava iz glavnog menija izaberite }
stavku View i kliknite na Properties Window.
Obratite panju na naziv funkcije button1_Click koji
Prva aplikacija ukazuje da se radi o kontroli koja se zove button1 i da
obraujemo dogaaj koji se izvrava kada korisnik klikne
Sada emo napraviti jednostavnu aplikaciju sa samo
na njega.
jednim komandnim dugmetom. Kada kliknemo na njega
Moda je na prvi pogled zbunjujue to je ostalo
ispisaemo poruku "Moja prva Windows aplikacija".
button1, a ne Test ali mi smo izmenili natpis na dugme-
Na postojeu formu treba postaviti jedno koman-
tu, ne i njegovo ime koje je ostalo button1.
dno dugme. Svaka kontrola se postavlja tako to se na nju
Ovo prikazuje jo jednu vanu injenicu: svaka kon-
klikne i potom prevue na formu. Dakle kliknite na stavku
trola na formi ima svoje jedinstveno ime pomou koga se
Button (paleta sa alatima) i prevucite je na formu. Kada je
vezuju dogaaji, ali takoe svojstva i metode kontrole.
kontrola na formi, moemo joj naknadno menjati poziciju i
Svojstvo kontrole koje odreuje njeno ime se naziva
dimenzije po elji. Ako nam ne treba, jednostavno na nju
Name i obavezno ga je definisati. Prilikom postavljanja
kliknite miem i obriete je pomou tastera Delete na tas-
dugmeta na formu, Visual Studio mu je automatski dodelio
taturi.
ime "button1". Ovo znai da bi sledee dugme dobilo ime
Na komandnom dugmetu inicijalno pie "button1"
"button2" i tako redom. Kasnije emo govoriti o nazivima
to emo izmeniti u "Test". Kliknite miem na dugme i u
kontrola, za sada emo ostaviti da ih postavlja Visual Studi-
prozoru svojstva (Eng. Properties) naite svojstvo pod
o.
nazivom "Text". Vidimo da tamo pie "button1". Izmenite
U okviru vitiastih zagrada napiite sledeu liniju koda:
ga u "Test" i pritisnite Enter taster. Sada naa forma sa
dugmetom treba da izgleda kao to je prikazano na slici.
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("Moja prva Windows aplikacija");
}

MessageBox predstavlja standardni dijalog za poruke u


Windowsu. Metoda Show prikazuje ovaj dijalog sa ulaznim
parametrom koji predstavlja tekst koji treba prikazati.

Kao i ranije vodite rauna o velikim i malim slovima


u kodu jer ih C# programski jezik razlikuje.
Pokrenite program (F5 funkcijski taster) i kliknite na
dugme.
Ako ste sve ispravno napisali, dobiete poruku kao
to je prikazano na sledeoj slici:

18
Kliknite na dugme "OK" i potom zatvorite formu
kako bi zaustavili program.
U razvojnom okruenju obratite panju na dve kar-
tice (Eng. Tab) iznad prozora za pisanje koda:
Form1.cs i Form1.cs [Design].

Klikom na njih prebacujete se u prikaz koda


(Form1.cs) i dizajniranja forme (Form1.cs [Design]). Ovu
proceduru emo esto raditi prilikom izrade aplikacije.
Prvo postavljamo i ureujemo kontrole na formi i
potom piemo kod za njihove dogaaje. Pokrenemo pro-
gram da bi proverili da li sve funkcionie i tako ciklino za
svaku formu u projektu.

U sledeem delu serijala nastavljamo sa kontrolama


i nauiemo kako se dodaju i koriste nove forme u projek-
tu.

19
Mala kola programiranja C# (6) Prilikom izvoenja programa, moramo programski
instancirati ovu klasu kako bi bilo ta dalje mogli raditi. U
Rad sa formama vreme dizajniranja forme, moemo po potrebi postavljati
razliite osobine svojstva forme, ali ih takoe i naknadno
Svaka Windows aplikacija se sastoji najmanje od menjati u vreme izvravanja.
jedne forme (formulara), meutim najee ih ima nekoli-
ko, pa ak i nekoliko desetina u sloenijim aplikacijama.
Dodavanje nove forme u program
Jasno je da treba nauiti naine kako programski otvoriti i
zatvoriti eljenu formu, kao i naine postavljanja osobina
forme. Otvorite primer koji smo radili u predhodnom broju
Ovo nas ponovo vraa na objektno programiranje, asopisa (Demo1), ili moete kreirati nov projekt: pokrenite
jednostavno zbog toga to svaka forma prilikom kreiranja Visual C# Express Edition, iz opcije File izaberite stavku
aplikacije predstavlja jednu klasu. Koncept je jednostavan: New Project, u otvorenom dijalogu izaberite Windows
obino se poinje od kreiranje "glavne" forme ona koja Application. Za ime projekta ukucajte Demo1 (linija
prva otvara prilikom pokretanja same aplikacije i onda se Name:). Na kraju kliknite na dugme OK. U oba sluaja se
dodaju sve ostale koje su nam potrebne. dobija kreiran projekt pod nazivom Demo1 sa prvom i za
Na primer, prilikom pokretanja programa MS Word, sada jedinom poetnom formom.
glavna forma je zapravo deo Worda gde unosimo i ureu-
jemo tekst. Svi ostali dijalozi kao to je ekran za podeava-
Napomena:
Paljivi itaoci i posmatrai e primetiti da se prilikom
pokretanja Worda zapravo prvo pokree ekran sa Word
logotipom i raznim informacijama. Ovaj ekran se posle
par sekundi automatski yatvara (zavisno od brzine rau-
nara) i tek onda se prikazuje prozor za unos teksta. Ovo
vai za sve office aplikacije i skoro sve ostale programe na
tritu.
Poetni prozori ovog tipa se zovu "Splash screen"
po uzoru na "Splash news" i oznaavaju prikaz oigledne
informacije koju je nemogue prevideti. Osim manje-vie
znaajnih informacija koje su prikazane na ovom ekranu,
oni imaju jo jednu, bitniju namenu: dok gledate ovaj ek-
ran, istovremeno, u pozadini se vri inicijalizacija ap-
likacije koju ste pokrenuli.
Psiholoki efekat je da im korisnik pokrene ap- Sada u Project Exploreru uradite desni klik na pro-
likaciju odmah vidi neku aktivnost na ekranu - ne treba da jekt Demo1, iz padajueg menija izaberite Add i iz podme-
eka par ili vie sekundi i da se pita da li je sve u redu. nija izaberite Windows Form kao to je prikazano na slici:
Na ovaj nain se otvara opti dijalog za dodavanje
nje opcija, umetanje tabela i mnogi drugi, predstavljaju nove stavke u projekat, sa izabranom ikonom Windows
zasebne forme koje se otvaraju kao odgovor na akciju Form. U ovom dijalogu moemo odmah dati i ime novoj
korisnika. formi (klasi) to emo i uiniti.
Teoretski gledano, svaka forma predstavlja klasu Ranije sam pomenuo da tehniki gledano nije neop-
koja je nasleena od bazne .NET Framework klase Form iz hodno, ali je svakako korisno i predstavlja dobru praksu
imenovanog prostora System.Windows.Forms. Bazna klasa davati unificirana imena svim klasama i objektima.
prua mnoge fukcionalnosti naoj klasi (formi) koje moe-
mo odmah koristiti. 20
U ovom smislu emo novoj formi dati naziv frm- Poto sada radimo na klasi Form1 i to u dizajn rei-
DrugaForma (jedna re, bez razmaka) koji treba upisati u mu, u Solution Exploreru uradite dupli klik na klasu Form1.
liniju Name i na kraju kliknuti na dugme Add.
Na formu je dalje potrebno postaviti komandno
Dodata forma je prikazana na ekranu, a u Solution dugme. Kao i u prolom nastavku serijala iz palete sa alati-
Exploreru je takoe prikazana sa specifinom ikonom koja ma (Toolbox) izaberite komandno dugme (Button) i nacr-
oznaava sve forme u projektu: tajte ga na povrini forme. Alternativno moete uraditi i
dupli klik miem na Button stavku iz palete sa alatima.

Svojstvo Name

Dugme je automatski dobilo ime "Button1", a na


njemu se nalazi istovetni tekst "Button1". Sada je vreme
da se upoznamo sa vanim svojstvom svakog elementa u
kreiranju korisnikog interfejsa. Svojstvo Name predstavlja
jedinstveno ime elementa na koje se referiemo kada pos-
tavljamo sva ostala njegova svojstva, piemo kod za njego-
ve dogaaje i koristimo njegove metode. Svojstvo Name
Iz Solution Explorera po potrebi moemo prilikom
zapravo predstavlja ime klase koja predstavlja taj element,
projektovanja i pisanja koda otvarati potrebnu formu i to u
na potpuno isti nain kao to se u programiranju imenuju
dva reima: reim za grafiko dizajniranje forme i reim za
promenjive.
pisanje programskog koda koji se nalazi na formi.
Pravila za zadavanje imena su jednostavna:
Programski kod
maksimalna duina za ime je 128 karaktera
Grafiki dizajn forme ime moe sadrati slova i brojeve, ali ne moe poeti
brojem
ime ne sme sadravati specijalne karaktere i razmake

Potujui ova pravila i preporuen prefiks, Name


svojstvo dugmeta emo postaviti na btnOtvoriFormu.
Kliknite jedanput na dugme i u prozoru Properties

Potrebno je izabrati formu i potom kliknuti na elje-


no dugme kao to je prikazano na predhodnoj slici. Opcio-
no moete uraditi i dupli klik na naziv forme, ime se ona
uvek otvara u grafikom reimu.

Sada elimo da na poetnoj formi (Form1) postavi-


mo standardno komando dugme i napiemo kod koji e
(dole desno u razvojnom okruenju) pronaite svojstvo
otvoriti drugu formu (frmDrugaForma) kada korisnik klik-
Name i promenite ga u btnOtvoriFormu kao to je prika-
ne na ovo dugme.
zano na slici i pritisnite Enter taster.

21
Primetiete da se natpis na dugmetu nije promenio. Klasa (pa i objekat) tipa Form ima metodu kojom se
Oigledno natpis na dugmetu ne prikazuje njegovo ime forma iscrtava i prikazuje na ekranu. Metoda Show() je
ve neto drugo. iskoriena u drugoj liniji. Sintaksa poziva metode bilo kog
Svaki element korisnikog interfejsa koji ima neki objekta je jednostavna:
natpis na sebi, ukljuujui i formu ima svojstvo Text koje ImeObjekta.NazivMetode (argumenti)
odreuje ovaj natpis.
U listi svojstava (Properties dijalog) za komandno Verzija metode Show koju mi koristimo nema argu-
dugme pronaite Text svojstvo i izmenite ga na mente, ali svejedno moramo napisati otvorenu i zatvorenu
"Otvori drugu formu". Text svojstvo ne podlee pravilima zagradu.
za zadavanje imena klasama i varijablama, tako da moete Pokrenite program (F5 funkcijski taster) i proverite
upisati ta god elite. Na kraju forma za dugmetom treba kako radi.
da izgleda ovako:
Modalne i nemodalne forme
Ako malo eksperimentiete primetiete sledee:
kada kliknete na dugme otvara se druga forma preko prve,
ali uvek moete kliknuti miem na prvu formu ime ona
sada prekriva drugu. Ovakva relacija izmeu dve forme se
zove "nemodalne forme".
esto je u praksi potrebno drugaije ponaanje. Nije
dozvoljeno ovakvo preklapanje formi, ve korisnik mora
zatvoriti drugu formu da bi se vratio na predhodnu. Ovak-
va relacija izmeu formi se zove "modalne forme" (esto
je u upotrebi i termin "Dialog forma"). Kao primer modal-
Kodiranje nog ponaanja moete opet pogledati skoro sve dijaloge u
Na kraju ostaje da upiemo kod koji e otvoriti dru- MS Wordu.
gu formu. Duplim klikom na dugme otvaramo kod za Da bi implementirali modalnu relaciju izmeu nae
pisanje dogaaja. Dugme poznaje puno dogaaja, meu- dve forme, potrebno je umesto metode Show() koristiti
tim ubedljivo najee se koristi Click dogaaj, to nam metodu ShowDialog(), takoe bez argumenata.
razvojno okruenje inicijalno i nudi. Zaustavite program ako je pokrenut, i izmeniti dru-
Poto forma frmDrugaForma predstavlja klasu, pre gu liniju koda:
korienja moramo napraviti instancu te klase.
Deklarisaemo varijablu koja e biti odgovarajueg MojaForma.ShowDialog();
tipa i inicijalizovati je kao pokaziva na instancu klase frm-
DrugaForma. Ime varijable nije bitno, a mi emo koristiti Ponovo pokrenite program i sada vidite da se ne
ime MojaForma. moete prebaciti na prvi formu dok ne zatvorite drugu.
Modalni (dialog) nain otvaranja forme se u praksi znatno
Na mestu gde se nalazi kurzor ukucajte sledee dve ee koristi.
linije koda: Zatvaranje forme
frmDrugaForma MojaForma = new frmDrugaForma();
Otvorenu formu moemo uvek zatvoriti na standar-
MojaForma.Show();
dni nain klikom na dugme x u njenom gornjem desnom
uglu. Meutim esto je potrebno programski zatvoriti for-
U prvoj liniji deklariemo varijablu MojaForma koja
mu. Da bi ovo uradili moramo se predhodno upoznati sa
je tipa frmDrugaForma i odmah joj dodeljujemo novu
pokazivaem this.
instancu (kljuna re new) objekta koji je baziran na klasi
frmDrugaForma.
22
this je varijabla koja pokazuje na objekat u kome se
nalazi u naem sluaju na formu. Kada bilo gde u kodu
koji se nalazi u formi napiete this vi se zapravo referiete
na sam form objekat te su dostupne sve metode i svojstva
ne samo forme, ve i svih elemenata koje se nalaze na
njoj.

Napomena:
Za programere u Visual Basicu i u VB.NET postoji istovetni
pokaziva koji se zove Me.

Metoda koja zatvara formu je Close() bez argume-


nata. Tako da kada bilo gde u kodu na formi napiemo:

this.Close();

ovo znai bezuslovno zatvaranje forme u kojoj se ovaj kod


nalazi.

Veba
Za vebu na kraju ovog nastavka pokuajte da ura-
dite sledee:
Na drugoj formi (frmDrugaForma) postavite dug-
me, dajte mu naziv btnZatvoriFormu i neka na njemu
bude tekst "Zatvori formu".
Kada korisnik klikne na ovo dugme treba naravno
zatvoriti ovu formu.

23
Mala kola programiranja C# (7) Za dugme, kao i za veinu ostalih kontrola moemo
Windows kontrole postaviti font koji se koristi kao i njegove atribute
(podebljan, ukoen, podvuen). Svojstvo Font nam omogu-
Osnove svake windows aplikacije predstavljaju for- ava sve ovo i na sledeoj slici je prikazano sa svim svojim
mulari (eng. forms) koji se po potrebi otvaraju i zatvaraju,
zavisno od toka i logike korisnikog okruenja. N a
svakom formularu se nalazi vie objekata koji predstavljaju
korisniki interfejs windows kontrole. U narednim pogla-
vljima emo se upoznati sa osnovnim windows kontrola-
ma, njihovom namenom, svojstvima, metodima i dogaa-
jima.
Osnovno za svaku kontrolu je svojstvo Name koje
predstavlja njen jedinstveni identifikator u okviru formula-
ra na kome se nalazi. Ovo znai da na jednom formularu
ne moemo imati dve ili vie kontrola koje se isto zovu.
Meutim, na dva ili vie formulara to je mogue.
Svojstvo Name treba zadavati po istom principu po kome
zadajemo imena varijabli u programskom kodu - bez raz-
maka i specijalnih karaktera, moemo imati brojeve u
nazivu, ali naziv mora poeti slovom. Kao to emo videti
kasnije, svojstvo name zapravo i jeste objektna varijabla
koja je pokaziva na instancu klase odgovarajue kontrole.
Dobra praksa je davati prefiks imenu svake kontrole
zavisno od njenog tipa. Nije obavezno, ali kasnije znaajno
olakava preglednost programskog koda. Lista preporue-
nih prefiksa za svaku kontrolu se nalazi na lokaciji atributima.
http://msdn2.microsoft.com/en-us/library/ms229045.aspx Od dogaaja, najee se koristi Click, koji se pokre-
e kada korisnik klikne na dugme.
Komandno dugme (eng. command button)
Veba:
Komandno dugme (ili samo dugme), predstavlja
Pokrenite nov projekt i kreirajte novu Windows apli-
najoigledniju i verovatno najjednostavniju kontrolu. Omo-
kaciju.
guava korisniku da klikom na njega pokrene odgovaraju-
Postavite komandno dugme na poetni formular.
u akciju segment programskog koda. Kljuno
Svojstvo Name postavite na cmdKrajRada, a svojstvo Text
svojstvo dugmeta je svojstvo Text kojim se postavlja nat-
na &Kraj rada.
pis na njemu. Generalno, svaka kontrola koja na sebi
poseduje neki natpis ima svojstvo Text.
Ovo svojstvo ima jo jednu mogunost: ako postavi-
te znak & ispred bilo kog karaktera u Text svojstvu, taj
karakter je podvuen i predstavlja skraenicu sa tastature
za klik akciju dugmeta.
Na primer, kada svojstvo Text dugmeta postavimo
na Lista &uenika, prikazuje se Lista uenika a skraenica
sa tastature je Alt+U. Jasno, na jednoj formi je potrebno
imati jedinstvene skraenice kako bi sve funkcionisalo
kako treba.
24
Kod za razliite dogaaje kontrole (eng. control Labela (eng. Label)
events) piemo na sledei nain: miem izaberite dugme i
kliknite na ikonu (narandasta munja) u dijalogu svojstava
Labela daje mogunost prikaza teksta na formularu
koja daje listu svih raspoloivih dogaaja izabranog ele-
koji moe biti samostalan, ali se obino vezuje za neku
menta, kao to je prikazano na slici.
drugu kontrolu i na taj nain opisuje njeno znaenje.
Najee se postavlja uz TextBox kontrolu koja je
opisana sledea. Kljuno svojstvo kontrole je Text koje
takoe poseduje mogunost dodele skraenice sa tastature
kao to smo radili na dugmetu.

Linija za unos teksta (eng. TextBox)

Kontrola koja omoguava korisniku da unese podat-


ke koji se dalje koriste u aplikaciji. Relativno sloena kon-
trola koja se veoma esto koristi prilikom graenja korisni-
kog okruenja. Omoguava unos teksta u jednoj ili vie
linija. Moemo ograniiti mogui broj unetih karaktera,
postaviti font koji se koristi i odrediti druge grafike ele-
Pronaite Click dogaaj i miem uradite dvostruki mente.
klik na njega. Na ovaj nain ste otvorili prozor za pisanje Kljuno svojstvo ove kontrole je takoe svojstvo Text
programskog koda koji se izvrava za izabranu akciju koje se moe postavljati i itati za vreme izvravanja aplika-
Click u naem sluaju. cije i na taj nain se vri obrada unosa korisnika.
U ovoj vebi, elimo da se program zavri kada Svojstvo Multiline oznaava da li je mogua jedna
korisnik klikne na dugme. (False) ili vie linija teksta (True).
Ako je svojstvo Multiline postavljeno na True, obi-
Na mestu kurzora upiite sledeu liniju koda: no se postavlja i svojstvo ScrollBars koje ovakvom vielinij-
skom tekstu dodaje mogunost pomeranja po vertikali i
Application.Exit(); horizontali.
Svojstvo MaxLength definie maksimalni broj karak-
Koristimo Application objekat koji predstavlja tera koji korisnik moe uneti. Inicijalno je postavljen na
pokaziva na aplikaciju i njegov metod Exit koji bezuslov- 32767, to je u praksi obino previe uvek e biti znatno
no zavrava rad aplikacije i oslobaa sve resurse koje ona manje.
koristi. Od dogaaja se najee koristi TextChanged.
Ovaj dogaaj se automatski pokree svaki put kada koris-
Pokrenite aplikaciju (F5 funkcijski taster) i kliknite nik unese ili obrie karakter u kontroli. Moe se iskoristiti
na dugme. Uoite da isto moemo postii skraenicom za proveru unetog sadraja, on line pretragu i tome slino.
Alt+K, jer smo postavili pomou Text svojstva dugmeta.
Veba:
to se tie velikog broja ostalih svojstava dugmeta,
probajte sami da eksperimentiete sa njima. elimo da napravimo jednostavan forumular u kome
korisnik moe da unese svoje ime i prezime.
Veina njih je orijentisana na grafiki izgled dugme- Na formular postavite dve Label i dve TextBox kon-
ta, pa posebno obratite panju na svojstvo Image i njemu trole i to sledeim redom:
slina.

25
1. Postavite prvu Label kontrolu i postavite joj sledea Napomena:
svojstva: Postoji vie varijanti metode Show MessageBox
Name: lblIme i Text: &Ime

2. Postavite prvu TextBox kontrolu sa svojstvom Pokrenite primer, unesite svoje ime i prezime i klik-
Name: txtIme i MaxLength: 15 nite na dugme Snimi. Ako ste sve upisali kako treba, dobi-
ete sledei rezultat sa dva uzastopna dijaloga za poruke.
3. Postavite drugu Label kontrolu sa svojstvima:
Name: lblPrezime i Text: &Prezime

4. Postavite drugu TextBox kontrolu sa svojstvim


Name: txtPrezime i MaxLength: 25

5. Na kraju postavite dugme sa svojstvima

Analiza primera:
Name: cmdSnimi i Text: &Snimi
Formular treba da izgleda ovako: Poto smo postavili skraenice na obe Label kontro-
U realnosti klikom na dugme cmdSnimi bi unete le, ispitajte kako funkcioniu. Kombinacija Alt+I treba da
podatke snimili u bazu podataka, ali za sada emo ih kurzor postavi na TextBox za unos imena, a Alt+P na
samo ispisati u dijalogu za poruke. TextBox za unos prezimena. Alt+S e pokrenuti Click
Kao to je opisano na poetku ovog nastavka, otvo- dogaaj dugmeta. Kako je ovo postignuto?
rite kod za Click dogaaj komandog dugmeta i napiite
sledee dve linije koda: U svakoj Windows formi postoj pojam TabOrder. On
definie redosled kojim se vri navigacija kada korisnik klik-
MessageBox.Show (txtIme.Text); ne na Tab ili Shift+Tab taster na tastaturi.
MessageBox.Show (txtPrezime.Text);
Veoma je bitno postaviti logini redosled kretanja po
Objekat MessageBox predstavlja dijalog za poruke. formularu. Svaka kontrola poseduje numeriko svojstvo
Poseduje metodu Show koja ima jedan parametar tekst TabIndex koje poinje od broja 0 pa na dalje.
koji treba prikazati. U ovom primeru prikazujemo sadraj U naem primeru prva labela ima TabIndex svojstvo
(uneti tekst) u kontrolama txtIme i txtPrezime. postavljeno na 0, prvi TextBox na 1, i tako redom.
Vidimo i sintaksu pristupa svojstvu bilo koje kontro-
le: ImeKontrole.SvojstvoKontrole.
Na ovaj nain moemo itati ali i postavljati vredno-
sti svojstava kontrola.

26
Drugi pojam koji treba znati je Focus.
On predstavlja situaciju kada kontrola postaje aktiv-
na. Na primer kada je kurzor postavljen u kontroli za unos
prezimena, kaemo da je TextBox txtPrezime dobio
fokus.

Ne mogu sve kontrole da imaju fokus. Oigledno,


Label kontrola ne moe da dobije fokus.
ta se dogaa kada korisnik na tastaturi klikne
Alt+P?
Labela lblPrezime ne moe da dobije fokus, te ga
automatski prenosi na prvu sledeu kontrolu koja to moe
u naem primeru to je TextBox txtPrezime.

Prva sledea kontrola se rauna upravo po svojstvu


TabIndex.
Svaka kontrola koju postavimo na formular auto-
matski dobija svoj TabIndex u skladu sa redosledom pos-
tavljanja. esto se meutim u praksi postavlja potreba
za runom izmenom redosleda kontrola. To moemo ura-
diti tako to emo svakoj kontroli pojedinano postaviti
TabIndex svojstvo, to moe biti nekomforno kada imamo
puno kontrola na formi.

Drugi nain je zgodniji i manje sklon grekama.


Zaustavite program i kliknite na formular. Iz menija
View izaberite stavku Tab Order.
Na ovaj nain je prikazano TabIndex svojstvo svake
kontrole na formularu.
Nama ostaje da sa po jednim klikom mia na svakoj
kontroli, redosledom koji je potreban postavimo odgova-
rajui TabIndex. Probajte ovo da uradite za svaku kontrolu
na naoj formi, i kada zavrite ponovo u meniju View
iskljuite opciju Tab Order.
U sledeem nastavku serijala nastavljamo sa dru-
gim, sloenijim Windows kontrolama.

27
Mala kola programiranja C# (8) Klikom na dugme elimo da proverimo stanje
Windows kontrole CheckBox kontrole i da zavisno od toga ispiemo odgova-
rajuu poruku.
Prilikom kreiranja korisnikog interfejsa u Da bi ovo uradili, moramo se upoznati sa naredbom
Windowsu, na raspolaganju nam je veliki broj grafikih za ispitivanje uslova u C# programskom jeziku. Poznavaoci
elemenata kontrola. U ovom nastavku se upoznajemo sa C ili C++ programskog jezika e videti da je sintaksa identi-
malo sloenijim kontrolama koje nam nude specifine fun- na:
kcionalnosti.
if (Uslov)
CheckBox kontrola
{
Ova kontrola omoguava korisniku da markira ili
// blok naredbi koji se izvrava kada je uslov taan
demarkira neku opciju. Ako imamo vie CheckBox kontrola
}
na formularu, one su meusobno nezavisne mogu se
Else
proizvoljno markirati ili demarkirati.
{
Kljuno svojstvo ove kontrole je svojstvo Checked
// blok naredbi koji se izvrava kada je uslov nije
koje moe imati dve vrednosti - True (da) i False (ne).
taan
Svojstvo Checked moemo postavljati i itati kako u rei-
}
mu dizajniranja tako i u reimu izvravanja aplikacije.
U kodu se najee koristi kroz IF uslov koji vri
Na primer:
ispitivanje da li je CheckBox markiran ili ne i u zavisnosti
If (a == 2)
od toga se vri dalje grananje koda.
{
Opis znaenja CheckBox kontrole se definie kroz
neki kod...
njeno Text svojstvo. Nije potrebno postavljati zasebnu
}
Label kontrolu ona je integrisana u CheckBox.
Veba:
Deo else je opcioni i ne mora se navoditi.
Pokrenite C# Express razvojni alat, kreirajte novu
Uslov moe biti kompozitni, sloen od dva ili vie
Windows aplikaciju i na inicijalnu formu postavite jednu
pojedinanih uslova. U tom sluaju je neophodno ove poje-
CheckBox i jednu Button kontrolu.
dinane uslove spojiti odgovarajuim logikim operatori-
Za Text svojstvo CheckBox kontrole unesite
ma.
"Opcija" (bez znakova navoda), a za Text svojstvo Button
Operatori AND (i) i OR (ili) se sintaksno oznaavaju
kontrole unesite "Test". Formular treba da izgleda kao to
sa && i II respektivno.
je prikazano na slici:
Na primer:
If (a==5 || b ==7)
uslov je taan ako je tano a=5 ili b=7 ili su oba uslova ta-
na.
Sada duplim klikom na dugme otvorite prozor za
pisanje koda. Poto nismo menjali inicialno postavljena
imena kontrola, CheckBox kontrola se zove checkBox1.
Upiite sledei segment koda u button1_Click proceduri:
if (checkBox1.Checked == true) {
MessageBox.Show("Opcija markirana");
}
else {
MessageBox.Show("Opcija nije markirana");
}

28
Pokrenite aplikaciju (F5 funkcijski taster) i isprobajte Sada pokrenite aplikaciju i testirajte je. Primetiete
je. Zavisno od stanja CheckBox kontrole treba da dobijete da moete markrati samo jedno radio dugme u svakoj gru-
odgovarajuu poruku: pi.
U praksi se Panel kontrola najee koristi za grupi-
sanje radio dugmadi.
Bitna svojstva su identina kao kod CheckBox kon-
trole: Checked i Text sa istim vrednostima i funkcijom.
Korienje je takoe identino kao kod CheckBox
kontrole. U kodu se proveravaju statusi radio kontrola i
zavisno od toga se vri grananje u aplikaciji.

List Box kontrola

Ovo je sloenija kontrola, koja se sastoji od vie sta-


vki. Na primer, moe predstavljati listu predmeta u koli.
Korisnik moe izabrati predmet i na primer upisati ocene i
slino.
Liste se mogu "puniti" za vreme dizajna, ali je ipak
Radio Button kontrola najei sluaj punjenje u vreme izvravanja i to iz baze
Ova kontrola je slina CheckBox kontroli, ali u podataka. Za sada emo je napuniti pomou jednostavne
ovom sluaju moemo markirati samo jednu kontrolu u petlje iz koda.
okviru iste grupe. Otud i naziv "radio dugme", setite se Ako koristimo objektno orijentisanu terminologiju,
starih radio aparata gde se preko mehanikih dugmadi moemo rei da je lista kolekcija stavki tipa Object.
birao frekventni opseg. Pritiskom na bilo koje dugme, Kolekcija oznaava skup objekata istog tipa. Svaki
predhodno ukljueno se iskljuuje samo jedno moe biti lan kolekcije ima svoj jedinstveni indeks koji poinje od
upaljeno. broja 0 do ukupnog broja stavki u kolekciji umanjenog za
Pod grupom radio dugmia se smatraju svi koji su jedan.
postavljeni na isti kontejner kontrola. Oigledni kontejner Bitno je razumeti da kolekcija ima svoja specifina
kontrola je formular, ali ih ima jo nekoliko na raspolaga- svojstva i metode, ali takoe i svaki objekat u kolekciji.
nju. Na primer svaka kolekcija ima svojstvo Count koje je
Na formu postavite tri Radio Button kontrole. One samo za itanje i daje broj objekata u kolekciji. Kolekcije
su na istom kontejneru formular, te su povezane i imaju metode kojima se moe dodavati nov objekat u kole-
meusobno se iskljuuju. kciju (Add), obrisati pojedinani objekat (RemoveAt) ili
Zatim na formu postavite kontrolu Panel. Ona obrisati sve lanove kolekcije (Clear). Svojstva i metode
predstavlja drugi kontejner na koji emo staviti jo tri radi- pojedinanih objekata kolekcije zavise od tipa objekata.
o dugmeta. Konani izgled formulara: Ako postoji kolekcija pod nazivom "MojaKolekcija",
metodima i svojstvima te kolekcije pristupamo na sledei
nain:
MojaKolekcija. Add (...)
MojeKolekcija.Clear ()
i slino
Pojedinanim objektima kolekcije se pristupa preko
indeksa objekta:
MojaKolekcija[5].Text

29
Indeksi objekata lanova kolekcije idu od nula do int i;
MojaKolekcija.Count 1 listBox1.Items.Clear();
U List Box kontroli ova kolekcija se zove Items i for (i = 1; i <= 100; i++)
sastoji se od lanova pod nazivom Item. {
Sve kolekcije .NET Framework-a potuju istu listBox1.Items.Add(i);
nomenklaturu: kolekcija je imenica u mnoini a svaki lan }
kolekcije je ista imenica u jednini. Na primer kolekcija Tab-
les se sastoji od objekata tipa Table. Sada, pre punjenja liste uvek briemo sve stavke.
Na formu postavite List Box i jednu Button kontro-
lu. Ostaviemo inicijalne nazive ovih kontrola listBox1 i Ako elimo da proitamo vrednost izabrane stavke iz
button1. liste, postoje dva naina:
elimo da klikom na dugme napunimo listu brojevi- jednostavno proitamo svojstvo Text: listBox1.Text
ma od 1 do 100. Koristimo metodu Add kolekcije Items pomou svojstva SelectedItem koja vraa Object pre-
gde je ulazni parametar generiki tip Object to znai da zentaciju izabrane stavke: listBox1.SelectedItem
moemo "podmetnuti" varijable numerikog ili string tipa
svejedno, sve su interno nasleene od istog Object tipa.
Brisanje pojedinane stavke iz liste se vri metodom
Duplim klikom na dugme otvorite prozor za pisanje koda:
RemoveAt kolekcije Items. Na primer ako elimo da obri-
emo treu stavku u listi:
int i;
for (i = 1; i <= 100; i++)
listBox1.Items.RemoveAt (2);
{
listBox1.Items.Add(i);
Obratite panju da je indeks tree stavke = 2 jer se
}
indeksi broje od nule.

Pokrenite primer i testirajte ga. Primetiete da svaki


Svojstvo SelectedIndex pokazuje indeks izabrane
put kada pritisnete dugme dodajete jo 100 stavki u listu.
stavke iz liste. U pitanju je tip int, a ako ni jedna stavka nije
Ako elimo da pre dodavanja obriemo sve stavke
izabrana vrednost SelectedIndex svojstva je jednaka -1.
(ako ih ima), dodaemo jo jednu liniju koda pre petlje
Ovo se koristi kao indikacija da korisnik nije izabrao
koja brie sadraj kolekcije Items:
ni jednu stavku iz liste.

SelectedIndex svojstvo je predvieno i za itanje i


za pisanje, tako da ako iz koda elimo da izaberemo na
primer petu stavku u listi:

listBox1.SelectedIndex = 4;

U narednim nastavcima ovog serijala emo se upo-


znati sa jo nekoliko kontrola i polako prei na korienje
baze podataka u C# aplikacijama.

30
Mala kola programiranja C# (9) Osim teksta stavka menija moe imati sliicu (eng.
Kreiranje menija u aplikaciji Icon) i definisanu skraenicu sa tastature (eng. Shortcut).
Kreiranje menija
Posle letnjih odmora nastavljamo sa malom kolom
Pokrenite Visual C# Express razvojno okruenje i
programiranja u C# programskom jeziku. Nadam se da
kreirajte novu Windows aplikaciju. Meni emo kreirati na
smo se svi odmorili i da smo spremni za uenje.
inicijalnoj formi (Form1).
U paleti sa alatkama (eng. Toolbox) pronaite sekci-
Rad sa menijem ju Menus & Toolbars. U okviru nje pronaite kontrolu
Gotovo svaka Windows aplikacija ima meni kao MenuStrip koja daje potrebne funkcionalnosti menija na
davno ustanovljeni vid interakcije sa korisnikom. Prednosti formi.
menija su mogunost hijerarhijske organizacije koje odgo-
varaju vaoj aplikaciji uz minimalno zauzee prostora.
Meni se obino nalazi pri vrhu forme, ali to ne mora
biti sluaj. Moete ga postaviti na dno ekrana, pa ak i po
vertikali ako vam to odgovara.
Dodatnu snagu menija predstavlja mogunost dina-
mikog dodavanja ili sakrivanja stavki ime meni prati
korisnika zavisno od akcija koje se dogaaju u aplikaciji.
U Visual Studiju kreiranje menija je lako, moe se
rei zabavno i znaajno je unapreeno u odnosu na sada
ve prastari ali svojevremeno veoma popularni Microsoft
Visual Basic 6.
Prilikom kreiranja menija razlikujemo horizontalnu
liniju i vertikalne delove menija koji se prikazuju kada kori-
snik klikne na stavku u horizontalnoj liniji. Vertikalna linija
moe imati stavki na vie nivoa hijerarhije. Prevucite je i pustite na formu - nije vano gde, jer
Na sledeoj slici vidite View meni iz radnog okrue- se meni automatski pozicionira na vrh forme, a sama kon-
nja Visual C# Express edition. trola u specijalnom prozoru ispod forme kao to je prikaza-
no na sledeoj slici.

31
Ako elite da kreirate meni, prvo morate da kliknete &Otvori
na kontrolu na dnu forme koja je dobila inicijalno ime &Snimi
menuStrip1. Tada se u dizajneru prikazuje meni na vrhu
Snimi k&ao
forme.
Zapazite tekst Type Here koji dovoljno govori -
sam za sebe. Napraviemo deo menija koji je manje-vie &Kraj rada
standardan za veinu aplikacija.

Tamo gde pie Type Here otkucajte Ako za tekst stavke unesete samo znak (minus),
Datoteka (bez znakova navoda) ili File ako elite meni on ima specijalno znaenje: u meniju se prikazuje horizon-
na engleskom jeziku. talni separator. Korisno kada treba da vizuelno razdvojite
im ponete da kucate odmah e se ispod i desno razliite funkcionalne grupe u okviru vertikalnog menija.
od ove stavke otvoriti mogunost za dalji unos stavki Na kraju na meni treba da izgleda kao na sledeoj slici:
menija, horizontalno i vertikalno:

Verovatno ste primetili da svaki meni ima pridruen


takozvani hot key. Slovo ili broj koji uz pritisnut Alt
specijalni taster predstavlja skraenicu za izbor stavke u Redom bi dalje popunjavali ostatak menija, zavisno
horizontalnom delu menija. od funkcionalnosti aplikacije.
Primer menija na formi koji je popunjen standar-
Ova funkcionalnost se jednostavno definie pot- dnim stavkama (na engleskom jeziku) moete videti na
rebno je ispred karaktera koji treba da bude hot key sledeoj slici:
ukuca karakter &. Ako elimo da hot key za meni
Datoteka bude kombinacija Alt+D jednostavno ukucajte
&Datoteka.
Karakter & se ne prikazuje, ve je ispisano
Datoteka. Podvueno slovo oznaava skraenicu sa tas-
tature. Ovo se i vidi im pritisnite Enter taster ime zavra-
vate unos teksta u stavci menija.

Nastavljamo sa menijem Datoteka tako to emo


ispod njega napraviti nekoliko stavki. Ukucajte jedno ispod
drugog, redom:

32
Application je referenca na aplikaciju koju kreiramo.
Programiranje menija:
Poseduje metod Exit koji izvrava bezuslovni prekid rada
Svaku stavku menija je najbolje tretirati kao komad-
aplikacije i oslobaa sve resurse koje je aplikacija zauzela
no dugme (eng. Button). Programiranje se vri u Click
(memoriju, datoteke, baze podataka i tako dalje...)
dogaaju stavke menija.
U primeru koji smo zapoeli kliknite samo jednom
Pokrenite aplikaciju i miem kliknite na Kraj rada.
na stavku menija Kraj rada. Svaka stavka menija ima
Pokuajte takoe i pomou skraenica sa tastature:
svoj set svojstava koja su vidljiva u standardnom prozoru
prvo Alt+D kako bi otvorili meni Datoteka, a potom samo
za prikaz svojstava objekta - Properties prozoru:
taster K kako bi aktivirali stavku Kraj rada.

Skraenice
Da li je mogue definisati skraenicu sa tastature
koja e, na primer, direktno aktivirati stavku Kraj rada?.
Naravno da je mogue, ak se moe definisati kom-
binacija bilo kog specijalnog tastera (Control, Alt ili Shift) i
obinog karaktera. Takoe moete iskoristiti funkcijske i
druge specijalne karaktere sa tastature.

Zaustavite program ako je pokrenut i ponovo jednim


klikom mia izaberite stavku Kraj rada.
Potom u prozoru svojstava (eng. Properties) prona-
ite svojstvo ShortcutKeys. Otvorite padajuu listu pored
ovog svojstva i trebalo bi odmah sve da bude jasno:

Kao i kod svake druge kontrole kljuno svojstvo je Markirajte Alt i iz padajue liste izaberite slovo K
Name koje je automatski generisano u naem sluaju kao to je prikazano na gornjoj slici. Sada kombinacija
krajRadaToolStripMenuItem. Alt+K zavrava nau aplikaciju. Pokrenite aplikaciju i pro-
Svojstvo Text definie tekst stavke menija i njega bajte.
smo podeavali iz dizajnera. Primetite da se uz stavku menija prikazuje i njena
Sada uradite dupli klik na stavku menija Kraj s k ra e ni ca . O v o s e p o d e a va s vo j s t v om
rada, ime je otvoren Click dogaaj u prozoru za pisanje ShowShortcutKeys koja moe imati vrednosti True (da)
koda. Kada korisnik klikne na Kraj rada elimo da zaus- ili False (ne).
tavimo izvravanje programa. Upiite sledeu liniju koda:

Application.Exit();

33
Korisna je i mogunost da pored svake stavke meni-
ja imate znak za overu (eng. Check).
Svojstvo Checked koje moe imati vrednosti True ili
False obezbeuje upravo ovo.

Izaberite stavku Snimi u svojstvima pronaite Che-


cked i postavite ga na True. Sa leve strane ove stavke se
pojavljuje znak za overu.
U praksi se znak za overu prikazuje ili ne zavisno od
logike programskog toka aplikacije i akcija korisnika. Na
Slike
primer, linija koda:
Svaka stavka menija (ukljuujui i stavke u horizon-
talnoj liniji) moe imati i sliicu (eng. Ikon) koja doprinosi
snimiToolStripMenuItem.Checked = true;
lepem i razumljivijem korisnikom interfejsu.
Sliice koje se koriste za ovu namenu su najee
e za vreme izvravanja programa postaviti znak za overu
bmp ili jpeg formata, dimenzija 16x16 piksela. Pogledajte
pored stavke menija.
na Internetu i naiete veliki broj kolekcija sliica za bes-
platno preuzimanje. Ako ste veti moete ih napraviti i
sami.
Takoe, u praksi se esto koristi dinamiko prikazi-
Pomou svojstva Image moete da izaberete sliku
vanje ili skrivanje stavke menija ili cele grupe, opet zavisno
sa vaeg raunara i dodelite je stavci vaeg menija.
od logike aplikacije. Za ovo imamo dve mogunosti, odno-
Kliknite na malo dugme pored ovog svojstva i dobi-
sno svojstva:
1. Svojstvo Enabled koje kada je postavljeno na False,
prikazuje stavku menija u sivoj boji i korisnik ne moe
da klikne na nju. Korisno ako elite da korisnik zna da
stavka menija postoji, ali trenutno nije dostupna.
2. Restriktivnije svojstvo Visible (koje imaju sve kontrole)
postavljeno na False ini da se stavka menija uopte ne
vidi.

ete sledei dijalog:


U ovom dijalogu se dodaju resursi aplikaciji. Oni
osim slika mogu biti i zvune datoteke, animacije kao i
druge binarne datoteke koje koristite u aplikaciji.
Kliknite na dugme Import i sa diska vaeg rau-
nara izaberite sliku koju ste pripremili. Na kraju kliknite na
dugme OK. Ako je slika vea od 16x16 piksela, bie auto-
matski skalirana na tu veliinu.

34
Mala kola programiranja C# (10) U svakom sluaju osnovne funkcionalnosti su iste:
Rad sa standardnim dijalozima i datotekama Mogue je izabrati datoteku, prikazane su samo datoteke
koje zadovoljavaju odreeni kriterijum (samo doc ekstenzi-
Veina Windows aplikacija ima potrebe da manipu- je na prvoj, odnosno mdb na drugoj slici) uz mogunost da
lie razliitim datotekama; tekstualne datoteke, slike, itd. u se runo unese ime datoteke - File name polje.
smislu itanja i pisanja sadraja.
U ovom nastavku male kole programiranja za C# Dobra vest je to nema potrebe runo programirati
emo se posvetiti upravo ovome. Manipulacija datotekama ove dijaloge. Oni su sistemski i postoje u svakoj verziji
obavezno ukljuuje i standardne dijaloge za izbor i uva- Windowsa od kada on postoji. ak, ako na primer kreirate
nje sadraja. Oni se otvaraju izborom opcija Snimi (eng. aplikaciju u Windowsu XP sa ovim dijalozima i kopirate
Save) i Otvori (eng. Open). izvrnu datoteku na Windows Vistu videete Vistine dijalo-
ge bez ikakve izmene aplikacije.
Na primer, u Microsoft Wordu dijalog za otvaranje Korienje ovih dijaloga je veoma jednostavno,
dokumenta je prikazan na sledeoj slici: direktno i potpuno podrano u Visual C# Express Edition.

Korak-po-korak sistem za korienje ovih dijaloga:


1. postaviti odgovarajuu kontrolu na formular
2. postaviti potrebna svojstva kontrole (naslov, poetni
direktorijum, filter za ekstenzije datoteka...)
3. otvaranje dijaloga
4. po zatvaranju dijaloga proveriti da li je korisnik izabrao
datoteku ili kliknuo na dugme Odustani (eng. Cancel)
5. ako je izabrana datoteka, iz svojstva FileName itamo
putanju i ime datoteke i dalje radimo sa njom

Napraviemo jednostavan primer koji pokree Open


Zavisno od verzije operativnog sistema, zavisi dijalog i ime izabrane datoteke ispisuje u naslovu formula-
izgled i funkcionalnost ovih dijaloga. Na gornjoj slici je ra.
prikazan Open dijalog u operativnom sistemu Windows Pokrenite Visual C# Express Edition i u poetnom
Vista. U Windows XP operativnom sistemu on izgleda ekranu kliknite na link Create Project. U dijalogu New
malo drugaije: Project izaberite Windows Application i kliknite na
dugme OK
Posle nekoliko sekundi projekt je kreiran i prikazan
je poetni formular. Na dalje radimo po gore prikazanim
koracima.

1. postaviti odgovarajuu kontrolu na formular


U paleti sa alatkama (sa leve strane razvojnog okru-
enja), pronaite sekciju Dialogs kao to je prikazano na
sledeoj slici:

35
Iz ovoga se vidi da se svaki filter sastoji od dva dela.
Naziv filtera i kriterijum za prikaz datoteka. Separator je
vertikalna crta. Obratite panju da na kraju ne treba staviti
vertikalnu crtu.
Dozvoljene su i sledee kombinacije:
Slike|*.jpg;*.gif;*.bmp|Video|*.mpg;*.avi;*.wmv
U ovom sluaju takoe imamo dva filtera, Slike i
Video ali svaki od njih e prikazati datoteke sa vie eksten-
zija. Separator izmeu ekstenzija istog filtera je karakter
taka-zarez.
U naem primeru, svojstvo Filter openFileDialog1
kontrole postavite na:
Tekst datoteke|*.txt|Sve datoteke|*.*

Obino se postavlja i naslov dijaloga koji se definie


pomou svojstva Title. Poto u naem primeru treba ot-
voriti tekstualne datoteke postavite ovo svojstvo na Otvori
U ovoj sekciji se nalaze svi standardni Windows
tekstualnu datoteku.
dijalozi. Osim pomenutih, tu su dijalozi za izbor boje, pre-
gled direktorijuma i izbor fonta. Opciono moemo postaviti naziv direktorijuma iji
e saraj biti prikazan odmah po otvaranju dijaloga. Ako
Na formular postavite (prevuci i pusti postupak) elimo da se odmah prikae koren diska C: u svojstvo
kontrolu OpenFileDialog. Kontrola se prikazuje na traci InitialDirectory upiite C:\.
ispod formulara i inicijalno je dobila naziv (Name svojstvo) Sada smo pripremili dijalog za otvaranje.
openFileDialog1.

NAPOMENA:
2. Postaviti potrebna svojstva kontrole (naslov, poetni Sva pomenuta svojstva se mogu postaviti kako u vreme
direktorijum, filter za ekstenzije datoteka) dizajniranja (kao to smo mi uradili), tako i u vreme izvra-
Kada pokrenemo dijalog za otvaranje datoteke, vanja programa.
uobiajeno je da u njemu vidimo samo datoteke sa odre-
enom ekstenzijom koju naa aplikacije prepoznaje. Obi-
no se za svaki sluaj dodaje i opcija za prikaz svih datoteka
3. Otvaranje dijaloga
- filter *.* sigurno ste do sada u ovakvim dijalozima videli
opciju All files (sve datoteke). Dijalog poseduje metodu ShowDialog koja kao
Filter Open dijaloga se postavlja pomou istoime- rezultat izvravanja vraa akciju korisnika u dijalogu. Ova
nog svojstva Filter. Ovo svojstvo je tipa string i zahteva akcija predstavlja enumeraciju pod nazivom DialogResult.
specifino formatiranje. Na primer, ako ovo svojstvo pos- Nama su od interesa samo dve opcije:
tavimo na: DialogResult.OK - korisnik je izabrao datoteku
Tekst datoteke|*.txt|Sve datoteke|*.*
DialogResult.Cancel - korisnik je zatvorio dialog (kliknuo
napravili smo dva filtera. Prvi sa nazivom Tekst datote-
na Cancel dugme)
ke koji prikazuje sve datoteke sa ekstenzijom txt, i drugi
sa nazivom Sve datoteke koji prikazuje upravo to: sve
datoteke sa bilo kojom ekstenzijom.

36
Proverom ove povratne vrednosti znamo da li je Prikaz sadraja izabrane datoteke
datoteka izabrana i dalje nastavljamo rad sa njom.

Otvaranje dijaloga i izbor datoteke, naravno ne otva-


Na formular postavite jedno dugme (Button kontro-
ra niti prikazuje njen sadraj. Sledei korak je da zaista
la) i uradite dupli klik miem na njega kako bi napisali par
prikaemo sadraj tekstualne datoteke.
linija kda.
Za otvaranje, itanje i pisanje po datotekama je
zaduen set klasa u imenovanom prostoru (eng. NameSpa-
private void button1_Click(object sender, EventArgs e)
ce) System.IO
{
Za itanje datoteka koristi se klasa StreamReader
if (openFileDialog1.ShowDialog() == DialogRe-
kojoj se u konstruktoru zadaje putanja do datoteke. Tano
sult.OK)
ono to ve imamo u FileName svojstvu dijaloga.
{
Metodom ReadToEnd StreamReader objekta ita se
this.Text = openFileDialog1.FileName;
kompletni sadraj zadate datoteke, i ova metoda vraa tip
}
string koji emo prikazati u kontroli TextBox.
}

Zaustavite aplikaciju i na formular postavite TextBox


Pomou openFileDialog1.ShowDialog() otvaramo
kontrolu u kojoj emo ispisati sadraj tekstualne datoteke.
dijalog i odmah proveravamo njegovu povratnu vrednost.
Kontrola je inicijalno dobila ime (Name svojstvo) textBox1.
Ako je ona jednaka DialogResult.OK, znai da je korisnik
Postavite joj sledea svojstva na prikazane vrednosti:
izabrao datoteku i kliknuo na dugme Open u dijalogu.
Multiline: True
U tom sluaju u svojstvu FileName se nalazi ime
ScrollBars: Vertical
izabrane datoteke sa kompletnom putanjom. U naslov
formulara (this.Text) upisujemo putanju i ime izabrane
Formular sada treba da izgleda kao na sledeoj slici:
datoteke.
Dakle svojstvo FileName je kljuno, jer definie
lokaciju izabrane datoteke.
Pokrenite program (F5 funkcijski taster) i kliknite na
dugme. Obratite panju na dva filtera koja smo kreirali i
proverite funkcionisanje oba. Na svom raunaru pronaite
odgovarajuu datoteku i kliknite na dugme Open na
dijalogu. Nakon ovoga u naslovu forme e biti ispisana

Uradite dupli klik na dugme, kako bi modifikovali


kd kao to je prikazano na sledeoj strani:

37
private void button1_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
this.Text = openFileDialog1.FileName;
System.IO.StreamReader sr =
new StreamReader
(openFileDialog1.FileName);
textBox1.Text = sr.ReadToEnd();
sr.Close();
} Provebajte sami!
}
Pokuajte da proirite primer tako to ete omogui-
Inicijalizujemo objekat sr tipa
ti korisniku da sadraj textBox1 kontrole snimi kao novu
System.IO.StreamReader i u konstruktoru postavljamo ime datoteku.
datoteke koju je korisnik izabrao u dijalogu. Treba dodati jo jedno dugme (Button) na formular
u kome ete za Click dogaaj napisati sav potrebni kd.
Metodom ReadToEnd() itamo kompletni sadraj
datoteke i postavljamo ga u Text svojstvo kontrole
Ovog puta koristimo SaveFileDialog kontrolu. Svojs-
textBox1. tva i upotreba je identina kao u OpenFileDialog kontroli
Na kraju treba obavezno treba zatvoriti StreamRea-
koju smo koristili u primeru.
der objekat, to se radi metodom Close(). Klasa StreamWriter nam daje sve potrebne funkcio-
UPOZORENJE: nalnosti. U konstruktoru se takoe navodi puna putanja i
Ako StreamReader ne zatvorite metodom Close(), ime datoteke, ali sada je to datoteka koja ne postoji, ve e
datoteka koja se ita ostaje zakljuana (eng. Locked) tako je kreirati StreamWriter objekat.
da ni jedna druga aplikacije ne moe da je otvori. Kae se Upis sadraja u datoteku se vri metodom Write
da StreamReader datoteku otvara u eksluzivnom reimu. koja kao ulazni argument ima tekst koji treba da upie u
Meutim, ako regularno zatvorite svoju aplikaciju, datoteku.
automatski se otkljuavaju sve otvorene datoteke. Takoe je potrebno na kraju zatvoriti StreamWriter
objekat pomou metode Close().

38
Mala kola programiranja C# (11) Pokrenite Visual C# Express i kreirajte novu
Greke u programiranju i obrada greaka Windows aplikaciju. Na inicijalnu formu postavite jedno
komandno dugme u uradite dupli klik. Kao to smo videli
U februarskom broju asopisa i etvrtom nastavku ranije, automatski se otvara prozor za pisanje koda koji
kole programiranja smo prvi put pomenuli i ukratko obja- obrauje Click dogaaj komandnog dugmeta.
snili greke u C# programiranju. Sada je vreme da detalj- Ovde emo namerno napraviti sintaksnu greku i
nije obradimo ovu problematiku. videti kako je ona prikazana u razvojnom okruenju. Otku-
cajte sledeu liniju koda:
Greke u programiranju se dogaaju. Nije pitanje
da li e se u vaoj aplikaciji dogoditi greka, ve kada e se private void button1_Click(object sender, EventArgs e)
ona dogoditi. Greke u radu programa su injenice koje {
treba prihvatiti i na odgovarajui nain reagovati. MessageBox ("TEST");
Teoretski govorei, postoje tri grupe greaka na }
koje se nailazi u svakom programiranju:
Simulirali smo greku tako to smo izostavili metodu
1. Sintaksne greke Show, tako da bi ispravna linija trebala da glasi:
Nastaju kada pogreite u sintaksi programskog jezi-
ka, korienju neke klase i slino. Ove greke nisu MessageBox.Show("TEST");
opasne jer aplikacija koja ih sadri jednostavno ne moe
da se prevede (kompajlira), pa samim tim ni pokrene. Sada pokrenite aplikaciju (F5 funkcijski taster).
Obratite panju na pitanje koju dobijate:
2. Greke u vreme izvravanja (run-time errors)
Aplikacija nema sintaksnih greaka, uspeno je
kompajlirana i pokrenuta. Meutim, u toku rada aplikacije
dogodila se greka (na primer deljenje sa nulom) i ako
nita nismo preduzeli, aplikacija e prestati sa radom. Ovo
su najee greke i predstavljaju fokus ovog lanka.

3. Logike greke
Aplikacija je uspeno kompajlirana, prilikom rada ne Ako odgovorite potvrdno na ovo pitanje, bie pokre-
prijavljuje nikakve greke niti prestaje sa radom. Sve je u nuta predhodno uspeno kompajlirana verzija aplikacije
redu, ali va program samo ne radi ono to treba da (ako postoji). Meutim ovo obino nema smisla, tako da
radi. Vraa pogrene rezultate, ne upisuje podatke i tome treba kliknuti na No, ime je obustavljeno pokretanje
slino. Ovo su verovatno greke koje je najtee otkriti jer aplikacije. Ako sada pogledate kod, primetiete da je prob-
su posledice loeg dizajna aplikacije. lematina linija podvuena talasastom plavom linijom, kao
to je prikazano na sledeoj slici:
1. Sintaksne greke
Radno okruenje Visual Studio C# Express prua
puno pomoi za otkrivanje i uklanjanje sintaksnih greaka.
Ve prilikom pisanja koda, sve problematine konstrukcije
e biti jasno oznaene, sa ponudom za pomo ili automat-
sko ispravljanje gde god je to mogue.

39
Takoe pogledajte prozor Error list (lista greaka) U fazi testiranja aplikacije se upravo i otkrivaju takva
koji se inicijalno nalazi na dnu razvojnog okruenja. mesta koja moda u poetku nisu oigledna.
.NET Framework ima snanu podrku i mogunosti
za upravljanje grekama u vreme izvravanja programa.
U C# programskom jeziku je usvojena klasina struktura za
obradu greaka koja postoji u C / C++ programskim jezici-
ma. Sintaksa je sledea:

try
{
U ovom prozoru se nalazi lista svih sintaksnih gre- // linije koda gde moe da nastane greka
aka kao i lista greaka koje se dogode u vreme izvrava- }
nja. Za svaku greku imamo opis, u kojoj datoteci se nala- catch (Exception e1)
zi, broj linije i kolone, kao i naziv projekta. {
Ako uradite dupli klik na greku u ovom prozoru, // obrada greke
automatski se otvara datoteka gde se ona nalazi, a kurzor }
se pozicionira na problematinu liniju. Ostaje da ispravite finally
greku i ponovo pokrenete program. {
// deo koji se uvek izvrava
}
2. Greke u vreme izvravanja (run-time errors)
Postoje tri bloka od kojih je poslednji (finally) opci-
on.
Greke koje ne moemo izbei i koje su rezultat
unosa korisnika, infrastrukture, mree i drugih raunarskih U bloku try treba da se nalazi jedna ili vie linija
resursa. Poetnici u programiranju obino ne shvataju ta koda gde se mogu pojaviti greke u vreme izvravanja apli-
sve moe krenuti naopako, iako je program besprekorno kacije.
napisan.
Na primer, napisan je program koji ita podatke iz U bloku catch se nalazi kod koji obrauje greke
baze podataka i prikazuje ih na formularu. Baza podataka (eng. error handler). Ako se na bilo kojoj liniji koda u try
je na drugom raunaru u mrei. Ovde u praksi moe nas- bloku dogodi greka, tok programa se automatski preus-
tati mnogo problema gde direktni razlog nije sama aplika- merava na prvu naredbu u catch bloku.
cija. Ako iz nekog razloga mrea nije dostupna zbog hard- Ovde moete probati da ispravite greku, ili samo
verskih problema (a njih zaista moe biti puno), aplikacije informiete korisnika i prikaete mu poruku greke.
e krahirati. Moda je mrea u redu, ali database server Moe postojati vie catch blokova koji hvataju raz-
nije pokrenut. Moda je u redu i mrea i database server, liite grupe greaka. Na primer, ako otvarate konekciju ka
ali je baza podataka oteena, ili ima previe korisnika, ili bazi podataka, prvo bi mogli da uhvatimo probleme u mre-
je ba u tom momentu baza off-line jer administrator radi i, zatim probleme sa bazom podataka i na kraju sve ostale
svoj posao... probleme. U ovom sluaju bi imali tri catch bloka. Zavisno
Dobili ste sliku. od tipa greke, kod se automatski preusmerava na odgova-
Strogo govorei, svaka linija koda u programu moe rajui catch blok.
da generie greku. U praksi, neemo za svaku liniju pos-
tavljati obradu greaka, ve samo tamo gde postoji realna Blok finally (ako postoji) se izvrava uvek, bez obzira
verovatnoa da greka nastane. da li je do greke zaista dolo ili ne. Ovde upisujemo linije
koda koje uvek treba da se izvre.

40
ta se dogaa kada se pojavi greka u vreme izvr- Cilj je da korisnik vaeg programa nikada ne dobije
avanja koju nismo obradili try-catch blokom? ovakvu poruku o greci. Iako se u dijalogu nudi opcija da
se nastavi sa izvravanjem programa (dugme Continue) u
Na formular dodajte jo jedno dugme i uradite praksi nastavak rada programa posle greke obino dovodi
dupli klik na njega. Ovde emo napisati sintaksno ispravni do daljnjih greaka i nema smisla.
kod koji e uvek generisati greku u toku izvravanja:
Sada emo izmeniti kod i dodati obradu greke:
private void button2_Click (object sender, EventArgs e)
{ private void button2_Click(object sender, EventArgs e)
int a = 10, b = 0, c; {
c = a / b; int a = 10, b = 0, c;
} try
{
Deklariemo tri varijable i nakon toga namerno pra- c = a / b;
vimo greku deljenja sa nulom (b = 0). Pokrenite program }
i kliknite na dugme. Kada se greka dogodi u programu catch
koji je pokrenut iz okruenja, on se zaustavlja i prikazuje {
se problematina linija se opisom greke i predlozima MessageBox.Show("GRESKA: deljenje sa
kako se greka moe ispraviti: nulom");
}
}

Pokrenite aplikaciju i kliknite na drugo dugme. Sada


dobijamo poruku, ali program nastavlja sa radom:

Kada pokreete kompajliranu aplikaciju (.exe


ekstenzija) van razvojnog okruenja, ponaanje je naravno
drugaije. Pritisnite F6 funkcijski taster ime se kompajlira Ista poruka se dobija kada se pokrene izvrna verzija
program. Potom naite izvrnu verziju programa koja se aplikacije van radnog okruenja.
nalazi u direktorijumu \bin\Debug ispod direktorijuma gde
ste snimili projekat. U sledeem nastavku emo detaljno obraditi
Poruka o greci je prikazana na sledeoj slici: Exception objekat i alate koji slue za ispravljanje greaka
u programu.

41
Mala kola programiranja C# (12)
Rad sa bazama podataka

Od ovog broja zapoinjemo novo poglavlje u okviru C#


serijala. Rad sa bazama podataka. U poetku e biti obja-
njene tehnologije i nain pristupa i manipulacije podacima
iz baze podataka. Nakon toga emo prouiti osnove SQL
programskog jezika i nauiti da ga koristimo iz C# aplika-
cija. Koristiemo gotovu bazu podataka u Microsoft Access
formatu koja je upravo namenjena za uenje i vebanja
koja emo mi raditi. Kao pripremu za naredne lanke ovog
serijala, neophodno je da sa Interneta preuzmete ovu
bazu podataka sa lokacije U ovom primeru svaki kupac ima atribute (nazive moete
http://www.microsoft.com/downloads/details.aspx? videti u zaglavlju tabele) CustomerID, CompanyName,
FamilyID=C6661372-8DBE-422B-8676- ContactName i tako dalje. Prilikom kreiranja strukture
C632D66C529C&displaylang=EN tabele se zavisno od zahteva definiu ovi atributi slino
kao kada bi pripremali nekakav papirni upitnik.
Preuzimate datoteku Nwind.exe koja je samoraspakujua Jedan red (eng. row) predstavlja kompletnu informaciju o
arhiva i sadri bazu podataka Nwind.mdb (mdb je sta- jednom kupcu.
ndardna ekstenzija za Access bazu podataka). Veliina
datoteke koju preuzimate je 476Kb. Jedna baza podataka moe imati vie razliitih tabela,
neretko i par stotina ili ak vie hiljada u velikim sistemima.
Posle preuzimanja je pokrenite, odgovorite potvrdno na Veina tabela u bazi je u meusobnim vezama (relacijama),
sva pitanja i u dijalogu gde treba da unesete lokaciju na ali dalja rasprava prevazilazi temu ovog serijala.
disku gde e se raspakovati baza ukucajte c:\baza kao to
je prikazano na sledeoj slici: Za sada treba da nauimo kako da napravimo C# aplikaciju
pomou koje moe pregledati i modifikovati podatke u
jednoj tabeli.

ADO.NET

ADO (ActiveX Data Object) je .NET tehnologija koja nam


omoguava rad sa bazama podataka razliitih formata.
Predstavlja deo .NET Framework okruenja i tehniki je
Jako je bitno da se baza nalazi na ovoj lokaciji jer emo je realizovana pomou velikog broja gotovih klasa koje enka-
tako referencirati u svim narednim primerima. psuliraju sve potrebne funkcionalnosti. Neka vas ne brine
predhodna reenica, jer sa tano etiri klase moemo oba-
Vrlo ukratko o bazi podataka viti gotovo sve to je potrebno.
Glavni nosilac informacija u svakoj bazi podataka je tabe-
la. Ona predstavlja dvodimenzionalnu matricu u kojoj su u Za poetak, (zlo)upotrebiemo mogunost Visual Studia da
redovima poreane celovite informacije. Na primer tabela bez i jedne linije koda postavimo vezu ka naoj bazi i prika-
u kojoj bi uvali informacije o kupcima (eng. Customers) bi emo podatke iz bilo koje tabele u njoj.
izgledala ovako:

42
Primer u est lakih koraka U Change Data Source dijalogu izaberite Microsoft Access
Database File, kao to je prikazano na slici i kliknite na
Uz pretpostavku da ste preuzeli bazu sa Interneta i dugme OK.
da se nalazi na C:\BAZA\NWIND.MDB, proiemo kroz
sledee korake kako bi postigli cilj.

Pokrenite Visual C# Express edition i izaberite nov projekt


tipa Windows Application.

1. Pre svega, potrebno je dodati izvor podataka (eng.


Data Source) u projekat. Data Source predstavlja zapravo
vezu ka bazi podataka koju elimo da koristimo. Podrane
su razliiti formati baza, zavisno od instaliranih drajvera u
vaem sistemu, ali uvek raunajte da postoji podrka za
Microsoft Access i SQL Server.
3. Sada smo se vratili na predhodni dijalog gde treba klik-
Kliknite na meni Data i potom izaberite stavku Add New nuti na dugme Browse kako bi konano izabrali nau bazu
Data Source. Ovim smo pokrenuli Data Source Configu- podataka. Na kraju dijalog izgleda kao na sledeoj slici.
ration arobnjak. Na prvom ekranu "Choose a Data Kliknite na dugme OK,ime smo zavrili definiciju veze ka
Source Type" izaberite DataBase i kliknite na dugme
Next.

2. U ovom dijalogu treba da dodate vezu (eng. Connecti-


on) ka bazi podataka, kao i da izaberete tip baze. Kliknite
na dugme New Connection. Otvara se Add Connection
(dodaj vezu) dijalog. Obratite panju da je inicijalno posta-
vljen Microsoft Sql Server. Da bi ovo izmenili kliknite na
dugme Change kao to je prikazano na slici.

bazi Nwind.mdb i potom na dugme Next za sledei korak.


Na potom postavljeno pitanje odgovorite sa No kako ne bi
kopirali bazu na lokaciju gde je snimljen projekat.

4. Sledei korak "Save connection string..." nam u ovom


momentu nije znaajan, pa ostavite kako je ponueno i
kliknite na Next.

43
5. U ovom koraku "Choose your database objects" treba
da izaberemo jednu ili vie tabela sa kojom hoemo da
radimo. U listi se, izmeu ostalog, nalaze sve tabele u bazi
podataka. Kliknite na znak + pored Tables i izaberite tabe-
lu Customers kao to je prikazano na slici.

Pokrenite aplikaciju. arobnjak koga smo upravo proli je


za nas, u pozadini, napisao sav potrebni kod. Ako ste pa-
ljivo pratili korake trebalo bi da dobijete tabelu sa podaci-
ma iz baze:

Na kraju kliknite na dugme Finish ime smo zavrili konfi-


guraciju izvora podataka.

6. Sada nam ostaje da na formi prikaemo podatke iz izvo-


ra podataka koga smo definisali. Za ovo postoji vie nai-
na jer gotovo svaka kontrola nudi mogunost ovakvog
prikaza. Kada su u pitanju tabele, najee se koristi kon-
trola DataGridView koji moete nai u paleti sa alatkama
u sekciji Data. Postavite je na formu i odmah u Properties
prozoru pronaite njeno svojstvo DataSource. Ovo svojs-
tvo slui da se kontrola povee sa izvorom podataka i na
taj nain u vreme izvravanja prikae stvarne podatke iz
baze.

Otvorite padajuu listu pored svojstva DataSource i izabe- Probajte da skrolujete po visini i irini kako bi videli sve
rite kao to je prikazano na sledeoj slici: podatke.
Kliknite na zaglavlje tabele. ta se deava? Oigledno puno
Primetiete da je radno okruenje automatski dodalo jo ugraenih gotovih funkcionalnosti koje ne treba runo pro-
neke objekte (vide se ispod forme), a takoe je gramirati.
DataGridView kontrola dobila zaglavlje sa imenima atri-
buta tabele Customers koju smo izabrali. U sledeem nastavku emo prouiti objekte koji se u ovom
primeru koriste.
I to je sve (za sada).

44
Mala kola programiranja C# (13) uradimo bez ispravno formiranog primarnog kljua.
Rad sa bazama podataka
Tehniki gledano tabela ne mora da ima primarni klju, ali
Da bi mogli da napiemo bilo kakav program ili web sajt to zaista nikako nije dobra praksa.
koji pristupa bazi podataka neophodno je da upoznamo
jezik kojim se manipulie podacima baze podataka. U pita- Ponekad ne postoji ni jedna kolona u tabeli koja je jedins-
nju je jezik pod nazivom SQL (eng. Structured Query Lan- tvena i moe da bude kandidat za primarni klju. U tom
guage) odnosno struktuiranu jezik za zadavanje upita. sluaju se vetaki dodaje jo jedna kolona, najee
Ponegde se SQL akronim interpetira kao i "Standard Query numerika, gde baza podataka sama upisuje brojeve u ras-
Language" odnosno standardni jezik za zadavanje upita. tuem nizu. Ovakva kolona, zavisno od baze podataka, se
Kako bilo, SQL jezik je standardni jezik koji je predstavljen zove Autonumber, Identity i slino.
ranih 1970-tih i od tada je doiveo nekoliko standardizaci-
ja od kojih je poslednja bila 1999, a nakon nje jo nekoliko Tipovi podataka u tabeli
revizija. Zavisno od potreba, u svakoj koloni tabele se upisuju razli-
iti tipovi podataka. Da se ne bi previe udaljavali od teme
Dobra stvar kod standardizacije SQL jezika je to jednom pomenuemo samo osnovne grupe:
nauen moe biti primenjen na bazama podataka razliitih Tekstualni podaci slue za slobodni unos alfanu-
proizvoaa. Da ne bi sve bilo idealno, u praksi moete merikog teksta
raunati da predhodna tvrdnja nije potpuno tana, jer sva- Celobrojni numeriki podaci unos celobrojnih
ki proizvoa uvodi nove mogunosti koje manje ili vie pozitivnih i negativnih vrednosti
odstupaju od standarda. Numeriki podaci sa pokretnim zarezom
Datumski podaci
Primarni klju tabele Specijalni tipovi tekstualna polja velikog kapacite-
U prolom nastavku je pomenuta tabela kao osnovni nosi- ta, slike, zvuk, geografski podaci i slino
lac informacija. Osim ovoga svaka tabela poseduje jedan Tip podatka u nekim sluajevima odreuje i sintaksu SQL
vaan objekat primarni klju tabele (eng. Primary Key upita kao to emo videti u narednom tekstu.
ili skraeno PK). Primarni klju predstavlja jedna ili vie
kolona sa ciljem da se svaki red u tabeli jedinstveno iden- Tipovi SQL upita
tifikuje. Na primer, ako bi eleli da kreirate tabelu sa poda- SQL upiti se po svojoj funkciji mogu podeliti na sledee
cima studenata jednog fakulteta, najbolji kandidat za pri- grupe:
marni klju je broj indeksa studenta. Ako bi za primarni DML (eng. Data Manipulation Language), jezik za
klju postavili ime i prezime, pogreili bi jer to nije jedins- manipulaciju podataka. Ovu grupu emo detaljnije
tvena vrednost. prouiti jer se odnosi na pregled, dodavanje, izmenu
i brisanje podataka.
Ponekad jedna vrednost nije dovoljna za jedinstvenu iden- DDL (eng. Data Definition Language) pomou koga
tifikaciju reda tabele. Ako bi eleli da napravimo tabelu sa se kreiraju, menjaju i briu objekti u bazi podataka.
podacima o studentima svih fakulteta u Srbiji, samo broj Pomou njih moemo kreirati tabele, odrediti nazive
indeksa ne bi bio dovoljan. Morali bi da dodamo grad i i tipove podatka, definisati primarni klju tabele i
naziv fakulteta. Ovako kreirani primarni klju koji se sastoji slino.
od dve ili vie vrednosti (u naem primeru tri), se zove DCL (eng. Data Control Language) jezik za kontro-
kompozitni primarni klju. lu podataka pomou koga se odreuje koji korisnik
ta sme da radi sa podacima. Na primer, moete
Zato je primarni klju vaan? odreenim korisnicima data pravo da samo pregle-
Ako elimo da pogledamo podatke, izmenimo ili izbriemo daju podatke, a nekim i da ih menjaju.
tano odreeni podatak to ne bi mogli precizno da

45
Na cilj je upoznavanje sa jezikom za manipulaciju poda- Ako bi eleli da prikaemo pomenute kolone iz tabele Cus-
taka. tomers, SELECT upit bi trebao da izgleda ovako:

Napomena: SELECT CustomerID, CompanyName, City


Sledei primeri su saglasni sa osnovnim SQL sta- FROM Customers
ndardom. To znai da e sintaksno gledajui, moi da se
primene na svakoj bazi podataka. Konkretne tabele i (Nisu bitna velika i mala slova nepisano pravilo je da se
podaci koji se ovde koriste se odnose na Microsoft Access SQL naredbe piu velikim slovima)
Northwind bazu podataka. U predhodnom nastavku je dat
Internet link sa koga moete preuzeti ovu bazu, ali za sva- Kada se pokrene ovakav upit, dobija se rezultat kao na slici:
ki sluaj jo jednom: http://www.microsoft.com/
downloads/details.aspx?FamilyID=C6661372-8DBE-422B-
8676-C632D66C529C&displaylang=EN

Prikaz podataka
Prikaz podataka iz baze se dobija pomou SELECT nared-
be. Osnova sintaksna struktura SELECT naredbe je veoma
jednostavna:

SELECT nazivi kolona


FROM naziv tabele

Nazivi kolona su razdvojeni zarezom, a posle FROM klau- Ako elite dobiti sve kolone iz tabele moete ih sve redom
zule se upisuje ime tabele. Navedena imena kolona mora- navesti ali postoji i skraeni oblik upiite zvezdicu umesto
ju postojati u tabeli, u suprotnom dobiemo poruku o gre- liste kolona:
ci.
SELECT *
U Northwind bazi postoji tabela pod nazivom Customers FROM Customers
u kojoj se nalazi lista svih kupaca sa kolonama Custome-
rID (ifra kupca), CompanyName (ime kompanije), City
(grad) i tako dalje.

Rezultat:

46
Ovo je i zgodan nain da se brzo sazna koje kolone ima
tabela.

U praksi je esto potrebno da se podaci prikau po odre-


enom redosledu. Redosled moe biti po jednoj ili vie
kolona. Ako bi rezultat upita eleli da sloimo po gradu i
to od A pa na dalje koristimo ORDER BY klauzulu:

SELECT CustomerID, CompanyName, City


FROM Customers
ORDER BY City ASC

Rezultat:

U sledeem nastavku emo raditi postavljanje kriterijuma i


vratiti se nazad na C# i implementaciju SELECT upita.

ASC je skraeno od Ascending (rastui niz). Moe se koris-


titi i DESC Descending, odnosno opadajui niz gde se
sortiranje obavlja od veeg ka manjem. Kod veine baza
podataka ASC je podrazumevana vrednost i ne mora se
eksplicitno navoditi.

Napisaemo upit koji e sortirati po dve kolone: City i


CompanyName i to City po rastuem, a CompanyName po
opadajuem redosledu.

SELECT City, CompanyName


FROM Customers
ORDER BY City ASC, CompanyName DESC

47
Mala kola programiranja C# (14)
Rad sa bazama podataka

U ovom nastavku nastavljamo sa prikazom mogunosti


SQL SELECT upita i nekim njegovim naprednijim opcijama.

U praktinom radu gotovo nikad nam ne treba prikaz svih


podataka iz jedne tabele. U tom smislu, postoje dva termi-
na: vertikalni i horizontalni filter.

Vertikalni filter znai da ne prikazujemo sve kolone iz Ako na primer, elimo da prikaemo kupce iz Londona i
tabele, ve samo one koje nam zaista trebaju. Na primer, Berlina onda se radi o sloenom uslovu sa dva kriterijuma.
elite videti samo ifru i naziv kompanije i nikakve druge itajte ovako: prikai kupce koji su iz Londona ili Berlina
podatke. Ovo se implementira jednostavno tako to u znai radi se o OR (eng. ili) operatoru.
SELECT listi navedete samo potrebna polja.
SELECT CustomerID, CompanyName, City
Horizontalni filter znai da ne elite da vidite sve slogove FROM Customers
(redove) iz tabele. Na primer, elite da vidite samo kupce WHERE City = 'London' OR City = 'Berlin'
za zadati grad. Ovo se postie pomou WHERE naredbe u
kojoj se definie jedan ili vie kriterijuma koji moraju biti Rezultat upita:
ispunjeni da bi se slog prikazao. WHERE naredba (jo se
zove klauzula) je veoma slina if naredbi u programskim
jezicima. Mogue je zadati vie kriterijuma koji se meu-
sobno povezuju OR i AND operatorima.

Ako elimo da vidimo sve kupce iz grada London, upit bi


izgledao ovako:

SELECT CustomerID, CompanyName, City


FROM Customers
WHERE City = 'London'
Pitanje za itaoca: ako bi u predhodnom primeru operator
Sintaksa je jednostavna: posle WHERE klauzule se OR zamenili sa operatorom AND, kakav bi rezultat dobili?
navodi ime polja (City), zatim operator (=) i na kraju vred- Odgovor: ne bi dobili ni jedan slog jer (logino) ni
nost ('London'). Obratite panju da se vrednost London jedan kupac ne moe istovremeno da bude i iz Londona i
nalazi izmeu jednostrukih znakova za navoenje. Poto iz Berlina :)
je polje City tekstualnog tipa, sintaksno, kriterijum mora
ovako da se pie. Ovo usvojite kao pravilo koje se potuje esto se u kombinuju WHERE i ORDER BY klauzula
u svim bazama podataka. koja slui za sortiranje i koju smo opisali u predhodnom
nastavku. U tom sluaju neophodno je ispotovati redosled
Rezultat predhodnog upita: klauzula u SELECT upitu:
SELECT ...
FROM ...
WHERE ...
ORDER BY ...

48
Na primer: vidimo sve kupce iz gradova London, Berlin, Madrid i Pariz
SELECT ContactName, CustomerID, CompanyName, City kriterijum bi se skraeno napisao na sledei nain:
FROM Customers
WHERE City = 'London' OR City = 'Berlin' SELECT ContactName, CustomerID, CompanyName, City
ORDER BY ContactName FROM Customers
WHERE City IN ('London', 'Berlin', 'Madrid', 'Paris')
Rezultat upita:
Rezultat upita:

Moete kreirati proizvoljno sloene kriterijume korie-


njem vie OR i/ili AND operatora, ali vodite rauna o prio-
ritetu: AND ima vii prioritet od OR. Kako se tano tumai
sledei kriterijum:
Kada su polja u kriterijumu numerikog tipa, uslov se pie
... isto kao i do sada ali ovog puta vrednost kriterijuma ne
WHERE City = 'London' AND CustomerID = 'ALFKI' OR sme da se stavlja u jednostruke znakove navoda. Na pri-
Country = 'Italy' mer elimo videti sve proizvode ija je cena (polje UnitPri-
ce) vea od 50 i da rezultat sortiramo po istom polju.
Poto AND ima prioritet, uslov itamo na sledei nain:
... SELECT ProductID, ProductName, UnitPrice
WHERE (City = 'London' AND CustomerID = 'ALFKI') OR FROM Products
Country = 'Italy' WHERE UnitPrice > 50
ORDER BY UnitPrice
Postavljanjem uslova u zagrade moete forsirati potrebni
prioritet po pravilima bulove algebre. Rezultat upita:
Slino IN operatoru postoji jo jedan skraeni nain pisanja
Ako elite da prikaete sve podatke osim nekog po zada-
tom kriterijumu, moete koristiti operator negacije NOT.
Na primer elimo videti sve kupce osim onih iz Londona:

SELECT CustomerID, CompanyName, City


FROM Customers
WHERE NOT City = 'London'

Postoji jo jedna zgodna skraenica u pisanju. Ako za isto


polje postoji vie kriterijuma vezanih sa operatorom OR, kriterijuma. Ako elimo da vidimo sve proizvode ije su
moe se koristiti IN operator. Na primer, ako elimo da cene izmeu 50 i 100 (ukljuujui i ove vrednosti) regular-
no bi napisali:

49
SELECT ProductID, ProductName, UnitPrice :
FROM Products
WHERE UnitPrice >= 50 AND UnitPrice <= 100

Operator >= oznaava "vee ili jednako".


Operator <= znai "manje ili jednako".

Kriterijum moemo skratiti i to je moda vanije, uiniti


itljivijim pomou BETWEEN operatora:

SELECT ProductID, ProductName, UnitPrice


FROM Products
WHERE UnitPrice BETWEEN 50 AND 100

Rezultat upita:

Vodite rauna da korienje BETWEEN operatora uvek


ukljuuje i gornju i donju granicu.

Korienje horizontalnog i vertikalnog filtera je veoma bit-


no jer znaajno smanjuje optereenje servera baze poda-
taka i mrene infrastrukture. Imajte u vidu da u praksi
nikad nije potrebno gledati sve podatke. Paljivo napisani
upiti, gde se prikazuje samo ono to je stvarno potrebno (i
po horizontali i po vertikali), mogu znaajno da poboljaju
ukupne performanse sistema.

50
Mala kola programiranja C# (15) malo komplikuju jer, istorijski gledano, postoji vie tehno-
Rad sa bazama podataka logija od kojih je svaka donela svoj set drajvera. Da ne ula-
zimo previe u priu, OleDb je tehnologija koja se koristi za
U predhodnom nastavku smo se upoznali sa osnovama pristup bazama kao to su Access, FoxPro, stari DBF i slini.
SELECT naredbe SQL upita. Ovo nam daje dovoljnu osno- Takoe je mogue sa Web sajtova proizvoaa baza poda-
vu da dalje nauimo kako napraviti aplikaciju koja bazi taka preuzeti razliite tipove drajvera za njihov format. Na
podataka zadaje SELECT upit i prikazuje rezultat njegovog primer Oracle i MySql omoguavaju besplatno preuzimanje
izvravanja. Za primer emo koristiti ve pomenutu Nwind drajvera bilo u OleDb ili .NET tehnologiji. Odlina stvar kod
bazu podataka u Microsoft Access formatu. Preduslov je ovakvog koncepta je to se sistem rada sa bazama meu-
da na disku C: imate direktorijum baza i u njemu datoteku sobno minimalno razlikuje. Uvek su u pitanju iste klase sa
Nwind.mdb. Ovo je vano, jer se prilikom obraanja bazi istim ili slinim funkcionalnostima. U praksi ovo znai da
referenciramo na njenu putanju u naem sluaju nije komplikovano napisati aplikaciju koja e podjednako
C:\baza\nwind.mdb. Pripremite se za malo teorije koja dobro raditi sa razliitim formatima baze podataka rezul-
nam je neophodna kako bi u sledeem nastavku napravili tat je proirena vrednost aplikacije jer, na primer, korisnik
odgovarajui primer. moe izabrati koju bazu eli da koristi, a programer moe
da napie aplikaciju koja radi sa postojeom bazom i poda-
Imenovani prostori i upravljaki programi cima.
Prilikom rada sa bazama podataka, C# i generalno .NET Poto koristimo Access bazu podataka, treba koristiti
radno okruenje nude veliki broj klasa koje su rasporee- OleDb drajvere, odnosno klase u System.Data.OleDb ime-
ne u dva imenovana prostora (Eng: name spaces): novanom prostoru.
System.Data.SqlClient
System.Data.OleDb Klase za rad sa bazama podataka
Oba se nalaze hijerarhijski ispod System.Data prostora Govorili smo o dva imenovana prostora koji imaju isti set
imena. ablon "Windows Application" inicijalno ve ima klasa. Razlikuju se u prefiksu naziva. Na primer imamo
referencu na System.Data, tako da nema potrebe praviti SqlConnection (System.Data.SqlClient) i OleDbConnection
dodatne reference u projektu. Meutim, kao i do sada, (System.Data.OleDb imenovani prostor). Ovo imajte u vidu
zgodno je iskoristiti using direktivu kako bi jednostavno jer u narednom tekstu radimo sa OleDb* objektima zbog
skratili pisanje prilikom kodiranja. Access baze podataka.
U imenovanom prostoru System.Data.SqlClient se nalazi
set klasa koja slui za rad sa bazom podataka Microsoft Konekcija
SQL Server. Imenovani prostor System.Data.OleDb sadri U svakom sluaju, bez obzira ta radili sa bazom podataka,
klase kojima se radi sa ostalim formatima baza podataka. neophodno je prvo napraviti vezu konekciju (Eng: Con-
Termin koji treba razumeti je "drajver za bazu podataka". nection) ka njoj. Ovu funkcionalnost nam daje klasa OleDb-
Moemo napraviti poreenje sa drajverom (pogonskim Connection. Osnovno svojstvo ove klase koje i odreuje
programom) za grafiku karticu raunara. Da bi kartica parametre konekcije je svojstvo ConnectionString. Kao to
radila u bilo kom operativnom sistemu, neophodno je se iz imena da pretpostaviti svojstvo je tipa string. Setite se
instalirati odgovarajui drajver. U pitanju je softver koji nastavka #12 ovog serijala kada smo pomou arobnjaka
predstavlja vezu izmeu operativnog sistema i fizikog indirektno postavljali ovo svojstvo. Potrebno je podesiti
hardvera u raunaru. string tako da se sastoji od parova: naziv
Slino je i sa bazama podataka. Drajver za bazu podataka parametra1=vrednost parametra1; naziv
omoguava sve funkcionalnosti za zadati format i na taj parametra2=vrednost parametra2;... i tako redom. Oigle-
nain (na sreu) skriva od programera kompleksnost prili- dno, separator je znak ;
kom rada sa razliitim formatima baza na tritu Ovo je
koncept koje se naziva enkapsulacija. Na dalje se stvari Parametri i njihovo znaenje je sledee:

51
Provider oznaava ime potrebnog drajvera baze poda- NAPOMENA
taka kako je registrovan u sistemu. Za Access bazu ime
drajvera je uvek Microsoft.Jet.OLEDB.4.0 1. Strogo obratite panju na parametre Data Source
Kada ovo sklopimo dobijamo: i User id. Morate ih pisati sa jednim razmakom izmeu
"Provider= Microsoft.Jet.OLEDB.4.0;" rei, u suprotnom dobijate poruku o greci.

Data Source kada je Access baza u pitanju, ovaj para- 2. Kada postavljate ovo svojstvo OleDbConnection
metar oznaava putanju i ime datoteke koja predstavlja objekta, treba voditi rauna o specifinosti rada sa stringo-
bazu. U naem sluaju baza se nalazi na putanji vima u jeziku C#. Znak \ (obrnuta kosa crta) u stringu ima
C:\baza\Nwind.mdb specijalno znaenje takozvani Escape ili kontrolni karak-
Sada ConnectionString izgleda ovako: ter posle koga se oekuje najee specijalni znak za for-
"Provider=Microsoft.Jet.OLEDB.4.0; Data Sour- matiranje. Zbog ovoga, ako na primer napiete:
ce=C:\baza\Nwind.mdb" Obj.ConnectionString =
U osnovnoj varijanti ovo je dovoljno. Meutim, ako je baza "Provider=Microsoft.Jet.OLEDB.4.0;Data
zatiena korisnikim imenom i ifrom, neophodno je i to Source=C:\baza\Nwind.mdb"
navesti. Na primer korisnik nae baze je Admin sa ifrom Odmah dobijate sintaksnu greku. Postoje dva reenja.
123 (u praksi izbegavajte ovako "jake" ifre). Da bi ovo Moete napisati ispred stringa znak @ koji govori kompa-
postigli koristimo jo dva parametra: User id i Password jleru da znak \ tretira kao i svaki drugi:
Finalna verzija stringa konekcije bi mogla da izgleda ova- Obj.ConnectionString =
ko: @"Provider=Microsoft.Jet.OLEDB.4.0;Data
"Provider=Microsoft.Jet.OLEDB.4.0;Data Sour- Source=C:\baza\Nwind.mdb"
ce=C:\baza\Nwind.mdb;User id=Admin;Password=123"
Ili moete posle svakog znaka \ jednostavno dopisati jo
Kada smo postavili ConnectionString svojstvo potrebno je jedan:
eksplicitno otvoriti konekciju ka bazi. Za ovo se koristi jed- Obj.ConnectionString =
nostavna metoda Open() bez argumenata. U sluaju da je "Provider=Microsoft.Jet.OLEDB.4.0;Data
baza iz nekog razloga nedostupna, oteena ili postoji Source=C:\\baza\\Nwind.mdb"
problem u mrei, metoda Open() e generisati greku u Oba naina su ispravna izaberite koji vam se vie svidja.
vreme izvravanja.
3. Ako elite da u mrei vie korisnika pristupa istoj
Kada zavrimo posao, potrebno je zatvoriti konekciju sa Access bazi podataka, bazu je potrebno postaviti u deljeni
bazom. Ovo tehniki nije neophodno, ali obavezno to ura- direktorijum na jednom raunaru. Sa ostalih raunara se
dite kako bi sauvali resurse (broj istovremenih konekcija) bazi pristupa tako to se za Data Source postavi puna
baza, mrea i na kraju korisnici vae aplikacije e vam mrena putanja do datoteke. Na primer ako na raunaru
biti zahvalni ako potujete ovo pravilo. ije je mreno ime Server, u direktorijum Podaci smesti
baza Nwind.mdb i potom podeli (Eng: share) ovaj direk-
torijum, puna putanja do baze je:
\\Server\Podaci\Nwind.mdb a ConnectionString je:

Obj.ConnectionString=@"Provider=Microsoft.Jet.OLEDB.4.
0;Data Source=\\Server\Podaci\Nwind.mdb "

Takoe morate svim korisnicima data pravo itanja i


pisanja (Eng: read/write) nad datotekom Nwind.mdb

52
Komanda Kada sve ovo uradimo kako treba, rezultat je DataSet
Objekat pomou kojeg zadajemo SQL upit bazi podataka popunjen podacima koga koristimo za prikaz na ekranu ili
je OleDbCommand. Komanda se uvek izvrava preko ve tampanje izvetaja.
definisane konekcije. Moe predstavljati razliite stvari
koje su izvan opsega ovog serijala. Mi emo se ograniiti itaocu koji se prvi put susree sa ovim objektima sve
na jednostavno slanje osnovnih SQL upita i prikaza rezul- verovatno izgleda (pre)komplikovano na prvi pogled.
tata izvravanja. Meutim kreatori ove tehnologije su imali u vidu mogu-
nosti rada sa praktino svim postojeim formatima baza
Svojstva komande i njihovo znaenje su sledee: podataka koji su trenutno na tritu ili vie nisu, ali su od
znaaja.
Svojstvo Connection definie po kojoj konekciji e koman-
da biti izvrena. Svojstvo je objektnog tipa i to OleDbCon- U sledeem nastavku emo ovu teoriju prevesti u praktini
nection. primer i tada e sve doi na svoje mesto. Posle malo prakse
bie oigledno koliko je ovaj koncept fleksibilan i prilagod-
Svojstvo CommandText je string tipa i pomou njega pos- ljiv u realnom radu.
tavljamo potrebni upit.

U sluaju da elimo da izvrimo SQL SELECT upit koji smo


obradili u predhodnom nastavku, neophodna su nam jo
dva objekta.

DataSet
DataSet predstavlja memorijski prostor u kome se uva
rezultat SELECT upita. Moemo ga tretirati kao matricu
koja se sastoji od redova i kolona. Tanije reeno, DataSet
moe biti i niz matrica jer kroz jednu komandu moemo
poslati vie SELECT upita. Tada svaki SELECT pravi svoju
matricu koja je u ovom kontekstu predstavljena objektom
Table.
Obratite panju da DataSet nema prefiks Sql niti OleDb.
DataSet se koristi kao univerzalni skladini prostor koji ak
ne mora biti ni na koji nain povezan sa bazama podataka.
Poseduje puno svojstava i metoda, ali o njima kasnije.

OleDbDataAdapter
Ovaj objekat predstavlja sponu izmeu komande i objekta
DataSet. OleDbDataAdapter je zaduen za pokretanje
komande, prosleivanje SELECT upita preko konekcije i na
kraju popunjavanje DataSet objekta podacima koji su
rezultat SELECT upita.
Svojstvo koje definie komandu koju treba izvriti je Selec-
tCommand. Ovo svojstvo je tipa OleDbCommand.

Metoda koja popunjava DataSet podacima se zove Fill, a


njen ulazni argument je objekat tipa DataSet.

53
Mala kola programiranja C# (16) Svaki put kada elite da zadate SELECT upit bazi podataka
Rad sa bazama podataka procedure je ista. Na sledeem dijagramu je prikazan redo-
sled kreiranja objekta, njihove veze i kljuna svojstva sva-
U prethodnom nastavku serijala smo se pozabavili teoret- kog od njih:
skim delom pristupa podacima pomou ADO.NET tehnolo-
gije. U ovom nastavku emo naueno iskoristiti u primeru i
tako teoriju preneti u praktini primer.

elimo da napravimo C# aplikaciju u kojoj korisnik moe


da unese SQL SELECT upit, potom klikne na dugme i na
kraju vidi rezultat redove i kolone ovog upita. Da bi ovo
uradili potrebno je kao i do sada da u direktorijumu
C:\baza imate kopiju Access baze podataka Nwind.mdb.
Ovu bazu smo koristili ranije i preporuujem itaocima da
proitaju prethodne nastavke u vezi ove baze i SQL
SELECT upita.

Korisniki interfejs aplikacije je jednostavan i njen krajnji


izgled je prikazan na sledeoj slici:

Potrebno je ispotovati redosled rada sa objektima i kao


rezultat poslednje Fill metode dobijamo popunjeni
DataSet objekat koga moemo prikazati korisniku pomou
DataGridView ili neke druge kontrole.

Pokrenite Microsoft C# Express Edition, kreirajte nov proje-


kat tipa Windows Application i na inicijalnu formu postavite
sledee kontrole:
TextBox postavite svojstvo MultiLine na True,
kako bi korisnik mogao da otkuca SQL SELECT upit u
vie redova. U skladu sa ovim postavite i svojstvo
ScrollBars na Vertical. Inicijalno ime kontrole emo
zadrati textBox1
Button postavite svojstvo Text na Start i takoe
Osim poznatih kontrola (TextBox i Button) upoznaemo ostavite inicijalno ime kontrole na button1
jo jednu DataGridView. U pitanju je veoma mona DataGridView postavite je tako da zauzima vei
kontrola koja je sposobna da prikae sadraj tabele u deo forme. Takoe elimo da kontrola prati izmene
DataSet objektu. Da se podsetimo, DataSet objekat uva dimenzija forme to se postie postavljanjem
jedan ili vie Table objekata u memoriji. Svaki Table obje- Anchor svojstva. Kontrolu treba privezati (eng.
kat je matrica sastavljena od redova i kolona i uva rezul- Anchor) na sve etiri strane, ime se automatski
tat jednog SELECT upita. U ovom primeru emo imati odrava isto rastojanje od ivica forme.
samo jedan Table objekat u DataSet-u koji e uvati rezul-
tat SELECT upita upisanog u TextBox kontrolu.
DataGridView kontrolu emo iskoristiti za prikaz sadraja
ove tabele.
54
Na kraju naa forma treba da izgleda ovako: Ovde paljivo upiite vrednost svojstva ConnectionString.
Velika i mala slova nisu bitna, ali razmak u parametru
Data Source jeste bitan.

Komanda:
OleDbCommand Komanda = new OleDbCommand();
Komanda.Connection = Konekcija;
Komanda.CommandText =textBox1.Text;

Tekst ukucan u kontrolu textBox1 koristimo za


CommandText svojstvo komande, tako da to mora biti
validan SQL SELECT upit.

DataSet:
DataSet Ds = new DataSet();

Ovde radimo samo instanciranje objekta Ds na osnovu


Klikom na dugme "Start" se izvrava sve, od postavljanja DataSet klase.
konekcije do vezivanja podataka na DataGridView kontro-
lu. DataAdapter:
Uradite dupli klik na dugme i pre nego to krenemo sa OleDbDataAdapter Da = new OleDbDataAdapter();
pisanjem koda, zgodno je (ne i neophodno) dodati jednu Da.SelectCommand = Komanda;
using direktivu kako bi sebi skratili pisanje. Na vrhu pro-
zora za pisanje koda ete uoiti nekoliko postojeih using Instanciranje Da objekta na osnovu OleDbDataAdapter
direktiva, a potrebno je dodati jo jednu: klase.

using System; Punjenje DataSet-a:


using System.Collections.Generic; Da.Fill(Ds);
using System.ComponentModel;
using System.Data; Koristimo Fill metodu OleDbDataAdapter klase za
using System.Drawing; "punjenje" DataSet-a.
using System.Text; Ove metoda zapravo pokree SelectCommand komandu,
using System.Windows.Forms; koja dalje otvara konekciju i bazi prosleuje upit. Rezultat
using System.Data.OleDb; ovog upita se prosleuje DataSet-u koji pravi jednu ili vie
tabela.
Vraamo se na button1_Click dogaaj i po redu kako je
prikazano na prethodnom dijagramu piemo kod: Prikaz sadraja prve tabele DataSet-a u DataGridView1
kontroli:
Konekcija: DataGridView1.DataSource = Ds.Tables[0];

OleDbConnection Konekcija = new OleDbConnection(); Svojstvo DataSource, kao to moete pretpostaviti iz nazi-
Konekcija.ConnectionString = va, pokazuje koji je izvor podataka koje treba prikazati u
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source = kontroli. U ovom primeru, izvor podataka je prvi (i jedina)
C:\baza\Nwind.mdb"; tabela u DataSet-u koji ima index 0 (Ds.Tables[0]).

55
Kompletan kod za click dogaaj dugmeta: Pokuajte sledei upit:

OleDbConnection Konekcija = new OleDbConnection(); SELECT ProductName, UnitPrice FROM Products ORDER
Konekcija.ConnectionString = BY ProductName
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Sour- (Prikai naziv i cenu proizvoda iz tabele Products i sortiraj
ce=C:\baza\Nwind.mdb"; po nazivu proizvoda).
OleDbCommand Komanda = new OleDbCommand();
Komanda.Connection = Konekcija;
Komanda.CommandText =textBox1.Text;
DataSet Ds = new DataSet();
OleDbDataAdapter Da = new OleDbDataAdapter();
Da.SelectCommand = Komanda;
Da.Fill(Ds);
DataGridView1.DataSource = Ds.Tables[0];

Vreme je da pokrenemo primer. U textBox1 ukucajte sle-


dei upit:

SELECT * FROM Customers


(Customers je tabela u nwind.mdb bazi)

I kliknite na dugme Start.

Ako ste sve tano ukucali, treba da dobijete sledee:


Za dalje vebanje:
Otvorite bazu podataka Nwind.mdb u Microsoft Access
aplikaciji i analizirajte njen sadraj. Ako ne posedujete
Access aplikaciju mala pomo: neke od tabela sa kojima
moete da vebate su: Customers, Orders, Products,
Categories, Suppliers i druge.

U sledeem nastavku emo se detaljnije pozabaviti tehno-


logijom za vezivanje podataka (eng. Data Binding).

Primetiete da se DataGridView kontrola automatski


podesila (redovi i kolone), zavisno od podataka koje treba
da prikae (DataSource svojstvo).

56
Mala kola programiranja C# (17) prikaemo u TextBox kontroli, to inimo preko njenog
Data Binding svojstva Text. Ako u podacima imamo kolonu koja moe
imati samo vrednosti tano/netano (Eng. true/false) logi-
U ovom nastavku emo obraditi vezivanje sa podacima no je koristiti CheckBox kontrolu i vezati podatke na njeno
(Eng. Data binding). svojstvo Checked.

U prolom nastavku smo zapravo radili data binding kada Sintaksa za povezivanje svojstva kontrole sa kolonom tabe-
smo postavljali DataSource svojstvo kontrole le iz DataSet objekta je raznolika, ali najee se koristi sle-
DataGridView. Slinu stvar moemo uraditi i sa gotovo dea:
svakom kontrolom korisnikog interfejsa. Vezivanje poda- (predpostavka je da na formi imamo TextBox kontrolu u
taka znai da se u nekoj kontroli automatski prikazuju kojoj elimo da prikaemo vrednost kolone
podaci iz baze, najee kao rezultat SELECT upita. Poto "CompanyName" iz ve napunjenog DataSet objekta)
SELECT upit moe da obuhvati podatke iz jedne ili vie
tabela, ovo predstavlja veoma elegantan nain za prikaz TextBox1. DataBindings.Add ("Text", Ds.Tables[0],
podataka korisniku, uz minimum programiranja. Kontrole "CompanyName");
se povezuju na potrebnu tabelu u okviru DataSet objekta.
U ovoj liniji koda za kontrolu TextBox1 dodajemo novo
Princip rada je identian kao to je demonstrirano u pred- vezivanje tako to za svojstvo Text iz prve tabele DataSet-a
hodnom primeru, uz dodatak par linija koda koje su odgo- pod nazivom Ds, vezujemo kolonu "CompanyName". Vodi-
vorne za povezivanje podataka. Postoje dve varijante koje te rauna da ne vezujete dva ili vie puta podatke za isto
moemo koristiti i iji izbor zavisi od mogunosti same svojstvo kontrole jer ete tada dobiti poruku o greci.
kontrole. Neke kontrole su u stanju da tabelarno prikau
podatke, kao to je DataGridView. U ovom sluaju potreb- Primer
no je podesiti samo DataSource svojstvo i to je sve. Ovaj
nain vezivanja se zove simple data binding. Da bi ovo ilustrovali napraviemo jednostavan primer za
simple i complex data bindigs. Kao i ranije koristimo Micro-
Neke druge kontrole kao to TextBox, Label i sline oi- soft Access bazu podataka. Pokrenite Microsoft C# 2005
gledno ne mogu prikazati redove i kolone podataka, ve Express Edition i kreirajte novi projekt tipa Windows
mogu da prikau samo vrednost odreene kolone (polja iz Application.
tabele), odreenog sloga (reda u tabeli). Ovo nas dovodi
do pojma Current record (aktivni slog-zapis) ije vrednosti Sve to treba emo uraditi u Form_Load dogaaju kako bi
kolone elimo da prikaemo u kontroli. se odmah po otvaranju forme prikazali i podaci.
Kao i u prolom nastavku koristimo objekte:
Kada "napunimo" DataSet podacima, inicijalno aktivni slog
je prvi (pod uslovom da uopte postoje slogovi). U toku OleDbConnection
rada korisnik moe da vri navigaciju po slogovima i na taj OleDbCommand
nain menja aktivni slog koji se prikazuje u ovako vezanim DataSet
kontrolama. OleDbDataAdapter

Svaka kontrola koja podrava vezivanje podataka poseduje Za prikaz podataka koristiemo NWind.mdb bazu i sledee
kolekciju DataBindings koja moe da sadri vie vezivanja kolone iz tabele Products:
podataka za istu kontrolu, a u praksi se koristi najee
samo jedna. Vano je napomenuti da moemo odrediti na ProductName (naziv proizvoda)
koje svojstvo kontrole elimo da veemo vrednost kolone UnitPrice (cena proizvoda)
aktivnog sloga. Na primer ako elimo da podatke Discontinued (da li je proizvod dostupan)

57
SELECT upit koji emo poslati bazi je:

SELECT ProductName, UnitPrice, Discontinued


FROM Products
ORDER BY ProductName

Uradite dupli klik na formu kako bi dobili Form1_Load


dogaaj. Setite se da dodate using direktivu kako bi skrati-
li pisanje koda:
using System.Data.OleDb;

U Form1_Load funkciji upiite sledee linije koda:

private void Form1_Load(object sender, EventArgs e)


{
OleDbConnection Konekcija = new OleDbConnection();
Konekcija.ConnectionString =
@"Provider=Microsoft.Jet.OLEDB.4.0; Sada elimo da podatke prikaemo u DataGridView1 kon-
Data Source=C:\baza\Nwind.mdb"; troli koja omoguava simple data binding.
OleDbCommand Komanda = new OleDbCommand();
Komanda.Connection = Konekcija; U nastavku koda je dovoljno dopisati samo jednu liniju
Komanda.CommandText = koda:
"SELECT ProductName, UnitPrice, Discontinued
FROM Products dataGridView1.DataSource = Ds.Tables[0];
ORDER BY ProductName";
DataSet Ds = new DataSet(); U dve TextBox kontrole elimo da prikaemo vrednosti
OleDbDataAdapter Da = new OleDbDataAdapter(); kolona "ProductName" i "UnitPrice". Ovo je complex data
Da.SelectCommand = Komanda; binding. U nastavku upiite sledee dve linije koda:
Da.Fill(Ds);
} textBox1.DataBindings.Add("Text", Ds.Tables[0],
"ProductName");
Ovde smo pripremili teren za simple i complex poveziva- textBox2.DataBindings.Add("Text", Ds.Tables[0],
nje podataka. "UnitPrice");

Sada na formu treba postaviti elemente korisnikog inter- Na kraju elimo da vrednost kolone " Discontinued" prika-
fejsa. Na formu postavite redom: emo u CheckBox kontroli. Vrednosti u ovoj koloni mogu
biti samo true ili false, zbog ega smo i izabrali CheckBox
Jednu DataGridView kontrolu za njen prikaz. Dopiite jo jednu liniju koda:
Dve Label kontrole
Dve TextBox kontrole checkBox1.DataBindings.Add("Checked", Ds.Tables[0],
Jednu CheckBox kontrolu "Discontinued");

Svojstva Text za Label i CheckBox kontrole postavite kao Obratite panju da ovde ne vezujemo svojstvo "Text" ve
to je prikazano na sledeoj slici: svojstvo "Checked".

58
Sada pokrenite primer. Ako ste sve ispravno upisali treba Za kraj ovog nastavka i serijala, pokuajte sledee:
da dobijete rezultat kao na sledeoj slici:
Sama forma takoe poseduje DataBindings kolekciju. Ako
elimo da u naslovu forme prikaemo naziv proizvoda,
dovoljno je setiti se da referencu na formu predstavlja klju-
na re this.

Dopiite jo jednu liniju koda:

this.DataBindings.Add("Text", Ds.Tables[0],
"ProductName");

Sada pokrenite primer i videete kako se i naslov forme


menja u zavisnosti od aktivnog zapisa.

Kada u tabeli menjamo slog, automatski se menjaju i


podaci ispod. Poto su sve kontrole vezane za isti izvor
podataka (Eng: DataSource), u naem sluaju na prvu
tabelu Ds objekta, logino je da je prikaz sinhronizovan.
Takoe ete primetiti da moete menjati podatke direktno
ili u tabeli ili u kontrolama ispod nje. Te izmene se takoe
automatski prikazuju. Meutim kada zaustavite, pa pono-
vo pokrenete primer primetiete da su podaci ostali neiz-
menjeni. Sve izmene koje se na ovaj nain rade su lokal-
nog tipa, odnose se samo na DataSet objekat koji je u
memoriji raunara. Baza podataka se ne aurira automat-
ski. Da bi ovo uradili neophodno je formirati Insert, Upda-
te i Delete komande to u ovom momentu prevazilazi
ambicije ovog poetnikog serijala.

59

You might also like