You are on page 1of 59

Mala kola programiranja C# (1)

Kada otvorite navedenu stranicu, kliknite na vezu


uputstva za runu instalaciju (manual installation instructions) koja vas vodi na lokaciju gde moete preuzeti
kompletnu instalaciju u IMG ili ISO formatu. Svi popularni
programi za kopiranje kompakt diskova podravaju oba
formata. Veliina instalacije je priblino 435 MB.

Uvod
Namena ovog serijala jeste da nastavnike informatike i programiranja uputi u tematiku programiranja u programskom 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
Edition. Odluili smo da koristimo express izdanja jer su
besplatna i mogu se preuzeti sa Microsoft Web lokacije.
Naravno, svi primeri e ispravno funkcionisati i u bilo kojoj
drugoj verziji programa Microsoft Visual Studio 2005.

Tehnologija
Microsoft je predstavio .NET tehnologiju 2000.
godine, uz prvu verziju programa Visual Studio 2000
i .NET Framework 1.0. Kasnije je usledila verzija programa
2003 Visual Studio i 1.1 .NET Framework. Trenutno su
aktuelne verzije 2005 Visual Studio, odnosno 2.0 .NET
Framework.

Express alatke
Microsoft je kreirao niz besplatnih, express izdanja
svojih razvojnih alatki i SQL Server baze podataka sa idejom da svima omogui uenje, testiranje i kreiranje aplikacija u .NET framework okruenju. Ovo ne znai da se u
express alatkama ne mogu napraviti ozbiljne aplikacije,
Web lokacije i baze podataka. Naprotiv, dostupna je veina mogunosti koje postoje i u kompletnoj verziji programa Visual Studio, tako da se mogu kreirati snane i bogate aplikacije i sistemi sa bazama podataka.

.NET Framework predstavlja obiman skup klasa koje


se koriste u programiranju razliitih tipova aplikacija. Sve
klase su grupisane u takozvane imenovane prostore
(named spaces) radi lakeg snalaenja i efikasnijeg rada.
Na primer, klase za rad sa SQL bazom podataka nalaze se
u imenovanom prostoru System.Data.SqlClient, klase za
rad sa datotekama nalaze se u prostoru System.IO i tako
dalje. Sve to vam ikada moe zatrebati gotovo sigurno se
moe pronai ovde. Ako ne postoji, moe se napisati od
poetka ili naslediti funkcionalnost postojeih klasa.

Matina stranica za sve Express alatke je:


http://msdn.microsoft.com/vstudio/express/. Web stranica
sa koje moete preuzeti C# Express je:
http://msdn.microsoft.com/vstudio/express/visualcsharp/
download/.

Nepravedno je govoriti o C#, a ne pomenuti Andersa Hejlsberga, koji je glavni arhitekta i projektant ovog
jezika i uesnik u razvoju .NET tehnologije. Roen u Danskoj 1961. godine, programer koji je poetkom osamdesetih godina 20. veka napisao uveni Turbo Pascal, a kasnije
projektovao Delphi. 1996. godine Anders se pridruio korporaciji Microsoft gde je i razvio programski jezik J++ i
biblioteku klasa Windows Foundation Classes.

Instalaciju moete izvriti sa Interneta ili preuzeti


sadraj kompletnog instalacionog CD-a. Druga opcija je
bolja, jer kada jednom preuzmete instalaciju moete je
kopirati na onoliko diskova koliko vam je potrebno za kolu, uenike i nastavnike.

.NET programski jezici mogu pristupiti svim ovim


klasama i u tom smislu su prilino ravnopravni, bez obzira
na to da li koristite Visual Basic .NET, C#, Fortran .NET ili
neki drugi programski jezik. Razlika izmeu jezika svodi se
na sintaksu, strukturu i lini izbor. Trenutno su svi najee
korieni programski jezici prilagoeni .NET tehnologiji.

.NET prevoenje
Prilikom prevoenja koda napisanog u bilo kojem
programskom jeziku postoje dve mogunosti: prevodioci i
tumai.
Prevodioci prevode izvorni kd direktno u mainski
kd procesora. U sluaju tumaa se prilikom pokretanja
programa prevodi linija po linija - kako se program izvrava. NET je tuma, ali ne vri prevoenje direktno u mainski jezik procesora, ve u takozvani MSIL (Microsoft Intermediate Language). Po pokretanju programa na scenu
stupa JIT (Just In Time) prevodilac, koji dalje prevodi MSIL
u mainski jezik procesora i izvrava ga. Ovakva slojevita
arhitektura omoguava portabilnost .NET aplikacija izmeu razliitih operativnih sistema u budunosti.

Programski jezik C# se izdvaja od drugih i smatra


se prirodnim za .NET okruenje. Ovaj programski jezik je
nastao kao potpuno nov i nije optereen kompatibilnou
sa ranijim verzijama. Radno okruenje Visual Studio je u
potpunosti napisano ba u C# jeziku. On je moderno strukturiran, potpuno objektno orijentisan, zasnovan na C++
jeziku i zvanino prihvaen kao standard od strane organizacija ECMA (European Computer Manufacturers Association) i ISO (International Organization for Standardization).

Poetak
Za poetak je potreban operativni sistem Windows
XP i instaliran C# Express 2005. Kada se pokrene radno
okruenje, na uvodnom ekranu postoje opcije za kreiranje
novog ili otvaranje postojeeg projekta (1). Takoe, tu se
nalazi i lista prethodno otvorenih projekata (2) koja je
sada prazna. Veoma su korisna i okna sa vezama za poetnike (3) i najnovijim vestima (4) koje se automatski auri-

izabrati stavku Aplikacija konzole (Console Application) i


kliknuti na dugme U redu (OK).
Sve linije primera koda u ovom lanku su prikazane
crvenom bojom, a kd koji je automatski generisalo radno
okruenje prikazan je sivom bojom.
Posle par momenata se otvara prozor za pisanje
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 prilikom pokretanja programa. U telu ove funkcije treba upisati kd koji je potrebno izvriti. Telo funkcije je definisano
poetnom { i zavrnom } velikom zagradom, to predstavlja nain na koji se obeleava poetak i kraj svih segmenata u C# jeziku.
Da biste probali jednostavan ispis na ekranu, u
okviru velikih zagrada upiite tekst tano kao to je prikazano:
class Program
{
static void Main(string[] args)
{
Console.WriteLine ("Moja prva C# aplikacija");
Console.ReadKey ();
}
}
Imajte na umu da C# razlikuje mala i velika slova!

ra ako postoji Internet veza.


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
slici.

Pokretanje aplikacije iz radnog okruenja vri se


pomou funkcijskog tastera F5 na tastaturi. Ako je kd
ispravno napisan, pojavljuje se prozor komandne linije sa
ispisanim tekstom:

Tri osnovna tipa projekta su:


Windows aplikacija (Windows application) predstavlja
standardnu Windows aplikaciju koja se moe samostalno
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 interfejsa. Komunikacija se odvija iskljuivo sa komandne linije.
Ostali tipovi predstavljaju samo razliite predloke i
demo aplikacije uz mogunost pronalaenja drugih predloaka projekata na Internetu.
Za poetak, kao najjednostavniji tip aplikacije, treba

Pritisnite bilo koji taster ime se zatvara prozor komandne


linije, odnosno zaustavlja aplikacija.
4

Analiza koda:

Za pojmove: klasa, objekat, objektno programiranje,


nasleivanje, metodi i slino uli ste ili proitali u literaturi
i oni (po mom iskustvu) izazivaju odbojnost ka objektnom
programiranju, bez obzira na to da li ste poetnik ili profesionalac. Ne treba se tako oseati jer objektno programiranje predstavlja nain razmiljanja koje je najblie svakodnevnom iskustvu i najuspenije modelira stvarnost.

Linija: Console.WriteLine("Moja prva C# aplikacija");


je odgovorna za ispis teksta. Console objekt predstavlja
prozor komandne linije, dok je WriteLine metod ovog
objekta kojim se ispisuje tekst. Kasnije emo videti ta su
klasa, objekat i metoda klase. Oigledno, parametar metode WriteLine je tekst koji elimo da se ispie.

U sledeem nastavku serijala o programiranju baviemo se ba ovim pojmovima jer oni predstavljaju okosnicu u C# programiranju.

Linija: Console.ReadKey();
postoji samo da bi se napravila pauza. Bez nje bi se otvorio 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 program i vidite ta se dogaa.

Mala kola programiranja C# (2)

Uenik takoe na odreeni nain reaguje na deavanja u kolskom okruenju. Reakcija na dobru ili lou
ocenu, izostanak u sluaju bolesti i slino predstavljaju
dogaaje (eng. events) klase.
Sada, posle detaljne analize svih osobina, radnji i
reakcija uenika mogue je kreirati klasu koja verno i detaljno moe da opie uenika sa svim potrebnim karakteristikama.

U ovom nastavku male kole jezika C# posvetiemo


se osnovama objektnog programiranja. Za razliku od tradicionalnog proceduralnog programiranja koje se sastoji
od niza funkcija i njihovih poziva, objektno programiranje
bolje i skladnije oslikava realni svet i omoguava loginije
projektovanje programskih zahteva. Da odmah u poetku
bude jasno: problem se moe reiti pomou tradicionalnog i objektnog programiranja.
Ono to nam donosi objektno programiranje je
skladniji programski model i jo neke lepe stvari kao to je
ponovna upotrebljivost i nasleivanje objekata.
Jedan objekat je uvek predstavljen jednom klasom.
Klasu treba posmatrati kao nacrt ili plan za izgradnju objekta. Na primer, plan za izgradnju kue predstavlja klasu, a
kua napravljena po tom planu predstavlja objekat zasnovan na klasi. Sama klasa za sebe nije objekat, ve predstavlja samo opis po kome e objekat biti napravljen. Kada
napravimo (kae se instanciramo) objekat na osnovu
klase, on se kreira u memoriji raunara i tek tada se moe
koristiti. Na osnovu jedne klase moe se napraviti neogranieni broj objekata, odnosno broj koji je tehniki ogranien memorijom raunara.

Fizika implementacija klase


Svojstva klase su predstavljena razliitim varijablama koje su javno vidljive van klase. Korisnik klase e po
kreiranju objekta na osnovu klase uspostaviti odgovarajue vrednosti varijabli i time definisati objekat.
Metode klase su predstavljene funkcijama u klasi.
Na primer, funkcija UradiDomaiZadatak koja bi kao
ulazne parametre verovatno trebalo da sadri opis domaeg zadatka, predmet, vreme kada je zadat i rok izvravanja. Metod klase moe imati i povratnu vrednost koja se
obino koristi kao status izvravanja metoda, odnosno
funkcije. Nepisano pravilo jeste da povratna vrednost nula
znai uspeno izvrenu radnju, a vrednost razliita od nule
oznaava problem definisan tim brojem.
Da bismo mogli da napravimo prvi primer za
demonstraciju jednostavne klase, neophodno je da se
upoznamo sa nainom deklaracije varijabli i funkcija u C#
jeziku.

Svojstva, metode i dogaaji


Uzmimo uenika kao primer. Ako bismo hteli da ga
predstavimo u objektnom svetu, ta bi klasa koja ga opisuje trebalo da sadri? Moemo poeti od fizikih karakteristika. Ime uenika, pol, godina roenja, boja oiju i kose,
razred i slino. Sve pomenuto predstavlja svojstva (eng.
properties) klase. Kada instanciramo objekat na osnovu
klase Uenik, postaviemo ova svojstva da odgovaraju
konkretnom ueniku.
Oigledno, na osnovu dobro kreirane klase uenik
moemo tano opisati sve uenike svoje kole. Meutim,
ovo nije dovoljno. Uenik obavlja veliki broj kolskih aktivnosti koje takoe treba opisati. To je ono to uenik radi u
koli i kod kue, na primer, radi pismeni i domai zadatak,
prisustvuje odreenom asu, dobija ocenu i slino. Ove
radnje koje uenik izvrava i koje se odnose na njega nazivaju se metodima (eng. methods) klase.

Deklaracija varijabli i funkcija


Sve varijable u programskom jeziku C# moraju se
deklarisati pre upotrebe. Deklaracija varijable podrazumeva da definiemo naziv, tip, vidljivost i opcionalno njenu
poetnu vrednost. Sintaksa je sledea:
vidljivost tip varijable naziv = poetna vrednost
Na primer:
public string ImeUcenika;
private int Razred = 1;

U prvom primeru je deklarisana varijabla pod nazivom ImeUcenika koja pripada tipu niska (eng. string),
to znai da moe da sadri bilo koji niz znakova i njena
vidljivost je javna (public).
Vidljivost definie odakle se varijabli moe pristupiti. Kljuna re public znai da je varijabla javna u celom
opsegu u kome je deklarisana na primer, u celoj klasi i
da je takoe vidljiva korisnicima te klase.
U drugom sluaju deklarisali smo varijablu pod
nazivom Razred koja pripada tipu int (pozitivni i negativni celi brojevi u odreenom opsegu) sa privatnom vidljivou dostupna je samo u okviru dela u kome je deklarisana, ali ne i korisnicima klase. Inicijalnu vrednost varijable
takoe smo postavili na 1.

public void PokreniProgram (string LokacijaPrograma)


{
// kd koji pokree program...
return;
}
U tom sluaju se navodi samo kljuna re return
bez parametra. U primeru je takoe prikazan nain za upisivanje komentara u programskom jeziku C#. Dve kose
crte // oznaavaju komentar sve do kraja reda.
Ovaj komentar se zanemaruje prilikom prevoenja,
a dobra praksa je pisati komentare uvek kada je to potrebno radi boljeg razumevanja koda.
Osim ove jednolinijske varijante komentara postoji i
vielinijski komentar koji poinje parom znakova /* i zavrava sa */. Sve linije izmeu smatraju se komentarom i ne
izvravaju se.

Osim javnih (eng. public) i privatnih (eng. private)


tipova vidljivosti postoji jo nekoliko varijanti o kojima e
biti govora kasnije. Za poetak je dovoljno znati da privatne varijable nisu vidljive van klase, a javne jesu.

Primer klase
Sada znamo dovoljno da bismo mogli da kreiramo
jednostavnu klasu kao primer. Sama deklaracija klase je
jednostavna:

Deklaracija funkcija je slina. Takoe se definie


vidljivost, ime funkcije, tip (koji u sluaju funkcije znai tip
vrednosti koju vraa funkcija) uz dodatak deklaracije ulaznih argumenata funkcije ako postoje.

Class NazivKlase
{
/*
telo klase sa svim
metodima i dogaajima
*/
}

Primer funkcije koja vraa zbir dva broja:


public double Zbir (double a, double b)
{
return a + b;
}

potrebnim

svojstvima,

Kao i u prethodnom nastavku primer emo zasnovati na konzolnoj aplikaciji. Pokrenite C# Express, kliknite
na vezu Kreiraj projekat (eng. Create project), izaberite
tip projekta Konzolna aplikacija (eng. Console Application)
i kliknite na dugme U redu (eng. OK).
Zadatak je napraviti klasu Matematika koja e
znati da sabere i oduzme dva broja. Klasa e sadrati dva
metoda (funkcije) Zbir i Razlika. Obe funkcije imaju
po dva ulazna parametra i brojeve koji se sabiraju, odnosno oduzimaju. Svi ulazni parametri i obe funkcije su tipa
double.

Funkcija Zbir je javna (dostupna korisnicima klase) i


kao rezultat vraa tip double (broj sa decimalnom takom). Postoje dva ulazna parametra a i b koji su takoe
tipa double. Telo funkcije je odreeno otvorenom i zatvorenom vitiastom zagradom. Naredba return oznaava
bezuslovni zavretak rada funkcije i povratnu vrednost
funkcije. U naem primeru funkcije postoji samo naredba
return koja vraa zbir dva broja.
U sloenijim klasama moe postojati puno funkcija
koje implementiraju razliite metode klase. Neke od njih
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


klasu Matematika. Deklaracija se upisuje posle deklaracije klase Program kao to je prikazano:

Tehniki gledano, pravljenje objekta se svodi na


kreiranje mini-programa u memoriji raunara koji sadri
kompletan kd iz klase. Instanca klase se jednostavno pravi.
NazivKlase NazivVarijable = new NazivKlase();
U naem primeru klasu pravimo u delu static void
Main kao to je prikazano:

class Program
{
static void Main(string[] args)
{
}
}
class Matematika
{

static void Main(string[] args)


{
Matematika M = new Matematika();
}

Naredba new Matematika() pravi instancu klase


Matematika - objekat u memoriji raunara. Varijabla M
je pokaziva na memorijsku lokaciju na kojoj se nalazi
objekat, a pomou nje se upuuje na sva svojstva i metode
u njemu.
Sintaksa upuivanja je jednostavna: NazivVarijable.NazivMetode (ulazni argumenti).

Sada, u okviru klase Matematika treba napisati funkcije


Zbir i Razlika:
class Matematika
{
public double Zbir(double A, double B)
{
return A + B;
}

Sada treba testirati obe metode i ispisati njihov


povratni rezultat. Za ovo emo, kao i u prolom nastavku
koristiti metod WriteLine ugraenog objekta Console.
Brojevi koje prosleujemo kao ulazne parametre izabrani
su potpuno proizvoljno.
Dopunite kd sledeim redovima:

public double Razlika(double A, double B)


{
return A - B;
}

static void Main(string[] args)


{
Matematika M = new Matematika();
Console.WriteLine ( M.Zbir (3, 4) );
Console.WriteLine ( M.Razlika (8, 2) );
Console.ReadKey();
}

}
Obe funkcije su javne kako bi bile vidljive korisnicima klase, imaju po dva ulazna parametra tipa double i
vraaju zbir, odnosno razliku. Terminoloki, klasa
Matematika implementira interfejs sa dva metoda iji su
potpisi:
public double Zbir (double, double) i
public double Razlika (double, double)

M.Zbir (3, 4) poziva funkciju Zbir u objektu na koji


pokazuje varijabla M i prosleuje joj vrednosti parametara.
Funkcija Zbir kao povratnu vrednost vraa zbir ova dva
broja (return 3 + 4). Ovu povratnu vrednost zatim koristimo za ispis u konzolni prozor.
Isti princip vai za pozive funkcije Razlika.
Red Console.ReadKey(); slui samo kao vetaka
pauza kako se konzolni prozor ne bi odmah zatvorio.

Klasa je za sada gotova, prelazimo na njeno


korienje. Kao to je reeno, klasa sama za sebe ne moe
da se koristi, ve je neophodno napraviti objekat na osnovu nje.

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 velikim 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 deljenje. Zatim u kodu ispitajte funkcionisanje ova dva nova
metoda.
U sledeem nastavku bie obraena svojstva, kao i
druge mogunosti klase.

Mala kola programiranja C# (3)

Zatim u okviru klase Ucenik, treba uraditi deklaraciju svojstava, odnosno javnih (public) varijabli, obe tipa string:

Klase - nastavak
Vreme je da nauimo vie o svojstvima klase. U
prolom nastavku smo se upoznali sa funkcijama i na koji
nain se pomou njih implementiraju metode klase. Svojstva klase, prenesena u realni svet bi mogla da se poistovete sa osobinom objekta ili osobe u prirodi. Na primer, svaki uenik ima niz osobina (svojstava) koje ga opisuju. Ime,
godina roenja, adresa stanovanja, telefon, boja kose i
oiju, u kom je razredu, koji smer i tome slino.
U programiranju, kao to smo rekli ranije, klasa
predstavlja ablon za objekat. Poto definiemo svojstva u
klasi i na osnovu nje napravimo (instanciramo) vie objekata, tipino e svaki od njih imati svoj skup svojstava, ba
kao to svaki uenik ima samo svoje osobine.

class Ucenik
{
public string Prezime;
public string Ime;
}

Programski jezik C# nudi dva osnovna naina za


implementaciju svojstava klase.

class Program
{
static void Main(string[] args)
{
Ucenik cu = new Ucenik();
cu.Prezime = "Peri";
cu.Ime = "Petar";

Za sada, veoma jednostavno i oigledno. Kako se


koriste ova svojstva na strani korisnika ove klase? U okviru
Main funkcije treba prvo deklarisati varijablu koja pokazuje na objekat zasnovan na klasi Ucenik, kao to smo radili
ranije. Ime varijable cu, je proizvoljno izabrano. Postaviemo svojstva Prezime i Ime na proizvoljne vrednosti i
potom ispisati sadraj:

Implementacija svojstava klase- javne varijable


Najjednostavniji nain, od koga emo i poeti se
zasniva na deklaraciji javne (public) varijable unutar klase.
Sve to je u klasi definisano kao public, je vidljivo korisnicima ove klase i mogu bez ogranienja postavljati i itati
vrednost ovih varijabli.
Kao i do sada, radiemo sa projektom tipa
"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.
Zadatak je da napravimo klasu Ucenik sa (za sada)
svojstvima Prezime i Ime.
Kao i u prolom nastavku deklaraciju klase treba
uraditi posle funkcije static void Main.
class Program
{
static void Main(string[] args)
{
}
}
class Ucenik
{
}

Console.WriteLine(cu.Prezime);
Console.WriteLine(cu.Ime);
Console.ReadKey();
}
}
Obratite panju na pomo koju vam prua Visual
Studio radno okruenje prilikom unosa koda. Kada ste
ukucali varijablu cu i potom taku, automatski se otvorio
mali prozor koji vam nudi izbor iz liste svih svojstava i
metoda koje poseduje klasa Ucenik:

10

Tehnologija koja prua ovakvu (i jo neke) vrste


pomoi se zove InteliSense i izuzetno je korisna jer skrauje vreme unosa koda i eliminie sintaksne greke. Primetiete da su svojstva prikazana plavom, a metode crvenom bojom. Takoe ete videti metode koji niste sami
napisali. O ovim metodama e biti rei kasnije.

Rezultat izvravanja programa je oekivan. Ispisane su


vrednosti svojstava Prezime i Ime kao to je prikazano na
slici:

Kada se pokrene ovaj primer (funkcijski taster F5),


dobiemo poruku koju do sada nismo imali prilike da vidimo:

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
okruenje nam postavlja pitanje u kom formatu elimo da
sauvamo izvorni kod kako se ne bi izgubili nai karakteri.
Preciznije reeno, im se u kodu nalazi bar jedan
karakter van osnovnog ASCII skupa, odnosno latinica, irilica, slova grke azbuke i slino, dobiemo isto upozorenje.
Da se prezime Peri ne bi pretvorilo u Peric, treba kliknuti
na dugme "Sauvaj sa drugim kodiranjem" (eng. Save
With Other Encoding). U narednom dijalogu treba izabrati opciju kao to je prikazano na slici:

Zatiena svojstva
Oba svojstva u primeru, korisnik klase moe da
postavi na bilo koju vrednost. U ovom sluaju to ne predstavlja problem. Ali ako elimo da u klasu Ucenik dodamo
svojstvo Razred, pod predpostavkom da je u pitanju uenik osnovne kole, validne vrednosti mogu biti samo brojevi od 1 do 8. Ako svojstvo Razred napravimo kao javnu
(public) varijablu, nemamo naina da kontroliemo i proverimo vrednost koja je upisana u nju i da zabranimo
pogrene vrednosti.
Da bi ovo ostvarili, moramo posedovati neki mehanizam koji proverava vrednost pre nego to se dodeli varijabli. 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 Razred, ali ga dodajemo pomou set i get funkcija. Sintaksa je
jednostavna, navodi se tip i naziv svojstva koje je sada
javno (public) i u okviru njega upiu set i get funkcije.

Kodiranje "Unicode (UTF-8 with signature)" e


sauvati izvorni kod u univerzalnom slovnom rasporedu
koji podrava sve svetske azbuke, pa i nau latinicu i irilicu. Kliknite na dugme "U redu" (eng. OK) kako bi ispravno snimili kod i vie neete dobijati ovakvo upozorenje.

Izmeniemo postojei kod kako bi bilo jasnije:


11

class Ucenik
{
public string Ime;
public string Prezime;
private int prRazred;

Rezime
Ako elimo da napravimo zatiena svojstva, kod
kojih treba vriti proveru pre dodele vrednosti procedura
je sledea:
napraviti privatnu varijablu koja ima isto ime kao eljeno svojstvo sa nekim prefiksom. (Ovu konvenciju imenovanja treba shvatiti kao preporuku, a ne kao vrsto
pravilo)

public int Razred


{
get
{
return prRazred;
}

napraviti javno (public) svojstvo sa eljenim imenom i


tipom istim kao privatna varijabla
unutar javnog svojstva uneti get i set delove.
u get delu korisniku pomou return naredbe vratiti
vrednost privatne varijable

set
{

u set delu proveriti vrednost koju korisnik dodeljuje


svojstvu (value) i ako je vrednost validna dodeliti je
privatnoj varijabli. U suprotnom prikazati poruku o greci.

prRazred = value;
}
}
}
Objanjenje:

Vano je primetiti da se ovde javno svojstvo koristi


kao interfejs ka privatnoj varijabli. Kao neka vrsta zatite
gde se mogu ispitati validne vrednosti pre dodele privatnoj varijabli. Ovo ispitivanje moe biti jednostavno, ali i
veoma sloeno zavisno od potrebe.

Privatna varijabla prRazred nije vidljiva van klase, i


korisnici klase ne mogu niti da postavljaju niti da itaju
njenu vrednost. Ipak, ova varijabla je ona koja je nama
bitna i sa kojom radimo unutar svoje klase.
Korisnik moe da postavlja vrednost ove varijable,
ali na posredan nain pomou public svojstva deklarisanog u liniji public int Razred. Svojstvo Razred se sastoji od
dva dela: get deo koji se automatski poziva kada korisnik
ita vrednost svojstva Razred i set deo koji se automatski
poziva kada korisnik postavlja vrednost svojstva Razred.
U get delu, se korisniku zapravo vraa vrednost
privatne varijable prRazred:
return prRazred;
U set delu se dodeljuje vrednost privatnoj varijabli prRazred.
prRazred = value;

Dobro napravljena klasa treba sama sebe da "brani"


od pogrenih vrednosti. Nekada ete je koristiti vi, a nekada drugi programeri i to stalno treba imati u vidu.
U sledeem nastavku e biti govora o najeem
nainu za proveru, kako se pokree i obrauje greka u
sluaju da vrednost nije validna.

Vebanje:
U klasi Ucenik napravite svojstvo Godiste godina
kada je roen uenik. Da li je ovom svojstvu potrebna zatita od pogrenog unosa i koje su validne vrednosti?
Da li su validne vrednosti fiksne, a ako nisu od ega
zavise?

Promenjiva value je specijalna C# varijabla i predstavlja vrednost koju je korisnik upotrebio prilikom dodele
vrednosti svojstvu. I ovde se nalazi klju za proveru vrednosti 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 greku sa odgovarajuom porukom.
12

Mala kola programiranja C# (4)

set
{

U predhodnom nastavku serijala smo govorili o


kreiranju zatienih metoda klase. Kreiranjem privatne
varijable i parom get i set funkcija smo implementirali
interfejs za privatnu varijablu. Na ovaj nain smo dobili
potpunu kontrolu nad procesom dodele i itanja vrednosti
svojstva.
U ovom nastavku e biti obraena tehnika kojom se
vrednost svojstva moe zatititi, odnosno ograniiti samo
na validne vrednosti.

prRazred = value;
}
}
U klasi postoji javno svojstvo Razred koje definie u
kom razredu je uenik srednje kole. Oigledno, validne
vrednosti za ovo svojstvo su brojevi od 1 do 4.
Svojstvo Razred je u stvari interfejs za privatnu varijablu prRazred koja je tip int. Bitno je shvatiti da iako korisnik klase vidi samo svojstvo Razred, za klasu je vana
samo vrednost koja se nalazi u privatnoj varijabli prRazred.
Get procedura je zaduena za itanje svojstva i kao
to vidimo u kodu, ona korisniku klase jednostavno vraa
vrednost varijable prRazred. S druge strane, za postavljanje vrednosti varijable prRazred je zaduena set funkcija
koja vrednost (value) dodeljuje varijabli prRazred.

itaoci koji prate ovaj serijal treba da otvore projekt


na kome smo radili u prolom nastavku.
Novi itaoci treba da urade sledee:
pokrenite Visual C# Express Edition
kliknite na link za kreiranje novog projekta (eng. Create
Project)
kliknite na ikonu "Konzolna Aplikacija" (eng. Console
Application)
napiite sledei kod (kod koji automatski generie radno okruenje je sive boje, kod koji treba uneti je plave
boje):

Da bi vrednost varijable prRazred ograniili na


interval od 1 do 4, u set funkciji je potrebno izvriti proveru vrednosti varijable value. Vreme je da se upoznamo sa
naredbom u C# jeziku koja nam ovo omuguava.

class Program
{
static void Main(string[] args) {
Ucenik cu = new Ucenik();
cu.Prezime = "Peri";
cu.Ime = "Petar";
Console.WriteLine(cu.Prezime);
Console.WriteLine(cu.Ime);
Console.ReadKey();
}
}

if naredba
Kao i svi ostali programski jezici i C# poseduje ovu
osnovnu naredbu za proveru uslova. Sintaksa je jednostavna:
if (uslov) {
// deo koji se izvrava ako je uslov taan
}
else {
// deo koji se izvrava ako uslov nije taan
}
Na primer:
if (a == 5) {
Console.WriteLine ("Varijabla a ima vrednost 5");
}
else {
Console.WriteLine ("Varijabla a ima neku drugu
vrednost");
}

class Ucenik {
public string Ime;
public string Prezime;
private int prRazred;
public int Razred {
get {
return prRazred;
}
13

U sluaju da varijabla a ima vrednost 5, uslov je


taan i izvrava se blok linija izmeu otvorene i zatvorene
vitiaste zagrade odmah ispod if naredbe. U naem sluaju to je samo jedna linija koda, ali ih moe biti proizvoljni
broj. U suprotnom (eng. else), izvrie se blok linija ispod
naredbe else. Deo else je inae opcioni, ne mora se navoditi ako nam ne treba.

public int Razred {


get {
return prRazred;
}
set {
if (value > 0 && value < 5) {
prRazred = value;
}
else {
// greska
}
}
}

Operator za proveru jednakosti je ==, a osim njega


postoje i sledei:
> 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 prRazred od pogrenih vrednosti. Dodeljujemo joj vrednost
samo ako je value vee od 0 i manje od 5, odnosno u
intervalu od 1 do 4. ta raditi ako korisnik klase unese
pogrenu vrednost? Taj sluaj se obrauje u else delu
uslova gde trenutno stoji samo komentar // greska.

Uslov moe biti i sloen kada se sastoji od dva ili


vie osnovna uslova. U tom sluaju neophodno je navesti i
logike operatore koji vezuju dva ili vie uslova. Na primer
elimo da proverimo da li varijabla a ima vrednost 5 i varijabla b ima vrednost 3.
Kompletan uslov je taan samo ako su tani iskazi
a == 5 i b == 3. Logiki operand koji na ovaj nain spaja
dva uslova se zove i (eng. and) i simboliki se obeleava
se &&:
if (a == 5 && b == 3)
// izraz je taan samo ako su oba uslova tana.

Najei nain je da se generie greka u izvravanju koja se prosleuje korisniku klase. On je dalje odgovoran za obradu ove greke, a ako to ne uradi greka e zaustaviti izvravanje programa.
Greke i njihovo pokretanje

Ako na primer, elimo da proverimo da li je varijabla a > 0 ili varijabla b <10 koristi se logiki operand ili
(eng. or) koji se simboliki obeleava sa dve vertikalne crte
||:
if (a > 0 || b<10)
// izraz je taan ako je taan ili prvi ili drugi ili oba uslova

U .NET okruenju greka je predstavljana klasom


Exception. Tanije reeno, postoji vie vrsta ovakvih klasa
koji se vezuju za specifine greke kao na primer rad sa
datotekama, rad sa bazama podataka i slino. Klasa
Exception predstavlja generalnu klasu za predstavljanje
greke koju emo mi i koristiti.

Ako se sada vratimo na poetni primer gde validna


vrednost svojstva Razred, odnosno vrednost privatne varijable prRazred treba da bude u opsegu od 1 do 4 ukljuujui, ispitivanje bi obavili na sledei nain:
if (value > 0 && value < 5)

Kao i kod svake klase, prvo je neophodno napraviti


objekat pomou naredbe new:
Exception greska = new Exception ("Pogrena vrednost
svojstva Razred");
U ovoj liniji koda smo napravili objekat na osnovu
klase Exception i taj objekat je predstavljen varijablom
greska. Odmah prilikom kreiranja mogue je, kao ulazni
parametar, napisati proizvoljni tekst koji opisuje greku.

U sluaju da je izraz taan dodeliemo privatnoj


varijabli prRazred vrednost value, a u sluaju da nije, potrebno je na neki nain obavestiti korisnika klase da je napravio 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:
cu.Razred = 7;
i ponovo pokrenemo program, on se ubrzo zaustavlja i

Kada se izvri throw, klasa prestaje sa radom i ovu


greku prenosi na korisnika klase, koji potom treba da je
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);
Console.WriteLine(cu.Razred);
Console.ReadKey();
}

vraa nas u razvojno okruenje sa naom porukom o greci:


Obrada greaka
Da bi sve funkcionisalo ispravno, korisnik klase ne
treba da dozvoli da bilo koja greka nasilno zavri njegovu
aplikaciju. Ovo se odnosi na sve mogue greke koje
mogu nastati u radu programa, a ne samo na na primer.
Greke moemo podeliti na tri grupe:

i potom izmeniti set deo u klasi:


set
{
if (value > 0 && value < 5)
{
prRazred = value;
}
else
{
Exception greska = new Exception
("Pogrena vrednost svojstva Razred");
throw greska;
}
}

1. Sintaksne greke (eng. syntax errors) rezultat pogreno napisane naredbe, nedeklarisane varijable i slino.
Ove greke najee nisu problematine jer program koji
ih sadri ni ne moe da se kompajlira.
2. Greke u vreme izvravanja (eng. runtime errors)
kao u naem primeru, greke koje se mogu ali i ne moraju
dogoditi za vreme izvravanja programa. Najee su
rezultat neproverenih vrednosti varijabli i pogrenog unosa korisnika. Relativno se lako pronalaze i ispravljaju.

15

static void Main(string[] args)


{
Ucenik cu = new Ucenik();
cu.Prezime = "Peri";
cu.Ime = "Petar";
try
{
cu.Razred = 7;
}
catch (Exception ex)
{
Console.WriteLine ( ex.Message );
}
Console.WriteLine(cu.Prezime);
Console.WriteLine(cu.Ime);
Console.WriteLine(cu.Razred);
Console.ReadKey();
}

Zanimljivost:
Opte prihvaen termin za greku u programiranju je
"buba" (eng. bug). Otud i termin otklanjanje buba u programu (eng. debugging program).
Odakle ovaj termin?
Prvi kompjuteri, pre pronalaska tranzistora su se
zasnivali na vakumskim cevima - kao stari radio aparati i
televizori. One su se u toku rada naravno grejale i pri
tome emitovale spektar svetlosti veoma privlaan za raznorazne insekte.
Jedna od dunosti osoba koji su tada odravali
raunare je bilo redovno ienje vakumskih cevi od insekata koji su se na njih zalepili i time im ometali hlaenje.
Otud i potie ovaj termin.

Obrada greke u C# se vri pomou naredbi try i


catch. U osnovnom obliku sintaksa je sledea:
try
{

U obradi greke smo u konzoli ispisali tekst greke


koristei Message svojstvo klase Exception. Klasa
Exception je u kodu predstavljena objektnom varijablom

// linije koda koje mogu da generiu greku


}
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.
U njemu piemo kod koji ispravlja greku ili bar
obavetava korisnika ta nije u redu. Opciono pomou
Exception varijable moemo proveriti koja greka se
dogodila, videti njen opis i zavisno od toga izvriti odgovarajuu akciju.

ex.
Kada pokrenemo program (obratite panju, vrednost svojstva Razred je postavljena na pogrenu vrednost
7), dobija se sledei rezultat:
Ovde je vano zapaziti da program nije nasilno zaustavljen zbog greke, ve je ona obraena i program je
nastavio sa radom.
Takoe vrednost svojstva Razred je ostala nepromenjena, odnosno ostavljena na inicijalnu vrednost nula.
U sledeem nastavku serijala poinjemo sa programiranjem Windows formi odnosno sa aplikacijama koje
imaju korisniki interfejs. Konzolne aplikacije su bile neophodni uvod u objektno programiranje, varijable i osnovne
programske strukture.

U naem primeru, greka se moe dogoditi na liniji


gde se dodeljuje vrednost svojstvu Razred dakle ta linija
se smeta u try blok. U catch bloku koji obrauje greku
emo u konzolnom prozoru ispisati opis greke.
Izmenite kod na sledei nain:
16

Posle par sekundi, nov projekt je kreiran i u njemu


se inicijalno nalazi poetna forma koja je prikazana na
ekranu. U ovom momentu moete ak i pokrenuti program
(F5 funkcijski taster) i videti praznu formu na ekranu. Trenutno naa aplikacija ne izgleda nita posebno, jednostavna prazna forma ali ako malo bolje pogledamo ona ima
sve funkcionalnosti Windows forme: naslov, ikonu, mogunost da je poveamo preko celog ekrana ili minimizujemo i
konano zatvorimo, to ujedno i zaustavlja izvravanje projekta.

Mala kola programiranja C# (5)


Kreiranje Windows aplikacija
U ovom i sledeim nastavcima emo se posvetiti
kreiranju Windows aplikacija u radnom okruenju Microsoft Visual C# Express edition. Na poetku, kada su se
pojavile prve verzije Windowsa, programiranje Windows
aplikacija je bilo veoma teko i dostupno samo odabranim
profesionalcima. Pojavom vizualnih alata i takozvanog
RAD (Rapid Application Development rapidni razvoj
aplikacija) sistema, kreiranje ovakvih aplikacija je znaajno
pojednostavljeno i postalo je dostupno irokom krugu
programera. Kako je ovo postignuto? U predhodnim
poglavljima smo uili objektno programiranje i u njemu je
klju. Svi elementi koji se koriste u programiranju
Windows aplikacija su "prefabrikovani" - stoje nam na raspolaganju sa svojom paletom svojstava, metoda i dogaaja u vidu gotovih klasa. Nama samo ostaje da ih
organiyujemo na nain koji nam je potreban, postavimo
im odgovarajua svojstva i napiemo kod kao odgovor na
akcije korisnika dogaaji klasa.
Postavljamo se u ulogu arhitekte koji ima na raspolaganju veliki broj elemenata koji ine jednu kuu. Na
nama je da dobro upoznamo te elemente, ukomponujemo
ih i podesimo da harmonino funkcioniu.
Na vrhu hijerarhije elemenata je sama aplikacija,
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 poznati 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.

Odakle joj sve ove funkcionalnosti kada jo uvek


nismo nita programirali? U predhodnim nastavcima ovog
serijala bilo je govora o klasama, a naa forma je naslednik
postojee klase Form koja se nalazi u .NET Frameworku.
Svi naslednici bilo koje klase nasleuju njene funkcionalnosti uz mogunost dodavanja novih. Dakle puno stvari za
nas je unapred ve uraeno.
Kada radimo Windows aplikacije razlikujemo dva
osnovna dela:
Dizajn korisnikog interfejsa u kome "crtamo" i rasporeujemo kontrole na formi. Ovde takoe vrimo i podeavanje svojstava i ponaanje kontrola.
Kodiranje, deo u kome piemo kod kao odgovor na
akcije korisnika, na primer klik miem na komandno
dugme, izbor iz liste, zatvaranje forme i slino.

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


mogu koristiti na formi

Kada elimo da napiemo kod koji se izvrava kada


korisnik neto uradi sa dugmetom postoji vie naina. Najjednostavniji je da uradite dupli klik na komandno dugme.
Sada je otvoren prozor za pisanje koda i kurzor se
nalazi tano na poziciji gde treba da ponemo pisanje.

2. Pretraiva reenja (Eng. Solution Explorer) prikaz


svih projekata i njihovih elemenata (forme, klase, resursi i
ostalo)
3. Svojstva (Eng. Properties) prikazuje svojstva izabrane
kontrole ili forme

private void button1_Click(object sender, EventArgs e)


{

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
ukazuje da se radi o kontroli koja se zove button1 i da
obraujemo dogaaj koji se izvrava kada korisnik klikne
na njega.
Moda je na prvi pogled zbunjujue to je ostalo
button1, a ne Test ali mi smo izmenili natpis na dugmetu, ne i njegovo ime koje je ostalo button1.
Ovo prikazuje jo jednu vanu injenicu: svaka kontrola na formi ima svoje jedinstveno ime pomou koga se
vezuju dogaaji, ali takoe svojstva i metode kontrole.
Svojstvo kontrole koje odreuje njeno ime se naziva
Name i obavezno ga je definisati. Prilikom postavljanja
dugmeta na formu, Visual Studio mu je automatski dodelio
ime "button1". Ovo znai da bi sledee dugme dobilo ime
"button2" i tako redom. Kasnije emo govoriti o nazivima
kontrola, za sada emo ostaviti da ih postavlja Visual Studio.
U okviru vitiastih zagrada napiite sledeu liniju koda:

Prva aplikacija
Sada emo napraviti jednostavnu aplikaciju sa samo
jednim komandnim dugmetom. Kada kliknemo na njega
ispisaemo poruku "Moja prva Windows aplikacija".
Na postojeu formu treba postaviti jedno komandno dugme. Svaka kontrola se postavlja tako to se na nju
klikne i potom prevue na formu. Dakle kliknite na stavku
Button (paleta sa alatima) i prevucite je na formu. Kada je
kontrola na formi, moemo joj naknadno menjati poziciju i
dimenzije po elji. Ako nam ne treba, jednostavno na nju
kliknite miem i obriete je pomou tastera Delete na tastaturi.
Na komandnom dugmetu inicijalno pie "button1"
to emo izmeniti u "Test". Kliknite miem na dugme i u
prozoru svojstva (Eng. Properties) naite svojstvo pod
nazivom "Text". Vidimo da tamo pie "button1". Izmenite
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 kartice (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 program 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 projektu.

19

Mala kola programiranja C# (6)


Rad sa formama
Svaka Windows aplikacija se sastoji najmanje od
jedne forme (formulara), meutim najee ih ima nekoliko, pa ak i nekoliko desetina u sloenijim aplikacijama.
Jasno je da treba nauiti naine kako programski otvoriti i
zatvoriti eljenu formu, kao i naine postavljanja osobina
forme.
Ovo nas ponovo vraa na objektno programiranje,
jednostavno zbog toga to svaka forma prilikom kreiranja
aplikacije predstavlja jednu klasu. Koncept je jednostavan:
obino se poinje od kreiranje "glavne" forme ona koja
prva otvara prilikom pokretanja same aplikacije i onda se
dodaju sve ostale koje su nam potrebne.
Na primer, prilikom pokretanja programa MS Word,
glavna forma je zapravo deo Worda gde unosimo i ureujemo tekst. Svi ostali dijalozi kao to je ekran za podeavaNapomena:
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 raunara) 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 ekran, istovremeno, u pozadini se vri inicijalizacija aplikacije koju ste pokrenuli.
Psiholoki efekat je da im korisnik pokrene aplikaciju odmah vidi neku aktivnost na ekranu - ne treba da
eka par ili vie sekundi i da se pita da li je sve u redu.
nje opcija, umetanje tabela i mnogi drugi, predstavljaju
zasebne forme koje se otvaraju kao odgovor na akciju
korisnika.
Teoretski gledano, svaka forma predstavlja klasu
koja je nasleena od bazne .NET Framework klase Form iz
imenovanog prostora System.Windows.Forms. Bazna klasa
prua mnoge fukcionalnosti naoj klasi (formi) koje moe20
mo odmah koristiti.

Prilikom izvoenja programa, moramo programski


instancirati ovu klasu kako bi bilo ta dalje mogli raditi. U
vreme dizajniranja forme, moemo po potrebi postavljati
razliite osobine svojstva forme, ali ih takoe i naknadno
menjati u vreme izvravanja.
Dodavanje nove forme u program
Otvorite primer koji smo radili u predhodnom broju
asopisa (Demo1), ili moete kreirati nov projekt: pokrenite
Visual C# Express Edition, iz opcije File izaberite stavku
New Project, u otvorenom dijalogu izaberite Windows
Application. Za ime projekta ukucajte Demo1 (linija
Name:). Na kraju kliknite na dugme OK. U oba sluaja se
dobija kreiran projekt pod nazivom Demo1 sa prvom i za
sada jedinom poetnom formom.

Sada u Project Exploreru uradite desni klik na projekt Demo1, iz padajueg menija izaberite Add i iz podmenija izaberite Windows Form kao to je prikazano na slici:
Na ovaj nain se otvara opti dijalog za dodavanje
nove stavke u projekat, sa izabranom ikonom Windows
Form. U ovom dijalogu moemo odmah dati i ime novoj
formi (klasi) to emo i uiniti.
Ranije sam pomenuo da tehniki gledano nije neophodno, ali je svakako korisno i predstavlja dobru praksu
davati unificirana imena svim klasama i objektima.

U ovom smislu emo novoj formi dati naziv frmDrugaForma (jedna re, bez razmaka) koji treba upisati u
liniju Name i na kraju kliknuti na dugme Add.

Poto sada radimo na klasi Form1 i to u dizajn reimu, u Solution Exploreru uradite dupli klik na klasu Form1.
Na formu je dalje potrebno postaviti komandno
dugme. Kao i u prolom nastavku serijala iz palete sa alatima (Toolbox) izaberite komandno dugme (Button) i nacrtajte ga na povrini forme. Alternativno moete uraditi i
dupli klik miem na Button stavku iz palete sa alatima.

Dodata forma je prikazana na ekranu, a u Solution


Exploreru je takoe prikazana sa specifinom ikonom koja
oznaava sve forme u projektu:

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 postavljamo sva ostala njegova svojstva, piemo kod za njegove dogaaje i koristimo njegove metode. Svojstvo Name
zapravo predstavlja ime klase koja predstavlja taj element,
na potpuno isti nain kao to se u programiranju imenuju
promenjive.
Pravila za zadavanje imena su jednostavna:
maksimalna duina za ime je 128 karaktera
ime moe sadrati slova i brojeve, ali ne moe poeti
brojem
ime ne sme sadravati specijalne karaktere i razmake

Iz Solution Explorera po potrebi moemo prilikom


projektovanja i pisanja koda otvarati potrebnu formu i to u
dva reima: reim za grafiko dizajniranje forme i reim za
pisanje programskog koda koji se nalazi na formi.
Programski kod
Grafiki dizajn forme

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 eljeno dugme kao to je prikazano na predhodnoj slici. Opciono moete uraditi i dupli klik na naziv forme, ime se ona
uvek otvara u grafikom reimu.
Sada elimo da na poetnoj formi (Form1) postavimo standardno komando dugme i napiemo kod koji e
otvoriti drugu formu (frmDrugaForma) kada korisnik klikne na ovo dugme.

(dole desno u razvojnom okruenju) pronaite svojstvo


Name i promenite ga u btnOtvoriFormu kao to je prikazano na slici i pritisnite Enter taster.
21

Primetiete da se natpis na dugmetu nije promenio.


Oigledno natpis na dugmetu ne prikazuje njegovo ime
ve neto drugo.
Svaki element korisnikog interfejsa koji ima neki
natpis na sebi, ukljuujui i formu ima svojstvo Text koje
odreuje ovaj natpis.
U listi svojstava (Properties dijalog) za komandno
dugme pronaite Text svojstvo i izmenite ga na
"Otvori drugu formu". Text svojstvo ne podlee pravilima
za zadavanje imena klasama i varijablama, tako da moete
upisati ta god elite. Na kraju forma za dugmetom treba
da izgleda ovako:

Klasa (pa i objekat) tipa Form ima metodu kojom se


forma iscrtava i prikazuje na ekranu. Metoda Show() je
iskoriena u drugoj liniji. Sintaksa poziva metode bilo kog
objekta je jednostavna:
ImeObjekta.NazivMetode (argumenti)
Verzija metode Show koju mi koristimo nema argumente, ali svejedno moramo napisati otvorenu i zatvorenu
zagradu.
Pokrenite program (F5 funkcijski taster) i proverite
kako radi.
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. Ovakva relacija izmeu formi se zove "modalne forme" (esto
je u upotrebi i termin "Dialog forma"). Kao primer modalnog ponaanja moete opet pogledati skoro sve dijaloge u
MS Wordu.
Da bi implementirali modalnu relaciju izmeu nae
dve forme, potrebno je umesto metode Show() koristiti
metodu ShowDialog(), takoe bez argumenata.
Zaustavite program ako je pokrenut, i izmeniti drugu liniju koda:

Kodiranje
Na kraju ostaje da upiemo kod koji e otvoriti drugu formu. Duplim klikom na dugme otvaramo kod za
pisanje dogaaja. Dugme poznaje puno dogaaja, meutim ubedljivo najee se koristi Click dogaaj, to nam
razvojno okruenje inicijalno i nudi.
Poto forma frmDrugaForma predstavlja klasu, pre
korienja moramo napraviti instancu te klase.
Deklarisaemo varijablu koja e biti odgovarajueg
tipa i inicijalizovati je kao pokaziva na instancu klase frmDrugaForma. Ime varijable nije bitno, a mi emo koristiti
ime MojaForma.

MojaForma.ShowDialog();
Ponovo pokrenite program i sada vidite da se ne
moete prebaciti na prvi formu dok ne zatvorite drugu.
Modalni (dialog) nain otvaranja forme se u praksi znatno
ee koristi.

Na mestu gde se nalazi kurzor ukucajte sledee dve


linije koda:
frmDrugaForma MojaForma = new frmDrugaForma();
MojaForma.Show();

Zatvaranje forme
Otvorenu formu moemo uvek zatvoriti na standardni nain klikom na dugme x u njenom gornjem desnom
uglu. Meutim esto je potrebno programski zatvoriti formu. Da bi ovo uradili moramo se predhodno upoznati sa
pokazivaem this.

U prvoj liniji deklariemo varijablu MojaForma koja


je tipa frmDrugaForma i odmah joj dodeljujemo novu
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 argumenata. 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 uradite sledee:
Na drugoj formi (frmDrugaForma) postavite dugme, dajte mu naziv btnZatvoriFormu i neka na njemu
bude tekst "Zatvori formu".
Kada korisnik klikne na ovo dugme treba naravno
zatvoriti ovu formu.

23

Za dugme, kao i za veinu ostalih kontrola moemo


postaviti font koji se koristi kao i njegove atribute
(podebljan, ukoen, podvuen). Svojstvo Font nam omoguava sve ovo i na sledeoj slici je prikazano sa svim svojim

Mala kola programiranja C# (7)


Windows kontrole
Osnove svake windows aplikacije predstavljaju formulari (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 poglavljima emo se upoznati sa osnovnim windows kontrolama, njihovom namenom, svojstvima, metodima i dogaajima.
Osnovno za svaku kontrolu je svojstvo Name koje
predstavlja njen jedinstveni identifikator u okviru formulara 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 razmaka 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 preporuenih prefiksa za svaku kontrolu se nalazi na lokaciji
http://msdn2.microsoft.com/en-us/library/ms229045.aspx

atributima.
Od dogaaja, najee se koristi Click, koji se pokree kada korisnik klikne na dugme.

Komandno dugme (eng. command button)

Veba:
Pokrenite nov projekt i kreirajte novu Windows aplikaciju.
Postavite komandno dugme na poetni formular.
Svojstvo Name postavite na cmdKrajRada, a svojstvo Text
na &Kraj rada.

Komandno dugme (ili samo dugme), predstavlja


najoigledniju i verovatno najjednostavniju kontrolu. Omoguava korisniku da klikom na njega pokrene odgovarajuu akciju segment programskog koda.
Kljuno
svojstvo dugmeta je svojstvo Text kojim se postavlja natpis na njemu. Generalno, svaka kontrola koja na sebi
poseduje neki natpis ima svojstvo Text.
Ovo svojstvo ima jo jednu mogunost: ako postavite 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


events) piemo na sledei nain: miem izaberite dugme i
kliknite na ikonu (narandasta munja) u dijalogu svojstava
koja daje listu svih raspoloivih dogaaja izabranog elementa, kao to je prikazano na slici.

Labela (eng. Label)


Labela daje mogunost prikaza teksta na formularu
koji moe biti samostalan, ali se obino vezuje za neku
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 podatke koji se dalje koriste u aplikaciji. Relativno sloena kontrola koja se veoma esto koristi prilikom graenja korisnikog okruenja. Omoguava unos teksta u jednoj ili vie
linija. Moemo ograniiti mogui broj unetih karaktera,
postaviti font koji se koristi i odrediti druge grafike elemente.
Kljuno svojstvo ove kontrole je takoe svojstvo Text
koje se moe postavljati i itati za vreme izvravanja aplikacije i na taj nain se vri obrada unosa korisnika.
Svojstvo Multiline oznaava da li je mogua jedna
(False) ili vie linija teksta (True).
Ako je svojstvo Multiline postavljeno na True, obino se postavlja i svojstvo ScrollBars koje ovakvom vielinijskom tekstu dodaje mogunost pomeranja po vertikali i
horizontali.
Svojstvo MaxLength definie maksimalni broj karaktera koji korisnik moe uneti. Inicijalno je postavljen na
32767, to je u praksi obino previe uvek e biti znatno
manje.
Od dogaaja se najee koristi TextChanged.
Ovaj dogaaj se automatski pokree svaki put kada korisnik unese ili obrie karakter u kontroli. Moe se iskoristiti
za proveru unetog sadraja, on line pretragu i tome slino.

Pronaite Click dogaaj i miem uradite dvostruki


klik na njega. Na ovaj nain ste otvorili prozor za pisanje
programskog koda koji se izvrava za izabranu akciju
Click u naem sluaju.
U ovoj vebi, elimo da se program zavri kada
korisnik klikne na dugme.
Na mestu kurzora upiite sledeu liniju koda:
Application.Exit();
Koristimo Application objekat koji predstavlja
pokaziva na aplikaciju i njegov metod Exit koji bezuslovno zavrava rad aplikacije i oslobaa sve resurse koje ona
koristi.
Pokrenite aplikaciju (F5 funkcijski taster) i kliknite
na dugme. Uoite da isto moemo postii skraenicom
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.
Na formular postavite dve Label i dve TextBox kontrole i to sledeim redom:

Veina njih je orijentisana na grafiki izgled dugmeta, pa posebno obratite panju na svojstvo Image i njemu
slina.
25

1. Postavite prvu Label kontrolu i postavite joj sledea


svojstva:
Name: lblIme i Text: &Ime

Napomena:
Postoji vie varijanti metode Show MessageBox

2. Postavite prvu TextBox kontrolu sa svojstvom


Name: txtIme i MaxLength: 15

Pokrenite primer, unesite svoje ime i prezime i kliknite na dugme Snimi. Ako ste sve upisali kako treba, dobiete 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:
U realnosti klikom na dugme cmdSnimi bi unete
podatke snimili u bazu podataka, ali za sada emo ih
samo ispisati u dijalogu za poruke.
Kao to je opisano na poetku ovog nastavka, otvorite kod za Click dogaaj komandog dugmeta i napiite
sledee dve linije koda:

Poto smo postavili skraenice na obe Label kontrole, ispitajte kako funkcioniu. Kombinacija Alt+I treba da
kurzor postavi na TextBox za unos imena, a Alt+P na
TextBox za unos prezimena. Alt+S e pokrenuti Click
dogaaj dugmeta. Kako je ovo postignuto?
U svakoj Windows formi postoj pojam TabOrder. On
definie redosled kojim se vri navigacija kada korisnik klikne na Tab ili Shift+Tab taster na tastaturi.

MessageBox.Show (txtIme.Text);
MessageBox.Show (txtPrezime.Text);

Veoma je bitno postaviti logini redosled kretanja po


formularu. Svaka kontrola poseduje numeriko svojstvo
TabIndex koje poinje od broja 0 pa na dalje.
U naem primeru prva labela ima TabIndex svojstvo
postavljeno na 0, prvi TextBox na 1, i tako redom.

Objekat MessageBox predstavlja dijalog za poruke.


Poseduje metodu Show koja ima jedan parametar tekst
koji treba prikazati. U ovom primeru prikazujemo sadraj
(uneti tekst) u kontrolama txtIme i txtPrezime.
Vidimo i sintaksu pristupa svojstvu bilo koje kontrole: ImeKontrole.SvojstvoKontrole.
Na ovaj nain moemo itati ali i postavljati vrednosti svojstava kontrola.
26

Drugi pojam koji treba znati je Focus.


On predstavlja situaciju kada kontrola postaje aktivna. 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 automatski dobija svoj TabIndex u skladu sa redosledom postavljanja.
esto se meutim u praksi postavlja potreba
za runom izmenom redosleda kontrola. To moemo uraditi 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 odgovarajui 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 drugim, sloenijim Windows kontrolama.
27

Klikom na dugme elimo da proverimo stanje


CheckBox kontrole i da zavisno od toga ispiemo odgovarajuu poruku.
Da bi ovo uradili, moramo se upoznati sa naredbom
za ispitivanje uslova u C# programskom jeziku. Poznavaoci
C ili C++ programskog jezika e videti da je sintaksa identina:

Mala kola programiranja C# (8)


Windows kontrole
Prilikom kreiranja korisnikog interfejsa u
Windowsu, na raspolaganju nam je veliki broj grafikih
elemenata kontrola. U ovom nastavku se upoznajemo sa
malo sloenijim kontrolama koje nam nude specifine funkcionalnosti.

if (Uslov)
{
// blok naredbi koji se izvrava kada je uslov taan
}
Else
{
// blok naredbi koji se izvrava kada je uslov nije
taan
}

CheckBox kontrola
Ova kontrola omoguava korisniku da markira ili
demarkira neku opciju. Ako imamo vie CheckBox kontrola
na formularu, one su meusobno nezavisne mogu se
proizvoljno markirati ili demarkirati.
Kljuno svojstvo ove kontrole je svojstvo Checked
koje moe imati dve vrednosti - True (da) i False (ne).
Svojstvo Checked moemo postavljati i itati kako u reimu dizajniranja tako i u reimu izvravanja aplikacije.
U kodu se najee koristi kroz IF uslov koji vri
ispitivanje da li je CheckBox markiran ili ne i u zavisnosti
od toga se vri dalje grananje koda.
Opis znaenja CheckBox kontrole se definie kroz
njeno Text svojstvo. Nije potrebno postavljati zasebnu
Label kontrolu ona je integrisana u CheckBox.
Veba:
Pokrenite C# Express razvojni alat, kreirajte novu
Windows aplikaciju i na inicijalnu formu postavite jednu
CheckBox i jednu Button kontrolu.
Za Text svojstvo CheckBox kontrole unesite
"Opcija" (bez znakova navoda), a za Text svojstvo Button
kontrole unesite "Test". Formular treba da izgleda kao to
je prikazano na slici:

Na primer:
If (a == 2)
{
neki kod...
}
Deo else je opcioni i ne mora se navoditi.
Uslov moe biti kompozitni, sloen od dva ili vie
pojedinanih uslova. U tom sluaju je neophodno ove pojedinane uslove spojiti odgovarajuim logikim operatorima.
Operatori AND (i) i OR (ili) se sintaksno oznaavaju
sa && i II respektivno.
Na primer:
If (a==5 || b ==7)
uslov je taan ako je tano a=5 ili b=7 ili su oba uslova tana.
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


je. Zavisno od stanja CheckBox kontrole treba da dobijete
odgovarajuu poruku:

Sada pokrenite aplikaciju i testirajte je. Primetiete


da moete markrati samo jedno radio dugme u svakoj grupi.
U praksi se Panel kontrola najee koristi za grupisanje radio dugmadi.
Bitna svojstva su identina kao kod CheckBox kontrole: 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 stavki. 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
najei sluaj punjenje u vreme izvravanja i to iz baze
podataka. Za sada emo je napuniti pomou jednostavne
petlje iz koda.
Ako koristimo objektno orijentisanu terminologiju,
moemo rei da je lista kolekcija stavki tipa Object.
Kolekcija oznaava skup objekata istog tipa. Svaki
lan kolekcije ima svoj jedinstveni indeks koji poinje od
broja 0 do ukupnog broja stavki u kolekciji umanjenog za
jedan.
Bitno je razumeti da kolekcija ima svoja specifina
svojstva i metode, ali takoe i svaki objekat u kolekciji.
Na primer svaka kolekcija ima svojstvo Count koje je
samo za itanje i daje broj objekata u kolekciji. Kolekcije
imaju metode kojima se moe dodavati nov objekat u kolekciju (Add), obrisati pojedinani objekat (RemoveAt) ili
obrisati sve lanove kolekcije (Clear). Svojstva i metode
pojedinanih objekata kolekcije zavise od tipa objekata.
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

Radio Button kontrola


Ova kontrola je slina CheckBox kontroli, ali u
ovom sluaju moemo markirati samo jednu kontrolu u
okviru iste grupe. Otud i naziv "radio dugme", setite se
starih radio aparata gde se preko mehanikih dugmadi
birao frekventni opseg. Pritiskom na bilo koje dugme,
predhodno ukljueno se iskljuuje samo jedno moe biti
upaljeno.
Pod grupom radio dugmia se smatraju svi koji su
postavljeni na isti kontejner kontrola. Oigledni kontejner
kontrola je formular, ali ih ima jo nekoliko na raspolaganju.
Na formu postavite tri Radio Button kontrole. One
su na istom kontejneru formular, te su povezane i
meusobno se iskljuuju.
Zatim na formu postavite kontrolu Panel. Ona
predstavlja drugi kontejner na koji emo staviti jo tri radio dugmeta. Konani izgled formulara:

29

Indeksi objekata lanova kolekcije idu od nula do


MojaKolekcija.Count 1
U List Box kontroli ova kolekcija se zove Items i
sastoji se od lanova pod nazivom Item.
Sve kolekcije .NET Framework-a potuju istu
nomenklaturu: kolekcija je imenica u mnoini a svaki lan
kolekcije je ista imenica u jednini. Na primer kolekcija Tables se sastoji od objekata tipa Table.
Na formu postavite List Box i jednu Button kontrolu. Ostaviemo inicijalne nazive ovih kontrola listBox1 i
button1.
elimo da klikom na dugme napunimo listu brojevima od 1 do 100. Koristimo metodu Add kolekcije Items
gde je ulazni parametar generiki tip Object to znai da
moemo "podmetnuti" varijable numerikog ili string tipa
svejedno, sve su interno nasleene od istog Object tipa.
Duplim klikom na dugme otvorite prozor za pisanje koda:

int i;
listBox1.Items.Clear();
for (i = 1; i <= 100; i++)
{
listBox1.Items.Add(i);
}
Sada, pre punjenja liste uvek briemo sve stavke.
Ako elimo da proitamo vrednost izabrane stavke iz
liste, postoje dva naina:
jednostavno proitamo svojstvo Text: listBox1.Text
pomou svojstva SelectedItem koja vraa Object prezentaciju izabrane stavke: listBox1.SelectedItem
Brisanje pojedinane stavke iz liste se vri metodom
RemoveAt kolekcije Items. Na primer ako elimo da obriemo treu stavku u listi:

int i;
for (i = 1; i <= 100; i++)
{
listBox1.Items.Add(i);
}

listBox1.Items.RemoveAt (2);
Obratite panju da je indeks tree stavke = 2 jer se
indeksi broje od nule.

Pokrenite primer i testirajte ga. Primetiete da svaki


put kada pritisnete dugme dodajete jo 100 stavki u listu.
Ako elimo da pre dodavanja obriemo sve stavke
(ako ih ima), dodaemo jo jednu liniju koda pre petlje
koja brie sadraj kolekcije Items:

Svojstvo SelectedIndex pokazuje indeks izabrane


stavke iz liste. U pitanju je tip int, a ako ni jedna stavka nije
izabrana vrednost SelectedIndex svojstva je jednaka -1.
Ovo se koristi kao indikacija da korisnik nije izabrao
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 upoznati sa jo nekoliko kontrola i polako prei na korienje
baze podataka u C# aplikacijama.

30

Osim teksta stavka menija moe imati sliicu (eng.


Icon) i definisanu skraenicu sa tastature (eng. Shortcut).

Mala kola programiranja C# (9)


Kreiranje menija u aplikaciji

Kreiranje menija

Posle letnjih odmora nastavljamo sa malom kolom


programiranja u C# programskom jeziku. Nadam se da
smo se svi odmorili i da smo spremni za uenje.

Pokrenite Visual C# Express razvojno okruenje i


kreirajte novu Windows aplikaciju. Meni emo kreirati na
inicijalnoj formi (Form1).
U paleti sa alatkama (eng. Toolbox) pronaite sekciju Menus & Toolbars. U okviru nje pronaite kontrolu
MenuStrip koja daje potrebne funkcionalnosti menija na
formi.

Rad sa menijem
Gotovo svaka Windows aplikacija ima meni kao
davno ustanovljeni vid interakcije sa korisnikom. Prednosti
menija su mogunost hijerarhijske organizacije koje odgovaraju 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 dinamikog 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 korisnik klikne na stavku u horizontalnoj liniji. Vertikalna linija
moe imati stavki na vie nivoa hijerarhije.
Na sledeoj slici vidite View meni iz radnog okruenja Visual C# Express edition.

Prevucite je i pustite na formu - nije vano gde, jer


se meni automatski pozicionira na vrh forme, a sama kontrola u specijalnom prozoru ispod forme kao to je prikazano na sledeoj slici.

31

Ako elite da kreirate meni, prvo morate da kliknete


na kontrolu na dnu forme koja je dobila inicijalno ime
menuStrip1. Tada se u dizajneru prikazuje meni na vrhu
forme.
Zapazite tekst Type Here koji dovoljno govori
sam za sebe. Napraviemo deo menija koji je manje-vie
standardan za veinu aplikacija.

&Otvori
&Snimi
Snimi k&ao
&Kraj rada
Ako za tekst stavke unesete samo znak (minus),
on ima specijalno znaenje: u meniju se prikazuje horizontalni separator. Korisno kada treba da vizuelno razdvojite
razliite funkcionalne grupe u okviru vertikalnog menija.

Tamo gde pie Type Here otkucajte


Datoteka (bez znakova navoda) ili File ako elite meni
na engleskom jeziku.
im ponete da kucate odmah e se ispod i desno
od ove stavke otvoriti mogunost za dalji unos stavki
menija, horizontalno i vertikalno:

Na kraju na meni treba da izgleda kao na sledeoj slici:

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
horizontalnom delu menija.

Redom bi dalje popunjavali ostatak menija, zavisno


od funkcionalnosti aplikacije.
Primer menija na formi koji je popunjen standardnim stavkama (na engleskom jeziku) moete videti na
sledeoj slici:

Ova funkcionalnost se jednostavno definie potrebno je ispred karaktera koji treba da bude hot key
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 tastature. Ovo se i vidi im pritisnite Enter taster ime zavravate 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.


Poseduje metod Exit koji izvrava bezuslovni prekid rada
aplikacije i oslobaa sve resurse koje je aplikacija zauzela
(memoriju, datoteke, baze podataka i tako dalje...)

Programiranje menija:
Svaku stavku menija je najbolje tretirati kao komadno dugme (eng. Button). Programiranje se vri u Click
dogaaju stavke menija.
U primeru koji smo zapoeli kliknite samo jednom
na stavku menija Kraj rada. Svaka stavka menija ima
svoj set svojstava koja su vidljiva u standardnom prozoru
za prikaz svojstava objekta - Properties prozoru:

Pokrenite aplikaciju i miem kliknite na Kraj rada.


Pokuajte takoe i pomou skraenica sa tastature:
prvo Alt+D kako bi otvorili meni Datoteka, a potom samo
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 kombinacija 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) pronaite 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


Name koje je automatski generisano u naem sluaju
krajRadaToolStripMenuItem.
Svojstvo Text definie tekst stavke menija i njega
smo podeavali iz dizajnera.
Sada uradite dupli klik na stavku menija Kraj
rada, ime je otvoren Click dogaaj u prozoru za pisanje
koda. Kada korisnik klikne na Kraj rada elimo da zaustavimo izvravanje programa. Upiite sledeu liniju koda:

Markirajte Alt i iz padajue liste izaberite slovo K


kao to je prikazano na gornjoj slici. Sada kombinacija
Alt+K zavrava nau aplikaciju. Pokrenite aplikaciju i probajte.
Primetite da se uz stavku menija prikazuje i njena
s k ra e ni ca . O v o s e p o d e a va s vo j s t v om
ShowShortcutKeys koja moe imati vrednosti True (da)
ili False (ne).

Application.Exit();

33

Korisna je i mogunost da pored svake stavke menija imate znak za overu (eng. Check).
Svojstvo Checked koje moe imati vrednosti True ili
False obezbeuje upravo ovo.
Izaberite stavku Snimi u svojstvima pronaite Checked 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
primer, linija koda:

Slike
Svaka stavka menija (ukljuujui i stavke u horizontalnoj liniji) moe imati i sliicu (eng. Ikon) koja doprinosi
lepem i razumljivijem korisnikom interfejsu.
Sliice koje se koriste za ovu namenu su najee
bmp ili jpeg formata, dimenzija 16x16 piksela. Pogledajte
na Internetu i naiete veliki broj kolekcija sliica za besplatno preuzimanje. Ako ste veti moete ih napraviti i
sami.
Pomou svojstva Image moete da izaberete sliku
sa vaeg raunara i dodelite je stavci vaeg menija.
Kliknite na malo dugme pored ovog svojstva i dobi-

snimiToolStripMenuItem.Checked = true;
e za vreme izvravanja programa postaviti znak za overu
pored stavke menija.

Takoe, u praksi se esto koristi dinamiko prikazivanje ili skrivanje stavke menija ili cele grupe, opet zavisno
od logike aplikacije. Za ovo imamo dve mogunosti, odnosno 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 raunara izaberite sliku koju ste pripremili. Na kraju kliknite na
dugme OK. Ako je slika vea od 16x16 piksela, bie automatski skalirana na tu veliinu.

34

U svakom sluaju osnovne funkcionalnosti su iste:


Mogue je izabrati datoteku, prikazane su samo datoteke
koje zadovoljavaju odreeni kriterijum (samo doc ekstenzije na prvoj, odnosno mdb na drugoj slici) uz mogunost da
se runo unese ime datoteke - File name polje.

Mala kola programiranja C# (10)


Rad sa standardnim dijalozima i datotekama
Veina Windows aplikacija ima potrebe da manipulie razliitim datotekama; tekstualne datoteke, slike, itd. u
smislu itanja i pisanja sadraja.
U ovom nastavku male kole programiranja za C#
emo se posvetiti upravo ovome. Manipulacija datotekama
obavezno ukljuuje i standardne dijaloge za izbor i uvanje sadraja. Oni se otvaraju izborom opcija Snimi (eng.
Save) i Otvori (eng. Open).

Dobra vest je to nema potrebe runo programirati


ove dijaloge. Oni su sistemski i postoje u svakoj verziji
Windowsa od kada on postoji. ak, ako na primer kreirate
aplikaciju u Windowsu XP sa ovim dijalozima i kopirate
izvrnu datoteku na Windows Vistu videete Vistine dijaloge bez ikakve izmene aplikacije.
Korienje ovih dijaloga je veoma jednostavno,
direktno i potpuno podrano u Visual C# Express Edition.

Na primer, u Microsoft Wordu dijalog za otvaranje


dokumenta je prikazan na sledeoj slici:

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
dijalog i ime izabrane datoteke ispisuje u naslovu formulara.
Pokrenite Visual C# Express Edition i u poetnom
ekranu kliknite na link Create Project. U dijalogu New
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.

Zavisno od verzije operativnog sistema, zavisi


izgled i funkcionalnost ovih dijaloga. Na gornjoj slici je
prikazan Open dijalog u operativnom sistemu Windows
Vista. U Windows XP operativnom sistemu on izgleda
malo drugaije:

1. postaviti odgovarajuu kontrolu na formular


U paleti sa alatkama (sa leve strane razvojnog okruenja), 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 ekstenzija. 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 otvoriti tekstualne datoteke postavite ovo svojstvo na Otvori
tekstualnu datoteku.

U ovoj sekciji se nalaze svi standardni Windows


dijalozi. Osim pomenutih, tu su dijalozi za izbor boje, pregled direktorijuma i izbor fonta.

Opciono moemo postaviti naziv direktorijuma iji


e saraj biti prikazan odmah po otvaranju dijaloga. Ako
elimo da se odmah prikae koren diska C: u svojstvo
InitialDirectory upiite C:\.

Na formular postavite (prevuci i pusti postupak)


kontrolu OpenFileDialog. Kontrola se prikazuje na traci
ispod formulara i inicijalno je dobila naziv (Name svojstvo)
openFileDialog1.

Sada smo pripremili dijalog za otvaranje.


NAPOMENA:
Sva pomenuta svojstva se mogu postaviti kako u vreme
dizajniranja (kao to smo mi uradili), tako i u vreme izvravanja programa.

2. Postaviti potrebna svojstva kontrole (naslov, poetni


direktorijum, filter za ekstenzije datoteka)
Kada pokrenemo dijalog za otvaranje datoteke,
uobiajeno je da u njemu vidimo samo datoteke sa odreenom ekstenzijom koju naa aplikacije prepoznaje. Obino se za svaki sluaj dodaje i opcija za prikaz svih datoteka
- filter *.* sigurno ste do sada u ovakvim dijalozima videli
opciju All files (sve datoteke).
Filter Open dijaloga se postavlja pomou istoimenog svojstva Filter. Ovo svojstvo je tipa string i zahteva
specifino formatiranje. Na primer, ako ovo svojstvo postavimo na:
Tekst datoteke|*.txt|Sve datoteke|*.*
napravili smo dva filtera. Prvi sa nazivom Tekst datoteke koji prikazuje sve datoteke sa ekstenzijom txt, i drugi
sa nazivom Sve datoteke koji prikazuje upravo to: sve
datoteke sa bilo kojom ekstenzijom.

3. Otvaranje dijaloga
Dijalog poseduje metodu ShowDialog koja kao
rezultat izvravanja vraa akciju korisnika u dijalogu. Ova
akcija predstavlja enumeraciju pod nazivom DialogResult.
Nama su od interesa samo dve opcije:
DialogResult.OK - korisnik je izabrao datoteku
DialogResult.Cancel - korisnik je zatvorio dialog (kliknuo
na Cancel dugme)

36

Proverom ove povratne vrednosti znamo da li je


datoteka izabrana i dalje nastavljamo rad sa njom.

Prikaz sadraja izabrane datoteke


Otvaranje dijaloga i izbor datoteke, naravno ne otvara niti prikazuje njen sadraj. Sledei korak je da zaista
prikaemo sadraj tekstualne datoteke.
Za otvaranje, itanje i pisanje po datotekama je
zaduen set klasa u imenovanom prostoru (eng. NameSpace) System.IO
Za itanje datoteka koristi se klasa StreamReader
kojoj se u konstruktoru zadaje putanja do datoteke. Tano
ono to ve imamo u FileName svojstvu dijaloga.
Metodom ReadToEnd StreamReader objekta ita se
kompletni sadraj zadate datoteke, i ova metoda vraa tip
string koji emo prikazati u kontroli TextBox.

Na formular postavite jedno dugme (Button kontrola) i uradite dupli klik miem na njega kako bi napisali par
linija kda.
private void button1_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
this.Text = openFileDialog1.FileName;
}
}

Zaustavite aplikaciju i na formular postavite TextBox


kontrolu u kojoj emo ispisati sadraj tekstualne datoteke.
Kontrola je inicijalno dobila ime (Name svojstvo) textBox1.
Postavite joj sledea svojstva na prikazane vrednosti:
Multiline: True
ScrollBars: Vertical

Pomou openFileDialog1.ShowDialog() otvaramo


dijalog i odmah proveravamo njegovu povratnu vrednost.
Ako je ona jednaka DialogResult.OK, znai da je korisnik
izabrao datoteku i kliknuo na dugme Open u dijalogu.
U tom sluaju u svojstvu FileName se nalazi ime
izabrane datoteke sa kompletnom putanjom. U naslov
formulara (this.Text) upisujemo putanju i ime izabrane
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

Formular sada treba da izgleda kao na sledeoj slici:

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 omoguiti korisniku da sadraj textBox1 kontrole snimi kao novu
datoteku.
Treba dodati jo jedno dugme (Button) na formular
u kome ete za Click dogaaj napisati sav potrebni kd.

Inicijalizujemo objekat sr tipa


System.IO.StreamReader i u konstruktoru postavljamo ime
datoteke koju je korisnik izabrao u dijalogu.
Metodom ReadToEnd() itamo kompletni sadraj
datoteke i postavljamo ga u Text svojstvo kontrole
textBox1.
Na kraju treba obavezno treba zatvoriti StreamReader objekat, to se radi metodom Close().

Ovog puta koristimo SaveFileDialog kontrolu. Svojstva i upotreba je identina kao u OpenFileDialog kontroli
koju smo koristili u primeru.
Klasa StreamWriter nam daje sve potrebne funkcionalnosti. U konstruktoru se takoe navodi puna putanja i
ime datoteke, ali sada je to datoteka koja ne postoji, ve e
je kreirati StreamWriter objekat.
Upis sadraja u datoteku se vri metodom Write
koja kao ulazni argument ima tekst koji treba da upie u
datoteku.
Takoe je potrebno na kraju zatvoriti StreamWriter
objekat pomou metode Close().

UPOZORENJE:
Ako StreamReader ne zatvorite metodom Close(),
datoteka koja se ita ostaje zakljuana (eng. Locked) tako
da ni jedna druga aplikacije ne moe da je otvori. Kae se
da StreamReader datoteku otvara u eksluzivnom reimu.
Meutim, ako regularno zatvorite svoju aplikaciju,
automatski se otkljuavaju sve otvorene datoteke.

38

Pokrenite Visual C# Express i kreirajte novu


Windows aplikaciju. Na inicijalnu formu postavite jedno
komandno dugme u uradite dupli klik. Kao to smo videli
ranije, automatski se otvara prozor za pisanje koda koji
obrauje Click dogaaj komandnog dugmeta.
Ovde emo namerno napraviti sintaksnu greku i
videti kako je ona prikazana u razvojnom okruenju. Otkucajte sledeu liniju koda:

Mala kola programiranja C# (11)


Greke u programiranju i obrada greaka
U februarskom broju asopisa i etvrtom nastavku
kole programiranja smo prvi put pomenuli i ukratko objasnili greke u C# programiranju. Sada je vreme da detaljnije obradimo ovu problematiku.
Greke u programiranju se dogaaju. Nije pitanje
da li e se u vaoj aplikaciji dogoditi greka, ve kada e se
ona dogoditi. Greke u radu programa su injenice koje
treba prihvatiti i na odgovarajui nain reagovati.
Teoretski govorei, postoje tri grupe greaka na
koje se nailazi u svakom programiranju:

private void button1_Click(object sender, EventArgs e)


{
MessageBox ("TEST");
}
Simulirali smo greku tako to smo izostavili metodu
Show, tako da bi ispravna linija trebala da glasi:

1. Sintaksne greke
Nastaju kada pogreite u sintaksi programskog jezika, korienju neke klase i slino. Ove greke nisu
opasne jer aplikacija koja ih sadri jednostavno ne moe
da se prevede (kompajlira), pa samim tim ni pokrene.

MessageBox.Show("TEST");
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
prijavljuje nikakve greke niti prestaje sa radom. Sve je u
redu, ali va program samo ne radi ono to treba da
radi. Vraa pogrene rezultate, ne upisuje podatke i tome
slino. Ovo su verovatno greke koje je najtee otkriti jer
su posledice loeg dizajna aplikacije.

Ako odgovorite potvrdno na ovo pitanje, bie pokrenuta predhodno uspeno kompajlirana verzija aplikacije
(ako postoji). Meutim ovo obino nema smisla, tako da
treba kliknuti na No, ime je obustavljeno pokretanje
aplikacije. Ako sada pogledate kod, primetiete da je problematina 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 automatsko ispravljanje gde god je to mogue.

39

Takoe pogledajte prozor Error list (lista greaka)


koji se inicijalno nalazi na dnu razvojnog okruenja.

U fazi testiranja aplikacije se upravo i otkrivaju takva


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 jezicima. Sintaksa je sledea:
try
{

U ovom prozoru se nalazi lista svih sintaksnih greaka kao i lista greaka koje se dogode u vreme izvravanja. Za svaku greku imamo opis, u kojoj datoteci se nalazi, broj linije i kolone, kao i naziv projekta.
Ako uradite dupli klik na greku u ovom prozoru,
automatski se otvara datoteka gde se ona nalazi, a kurzor
se pozicionira na problematinu liniju. Ostaje da ispravite
greku i ponovo pokrenete program.

// linije koda gde moe da nastane greka


}
catch (Exception e1)
{
// obrada greke
}
finally
{
// deo koji se uvek izvrava
}

2. Greke u vreme izvravanja (run-time errors)

Postoje tri bloka od kojih je poslednji (finally) opcion.

Greke koje ne moemo izbei i koje su rezultat


unosa korisnika, infrastrukture, mree i drugih raunarskih
resursa. Poetnici u programiranju obino ne shvataju ta
sve moe krenuti naopako, iako je program besprekorno
napisan.
Na primer, napisan je program koji ita podatke iz
baze podataka i prikazuje ih na formularu. Baza podataka
je na drugom raunaru u mrei. Ovde u praksi moe nastati mnogo problema gde direktni razlog nije sama aplikacija. Ako iz nekog razloga mrea nije dostupna zbog hardverskih problema (a njih zaista moe biti puno), aplikacije
e krahirati. Moda je mrea u redu, ali database server
nije pokrenut. Moda je u redu i mrea i database server,
ali je baza podataka oteena, ili ima previe korisnika, ili
je ba u tom momentu baza off-line jer administrator radi
svoj posao...
Dobili ste sliku.
Strogo govorei, svaka linija koda u programu moe
da generie greku. U praksi, neemo za svaku liniju postavljati obradu greaka, ve samo tamo gde postoji realna
verovatnoa da greka nastane.

U bloku try treba da se nalazi jedna ili vie linija


koda gde se mogu pojaviti greke u vreme izvravanja aplikacije.
U bloku catch se nalazi kod koji obrauje greke
(eng. error handler). Ako se na bilo kojoj liniji koda u try
bloku dogodi greka, tok programa se automatski preusmerava na prvu naredbu u catch bloku.
Ovde moete probati da ispravite greku, ili samo
informiete korisnika i prikaete mu poruku greke.
Moe postojati vie catch blokova koji hvataju razliite grupe greaka. Na primer, ako otvarate konekciju ka
bazi podataka, prvo bi mogli da uhvatimo probleme u mrei, zatim probleme sa bazom podataka i na kraju sve ostale
probleme. U ovom sluaju bi imali tri catch bloka. Zavisno
od tipa greke, kod se automatski preusmerava na odgovarajui catch blok.
Blok finally (ako postoji) se izvrava uvek, bez obzira
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 izvravanja koju nismo obradili try-catch blokom?

Cilj je da korisnik vaeg programa nikada ne dobije


ovakvu poruku o greci. Iako se u dijalogu nudi opcija da
se nastavi sa izvravanjem programa (dugme Continue) u
praksi nastavak rada programa posle greke obino dovodi
do daljnjih greaka i nema smisla.

Na formular dodajte jo jedno dugme i uradite


dupli klik na njega. Ovde emo napisati sintaksno ispravni
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)
{
int a = 10, b = 0, c;
c = a / b;
}

private void button2_Click(object sender, EventArgs e)


{
int a = 10, b = 0, c;
try
{
c = a / b;
}
catch
{
MessageBox.Show("GRESKA: deljenje
nulom");
}
}

Deklariemo tri varijable i nakon toga namerno pravimo greku deljenja sa nulom (b = 0). Pokrenite program
i kliknite na dugme. Kada se greka dogodi u programu
koji je pokrenut iz okruenja, on se zaustavlja i prikazuje
se problematina linija se opisom greke i predlozima
kako se greka moe ispraviti:

sa

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
program. Potom naite izvrnu verziju programa koja se
nalazi u direktorijumu \bin\Debug ispod direktorijuma gde
ste snimili projekat.
Poruka o greci je prikazana na sledeoj slici:

Ista poruka se dobija kada se pokrene izvrna verzija


aplikacije van radnog okruenja.
U sledeem nastavku emo detaljno obraditi
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 objanjene 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# aplikacija. 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
http://www.microsoft.com/downloads/details.aspx?
FamilyID=C6661372-8DBE-422B-8676C632D66C529C&displaylang=EN

U ovom primeru svaki kupac ima atribute (nazive moete


videti u zaglavlju tabele) CustomerID, CompanyName,
ContactName i tako dalje. Prilikom kreiranja strukture
tabele se zavisno od zahteva definiu ovi atributi slino
kao kada bi pripremali nekakav papirni upitnik.
Jedan red (eng. row) predstavlja kompletnu informaciju o
jednom kupcu.

Preuzimate datoteku Nwind.exe koja je samoraspakujua


arhiva i sadri bazu podataka Nwind.mdb (mdb je standardna 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.
Veina tabela u bazi je u meusobnim vezama (relacijama),
ali dalja rasprava prevazilazi temu ovog serijala.

Posle preuzimanja je pokrenite, odgovorite potvrdno na


sva pitanja i u dijalogu gde treba da unesete lokaciju na
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
realizovana pomou velikog broja gotovih klasa koje enkapsuliraju sve potrebne funkcionalnosti. Neka vas ne brine
predhodna reenica, jer sa tano etiri klase moemo obaviti gotovo sve to je potrebno.

Jako je bitno da se baza nalazi na ovoj lokaciji jer emo je


tako referencirati u svim narednim primerima.
Vrlo ukratko o bazi podataka
Glavni nosilac informacija u svakoj bazi podataka je tabela. Ona predstavlja dvodimenzionalnu matricu u kojoj su u
redovima poreane celovite informacije. Na primer tabela
u kojoj bi uvali informacije o kupcima (eng. Customers) bi
izgledala ovako:

Za poetak, (zlo)upotrebiemo mogunost Visual Studia da


bez i jedne linije koda postavimo vezu ka naoj bazi i prikaemo podatke iz bilo koje tabele u njoj.

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
dugme OK.

Uz pretpostavku da ste preuzeli bazu sa Interneta i


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 kliknuti na dugme Browse kako bi konano izabrali nau bazu
podataka. Na kraju dijalog izgleda kao na sledeoj slici.
Kliknite na dugme OK,ime smo zavrili definiciju veze ka

Kliknite na meni Data i potom izaberite stavku Add New


Data Source. Ovim smo pokrenuli Data Source Configuration arobnjak. Na prvom ekranu "Choose a Data
Source Type" izaberite DataBase i kliknite na dugme
Next.
2. U ovom dijalogu treba da dodate vezu (eng. Connection) 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 postavljen 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 tabelu 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 paljivo pratili korake trebalo bi da dobijete tabelu sa podacima iz baze:

Na kraju kliknite na dugme Finish ime smo zavrili konfiguraciju izvora podataka.
6. Sada nam ostaje da na formi prikaemo podatke iz izvora podataka koga smo definisali. Za ovo postoji vie naina jer gotovo svaka kontrola nudi mogunost ovakvog
prikaza. Kada su u pitanju tabele, najee se koristi kontrola 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 svojstvo 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 izaberite kao to je prikazano na sledeoj slici:

Probajte da skrolujete po visini i irini kako bi videli sve


podatke.
Kliknite na zaglavlje tabele. ta se deava? Oigledno puno
ugraenih gotovih funkcionalnosti koje ne treba runo programirati.

Primetiete da je radno okruenje automatski dodalo jo


neke objekte (vide se ispod forme), a takoe je
DataGridView kontrola dobila zaglavlje sa imenima atributa tabele Customers koju smo izabrali.

U sledeem nastavku emo prouiti objekte koji se u ovom


primeru koriste.

I to je sve (za sada).

44

uradimo bez ispravno formiranog primarnog kljua.

Mala kola programiranja C# (13)


Rad sa bazama podataka

Tehniki gledano tabela ne mora da ima primarni klju, ali


to zaista nikako nije dobra praksa.

Da bi mogli da napiemo bilo kakav program ili web sajt


koji pristupa bazi podataka neophodno je da upoznamo
jezik kojim se manipulie podacima baze podataka. U pitanju je jezik pod nazivom SQL (eng. Structured Query Language) odnosno struktuiranu jezik za zadavanje upita.
Ponegde se SQL akronim interpetira kao i "Standard Query
Language" odnosno standardni jezik za zadavanje upita.
Kako bilo, SQL jezik je standardni jezik koji je predstavljen
ranih 1970-tih i od tada je doiveo nekoliko standardizacija od kojih je poslednja bila 1999, a nakon nje jo nekoliko
revizija.

Ponekad ne postoji ni jedna kolona u tabeli koja je jedinstvena i moe da bude kandidat za primarni klju. U tom
sluaju se vetaki dodaje jo jedna kolona, najee
numerika, gde baza podataka sama upisuje brojeve u rastuem nizu. Ovakva kolona, zavisno od baze podataka, se
zove Autonumber, Identity i slino.
Tipovi podataka u tabeli
Zavisno od potreba, u svakoj koloni tabele se upisuju razliiti tipovi podataka. Da se ne bi previe udaljavali od teme
pomenuemo samo osnovne grupe:
Tekstualni podaci slue za slobodni unos alfanumerikog teksta
Celobrojni numeriki podaci unos celobrojnih
pozitivnih i negativnih vrednosti
Numeriki podaci sa pokretnim zarezom
Datumski podaci
Specijalni tipovi tekstualna polja velikog kapaciteta, slike, zvuk, geografski podaci i slino
Tip podatka u nekim sluajevima odreuje i sintaksu SQL
upita kao to emo videti u narednom tekstu.

Dobra stvar kod standardizacije SQL jezika je to jednom


nauen moe biti primenjen na bazama podataka razliitih
proizvoaa. Da ne bi sve bilo idealno, u praksi moete
raunati da predhodna tvrdnja nije potpuno tana, jer svaki proizvoa uvodi nove mogunosti koje manje ili vie
odstupaju od standarda.
Primarni klju tabele
U prolom nastavku je pomenuta tabela kao osnovni nosilac informacija. Osim ovoga svaka tabela poseduje jedan
vaan objekat primarni klju tabele (eng. Primary Key
ili skraeno PK). Primarni klju predstavlja jedna ili vie
kolona sa ciljem da se svaki red u tabeli jedinstveno identifikuje. Na primer, ako bi eleli da kreirate tabelu sa podacima studenata jednog fakulteta, najbolji kandidat za primarni klju je broj indeksa studenta. Ako bi za primarni
klju postavili ime i prezime, pogreili bi jer to nije jedinstvena vrednost.

Tipovi SQL upita


SQL upiti se po svojoj funkciji mogu podeliti na sledee
grupe:
DML (eng. Data Manipulation Language), jezik za
manipulaciju podataka. Ovu grupu emo detaljnije
prouiti jer se odnosi na pregled, dodavanje, izmenu
i brisanje podataka.
DDL (eng. Data Definition Language) pomou koga
se kreiraju, menjaju i briu objekti u bazi podataka.
Pomou njih moemo kreirati tabele, odrediti nazive
i tipove podatka, definisati primarni klju tabele i
slino.
DCL (eng. Data Control Language) jezik za kontrolu podataka pomou koga se odreuje koji korisnik
ta sme da radi sa podacima. Na primer, moete
odreenim korisnicima data pravo da samo pregledaju podatke, a nekim i da ih menjaju.

Ponekad jedna vrednost nije dovoljna za jedinstvenu identifikaciju reda tabele. Ako bi eleli da napravimo tabelu sa
podacima o studentima svih fakulteta u Srbiji, samo broj
indeksa ne bi bio dovoljan. Morali bi da dodamo grad i
naziv fakulteta. Ovako kreirani primarni klju koji se sastoji
od dve ili vie vrednosti (u naem primeru tri), se zove
kompozitni primarni klju.
Zato je primarni klju vaan?
Ako elimo da pogledamo podatke, izmenimo ili izbriemo
tano odreeni podatak to ne bi mogli precizno da
45

Na cilj je upoznavanje sa jezikom za manipulaciju podataka.

Ako bi eleli da prikaemo pomenute kolone iz tabele Customers, SELECT upit bi trebao da izgleda ovako:

Napomena:
Sledei primeri su saglasni sa osnovnim SQL standardom. To znai da e sintaksno gledajui, moi da se
primene na svakoj bazi podataka. Konkretne tabele i
podaci koji se ovde koriste se odnose na Microsoft Access
Northwind bazu podataka. U predhodnom nastavku je dat
Internet link sa koga moete preuzeti ovu bazu, ali za svaki sluaj jo jednom: http://www.microsoft.com/
downloads/details.aspx?FamilyID=C6661372-8DBE-422B8676-C632D66C529C&displaylang=EN

SELECT CustomerID, CompanyName, City


FROM Customers
(Nisu bitna velika i mala slova nepisano pravilo je da se
SQL naredbe piu velikim slovima)
Kada se pokrene ovakav upit, dobija se rezultat kao na slici:

Prikaz podataka
Prikaz podataka iz baze se dobija pomou SELECT naredbe. Osnova sintaksna struktura SELECT naredbe je veoma
jednostavna:
SELECT nazivi kolona
FROM naziv tabele
Nazivi kolona su razdvojeni zarezom, a posle FROM klauzule se upisuje ime tabele. Navedena imena kolona moraju postojati u tabeli, u suprotnom dobiemo poruku o greci.

Ako elite dobiti sve kolone iz tabele moete ih sve redom


navesti ali postoji i skraeni oblik upiite zvezdicu umesto
liste kolona:
SELECT *
FROM Customers

U Northwind bazi postoji tabela pod nazivom Customers


u kojoj se nalazi lista svih kupaca sa kolonama CustomerID (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 odreenom 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 koristiti 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 termina: vertikalni i horizontalni filter.
Vertikalni filter znai da ne prikazujemo sve kolone iz
tabele, ve samo one koje nam zaista trebaju. Na primer,
elite videti samo ifru i naziv kompanije i nikakve druge
podatke. Ovo se implementira jednostavno tako to u
SELECT listi navedete samo potrebna polja.

Ako na primer, elimo da prikaemo kupce iz Londona i


Berlina onda se radi o sloenom uslovu sa dva kriterijuma.
itajte ovako: prikai kupce koji su iz Londona ili Berlina
znai radi se o OR (eng. ili) operatoru.
SELECT CustomerID, CompanyName, City
FROM Customers
WHERE City = 'London' OR City = 'Berlin'

Horizontalni filter znai da ne elite da vidite sve slogove


(redove) iz tabele. Na primer, elite da vidite samo kupce
za zadati grad. Ovo se postie pomou WHERE naredbe u
kojoj se definie jedan ili vie kriterijuma koji moraju biti
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 meusobno povezuju OR i AND operatorima.

Rezultat upita:

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
OR zamenili sa operatorom AND, kakav bi rezultat dobili?
Odgovor: ne bi dobili ni jedan slog jer (logino) ni
jedan kupac ne moe istovremeno da bude i iz Londona i
iz Berlina :)

Sintaksa je jednostavna: posle WHERE klauzule se


navodi ime polja (City), zatim operator (=) i na kraju vrednost ('London'). Obratite panju da se vrednost London
nalazi izmeu jednostrukih znakova za navoenje. Poto
je polje City tekstualnog tipa, sintaksno, kriterijum mora
ovako da se pie. Ovo usvojite kao pravilo koje se potuje
u svim bazama podataka.

esto se u kombinuju WHERE i ORDER BY klauzula


koja slui za sortiranje i koju smo opisali u predhodnom
nastavku. U tom sluaju neophodno je ispotovati redosled
klauzula u SELECT upitu:
SELECT ...
FROM ...
WHERE ...
ORDER BY ...

Rezultat predhodnog upita:

48

Na primer:
SELECT ContactName, CustomerID, CompanyName, City
FROM Customers
WHERE City = 'London' OR City = 'Berlin'
ORDER BY ContactName

vidimo sve kupce iz gradova London, Berlin, Madrid i Pariz


kriterijum bi se skraeno napisao na sledei nain:
SELECT ContactName, CustomerID, CompanyName, City
FROM Customers
WHERE City IN ('London', 'Berlin', 'Madrid', 'Paris')

Rezultat upita:
Rezultat upita:

Moete kreirati proizvoljno sloene kriterijume korienjem vie OR i/ili AND operatora, ali vodite rauna o prioritetu: 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
sme da se stavlja u jednostruke znakove navoda. Na primer elimo videti sve proizvode ija je cena (polje UnitPrice) vea od 50 i da rezultat sortiramo po istom polju.

...
WHERE City = 'London' AND CustomerID = 'ALFKI' OR
Country = 'Italy'
Poto AND ima prioritet, uslov itamo na sledei nain:
...
WHERE (City = 'London' AND CustomerID = 'ALFKI') OR
Country = 'Italy'

SELECT ProductID, ProductName, UnitPrice


FROM Products
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 zadatom 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,
moe se koristiti IN operator. Na primer, ako elimo da

kriterijuma. Ako elimo da vidimo sve proizvode ije su


cene izmeu 50 i 100 (ukljuujui i ove vrednosti) regularno 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 bitno jer znaajno smanjuje optereenje servera baze podataka 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

malo komplikuju jer, istorijski gledano, postoji vie tehnologija od kojih je svaka donela svoj set drajvera. Da ne ulazimo previe u priu, OleDb je tehnologija koja se koristi za
pristup bazama kao to su Access, FoxPro, stari DBF i slini.
Takoe je mogue sa Web sajtova proizvoaa baza podataka preuzeti razliite tipove drajvera za njihov format. Na
primer Oracle i MySql omoguavaju besplatno preuzimanje
drajvera bilo u OleDb ili .NET tehnologiji. Odlina stvar kod
ovakvog koncepta je to se sistem rada sa bazama meusobno minimalno razlikuje. Uvek su u pitanju iste klase sa
istim ili slinim funkcionalnostima. U praksi ovo znai da
nije komplikovano napisati aplikaciju koja e podjednako
dobro raditi sa razliitim formatima baze podataka rezultat je proirena vrednost aplikacije jer, na primer, korisnik
moe izabrati koju bazu eli da koristi, a programer moe
da napie aplikaciju koja radi sa postojeom bazom i podacima.
Poto koristimo Access bazu podataka, treba koristiti
OleDb drajvere, odnosno klase u System.Data.OleDb imenovanom prostoru.

Mala kola programiranja C# (15)


Rad sa bazama podataka
U predhodnom nastavku smo se upoznali sa osnovama
SELECT naredbe SQL upita. Ovo nam daje dovoljnu osnovu da dalje nauimo kako napraviti aplikaciju koja bazi
podataka zadaje SELECT upit i prikazuje rezultat njegovog
izvravanja. Za primer emo koristiti ve pomenutu Nwind
bazu podataka u Microsoft Access formatu. Preduslov je
da na disku C: imate direktorijum baza i u njemu datoteku
Nwind.mdb. Ovo je vano, jer se prilikom obraanja bazi
referenciramo na njenu putanju u naem sluaju
C:\baza\nwind.mdb. Pripremite se za malo teorije koja
nam je neophodna kako bi u sledeem nastavku napravili
odgovarajui primer.
Imenovani prostori i upravljaki programi
Prilikom rada sa bazama podataka, C# i generalno .NET
radno okruenje nude veliki broj klasa koje su rasporeene u dva imenovana prostora (Eng: name spaces):
System.Data.SqlClient
System.Data.OleDb
Oba se nalaze hijerarhijski ispod System.Data prostora
imena. ablon "Windows Application" inicijalno ve ima
referencu na System.Data, tako da nema potrebe praviti
dodatne reference u projektu. Meutim, kao i do sada,
zgodno je iskoristiti using direktivu kako bi jednostavno
skratili pisanje prilikom kodiranja.
U imenovanom prostoru System.Data.SqlClient se nalazi
set klasa koja slui za rad sa bazom podataka Microsoft
SQL Server. Imenovani prostor System.Data.OleDb sadri
klase kojima se radi sa ostalim formatima baza podataka.
Termin koji treba razumeti je "drajver za bazu podataka".
Moemo napraviti poreenje sa drajverom (pogonskim
programom) za grafiku karticu raunara. Da bi kartica
radila u bilo kom operativnom sistemu, neophodno je
instalirati odgovarajui drajver. U pitanju je softver koji
predstavlja vezu izmeu operativnog sistema i fizikog
hardvera u raunaru.
Slino je i sa bazama podataka. Drajver za bazu podataka
omoguava sve funkcionalnosti za zadati format i na taj
nain (na sreu) skriva od programera kompleksnost prilikom rada sa razliitim formatima baza na tritu Ovo je
koncept koje se naziva enkapsulacija. Na dalje se stvari

Klase za rad sa bazama podataka


Govorili smo o dva imenovana prostora koji imaju isti set
klasa. Razlikuju se u prefiksu naziva. Na primer imamo
SqlConnection (System.Data.SqlClient) i OleDbConnection
(System.Data.OleDb imenovani prostor). Ovo imajte u vidu
jer u narednom tekstu radimo sa OleDb* objektima zbog
Access baze podataka.
Konekcija
U svakom sluaju, bez obzira ta radili sa bazom podataka,
neophodno je prvo napraviti vezu konekciju (Eng: Connection) ka njoj. Ovu funkcionalnost nam daje klasa OleDbConnection. Osnovno svojstvo ove klase koje i odreuje
parametre konekcije je svojstvo ConnectionString. Kao to
se iz imena da pretpostaviti svojstvo je tipa string. Setite se
nastavka #12 ovog serijala kada smo pomou arobnjaka
indirektno postavljali ovo svojstvo. Potrebno je podesiti
string tako da se sastoji od parova: naziv
parametra1=vrednost parametra1; naziv
parametra2=vrednost parametra2;... i tako redom. Oigledno, separator je znak ;
Parametri i njihovo znaenje je sledee:
51

Provider oznaava ime potrebnog drajvera baze podataka kako je registrovan u sistemu. Za Access bazu ime
drajvera je uvek Microsoft.Jet.OLEDB.4.0
Kada ovo sklopimo dobijamo:
"Provider= Microsoft.Jet.OLEDB.4.0;"

NAPOMENA

Data Source kada je Access baza u pitanju, ovaj parametar oznaava putanju i ime datoteke koja predstavlja
bazu. U naem sluaju baza se nalazi na putanji
C:\baza\Nwind.mdb
Sada ConnectionString izgleda ovako:
"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\baza\Nwind.mdb"
U osnovnoj varijanti ovo je dovoljno. Meutim, ako je baza
zatiena korisnikim imenom i ifrom, neophodno je i to
navesti. Na primer korisnik nae baze je Admin sa ifrom
123 (u praksi izbegavajte ovako "jake" ifre). Da bi ovo
postigli koristimo jo dva parametra: User id i Password
Finalna verzija stringa konekcije bi mogla da izgleda ovako:
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\baza\Nwind.mdb;User id=Admin;Password=123"

2. Kada postavljate ovo svojstvo OleDbConnection


objekta, treba voditi rauna o specifinosti rada sa stringovima u jeziku C#. Znak \ (obrnuta kosa crta) u stringu ima
specijalno znaenje takozvani Escape ili kontrolni karakter posle koga se oekuje najee specijalni znak za formatiranje. Zbog ovoga, ako na primer napiete:
Obj.ConnectionString =
"Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\baza\Nwind.mdb"
Odmah dobijate sintaksnu greku. Postoje dva reenja.
Moete napisati ispred stringa znak @ koji govori kompajleru da znak \ tretira kao i svaki drugi:
Obj.ConnectionString =
@"Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\baza\Nwind.mdb"

1. Strogo obratite panju na parametre Data Source


i User id. Morate ih pisati sa jednim razmakom izmeu
rei, u suprotnom dobijate poruku o greci.

Ili moete posle svakog znaka \ jednostavno dopisati jo


jedan:
Obj.ConnectionString =
"Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\\baza\\Nwind.mdb"
Oba naina su ispravna izaberite koji vam se vie svidja.

Kada smo postavili ConnectionString svojstvo potrebno je


eksplicitno otvoriti konekciju ka bazi. Za ovo se koristi jednostavna metoda Open() bez argumenata. U sluaju da je
baza iz nekog razloga nedostupna, oteena ili postoji
problem u mrei, metoda Open() e generisati greku u
vreme izvravanja.

3. Ako elite da u mrei vie korisnika pristupa istoj


Access bazi podataka, bazu je potrebno postaviti u deljeni
direktorijum na jednom raunaru. Sa ostalih raunara se
bazi pristupa tako to se za Data Source postavi puna
mrena putanja do datoteke. Na primer ako na raunaru
ije je mreno ime Server, u direktorijum Podaci smesti
baza Nwind.mdb i potom podeli (Eng: share) ovaj direktorijum, puna putanja do baze je:
\\Server\Podaci\Nwind.mdb a ConnectionString je:

Kada zavrimo posao, potrebno je zatvoriti konekciju sa


bazom. Ovo tehniki nije neophodno, ali obavezno to uradite kako bi sauvali resurse (broj istovremenih konekcija)
baza, mrea i na kraju korisnici vae aplikacije e vam
biti zahvalni ako potujete ovo pravilo.

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
Objekat pomou kojeg zadajemo SQL upit bazi podataka
je OleDbCommand. Komanda se uvek izvrava preko ve
definisane konekcije. Moe predstavljati razliite stvari
koje su izvan opsega ovog serijala. Mi emo se ograniiti
na jednostavno slanje osnovnih SQL upita i prikaza rezultata izvravanja.

Kada sve ovo uradimo kako treba, rezultat je DataSet


popunjen podacima koga koristimo za prikaz na ekranu ili
tampanje izvetaja.
itaocu koji se prvi put susree sa ovim objektima sve
verovatno izgleda (pre)komplikovano na prvi pogled.
Meutim kreatori ove tehnologije su imali u vidu mogunosti rada sa praktino svim postojeim formatima baza
podataka koji su trenutno na tritu ili vie nisu, ali su od
znaaja.

Svojstva komande i njihovo znaenje su sledee:


Svojstvo Connection definie po kojoj konekciji e komanda biti izvrena. Svojstvo je objektnog tipa i to OleDbConnection.

U sledeem nastavku emo ovu teoriju prevesti u praktini


primer i tada e sve doi na svoje mesto. Posle malo prakse
bie oigledno koliko je ovaj koncept fleksibilan i prilagodljiv u realnom radu.

Svojstvo CommandText je string tipa i pomou njega postavljamo 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 SelectCommand. Ovo svojstvo je tipa OleDbCommand.
Metoda koja popunjava DataSet podacima se zove Fill, a
njen ulazni argument je objekat tipa DataSet.
53

Svaki put kada elite da zadate SELECT upit bazi podataka


procedure je ista. Na sledeem dijagramu je prikazan redosled kreiranja objekta, njihove veze i kljuna svojstva svakog od njih:

Mala kola programiranja C# (16)


Rad sa bazama podataka
U prethodnom nastavku serijala smo se pozabavili teoretskim delom pristupa podacima pomou ADO.NET tehnologije. 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.

Osim poznatih kontrola (TextBox i Button) upoznaemo


jo jednu DataGridView. U pitanju je veoma mona
kontrola koja je sposobna da prikae sadraj tabele u
DataSet objektu. Da se podsetimo, DataSet objekat uva
jedan ili vie Table objekata u memoriji. Svaki Table objekat je matrica sastavljena od redova i kolona i uva rezultat jednog SELECT upita. U ovom primeru emo imati
samo jedan Table objekat u DataSet-u koji e uvati rezultat SELECT upita upisanog u TextBox kontrolu.
DataGridView kontrolu emo iskoristiti za prikaz sadraja
ove tabele.

Pokrenite Microsoft C# Express Edition, kreirajte nov projekat 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
ostavite inicijalno ime kontrole na button1
DataGridView postavite je tako da zauzima vei
deo forme. Takoe elimo da kontrola prati izmene
dimenzija forme to se postie postavljanjem
Anchor svojstva. Kontrolu treba privezati (eng.
Anchor) na sve etiri strane, ime se automatski
odrava isto rastojanje od ivica forme.

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
DataSet klase.

Klikom na dugme "Start" se izvrava sve, od postavljanja


konekcije do vezivanja podataka na DataGridView kontrolu.
Uradite dupli klik na dugme i pre nego to krenemo sa
pisanjem koda, zgodno je (ne i neophodno) dodati jednu
using direktivu kako bi sebi skratili pisanje. Na vrhu prozora za pisanje koda ete uoiti nekoliko postojeih using
direktiva, a potrebno je dodati jo jednu:

DataAdapter:
OleDbDataAdapter Da = new OleDbDataAdapter();
Da.SelectCommand = Komanda;
Instanciranje Da objekta na osnovu OleDbDataAdapter
klase.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;

Punjenje DataSet-a:
Da.Fill(Ds);
Koristimo Fill metodu OleDbDataAdapter klase za
"punjenje" DataSet-a.
Ove metoda zapravo pokree SelectCommand komandu,
koja dalje otvara konekciju i bazi prosleuje upit. Rezultat
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:
Konekcija:

Prikaz sadraja prve tabele DataSet-a u DataGridView1


kontroli:
DataGridView1.DataSource = Ds.Tables[0];

OleDbConnection Konekcija = new OleDbConnection();


Konekcija.ConnectionString =
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source =
C:\baza\Nwind.mdb";

Svojstvo DataSource, kao to moete pretpostaviti iz naziva, pokazuje koji je izvor podataka koje treba prikazati u
kontroli. U ovom primeru, izvor podataka je prvi (i jedina)
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();


Konekcija.ConnectionString
=
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\baza\Nwind.mdb";
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];

SELECT ProductName, UnitPrice FROM Products ORDER


BY ProductName
(Prikai naziv i cenu proizvoda iz tabele Products i sortiraj
po nazivu proizvoda).

Vreme je da pokrenemo primer. U textBox1 ukucajte sledei 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 tehnologijom 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

prikaemo u TextBox kontroli, to inimo preko njenog


svojstva Text. Ako u podacima imamo kolonu koja moe
imati samo vrednosti tano/netano (Eng. true/false) logino je koristiti CheckBox kontrolu i vezati podatke na njeno
svojstvo Checked.

Mala kola programiranja C# (17)


Data Binding
U ovom nastavku emo obraditi vezivanje sa podacima
(Eng. Data binding).
U prolom nastavku smo zapravo radili data binding kada
smo postavljali DataSource svojstvo kontrole
DataGridView. Slinu stvar moemo uraditi i sa gotovo
svakom kontrolom korisnikog interfejsa. Vezivanje podataka znai da se u nekoj kontroli automatski prikazuju
podaci iz baze, najee kao rezultat SELECT upita. Poto
SELECT upit moe da obuhvati podatke iz jedne ili vie
tabela, ovo predstavlja veoma elegantan nain za prikaz
podataka korisniku, uz minimum programiranja. Kontrole
se povezuju na potrebnu tabelu u okviru DataSet objekta.

Sintaksa za povezivanje svojstva kontrole sa kolonom tabele iz DataSet objekta je raznolika, ali najee se koristi sledea:
(predpostavka je da na formi imamo TextBox kontrolu u
kojoj elimo da prikaemo vrednost kolone
"CompanyName" iz ve napunjenog DataSet objekta)
TextBox1. DataBindings.Add ("Text", Ds.Tables[0],
"CompanyName");
U ovoj liniji koda za kontrolu TextBox1 dodajemo novo
vezivanje tako to za svojstvo Text iz prve tabele DataSet-a
pod nazivom Ds, vezujemo kolonu "CompanyName". Vodite rauna da ne vezujete dva ili vie puta podatke za isto
svojstvo kontrole jer ete tada dobiti poruku o greci.

Princip rada je identian kao to je demonstrirano u predhodnom primeru, uz dodatak par linija koda koje su odgovorne za povezivanje podataka. Postoje dve varijante koje
moemo koristiti i iji izbor zavisi od mogunosti same
kontrole. Neke kontrole su u stanju da tabelarno prikau
podatke, kao to je DataGridView. U ovom sluaju potrebno je podesiti samo DataSource svojstvo i to je sve. Ovaj
nain vezivanja se zove simple data binding.

Primer
Da bi ovo ilustrovali napraviemo jednostavan primer za
simple i complex data bindigs. Kao i ranije koristimo Microsoft Access bazu podataka. Pokrenite Microsoft C# 2005
Express Edition i kreirajte novi projekt tipa Windows
Application.

Neke druge kontrole kao to TextBox, Label i sline oigledno ne mogu prikazati redove i kolone podataka, ve
mogu da prikau samo vrednost odreene kolone (polja iz
tabele), odreenog sloga (reda u tabeli). Ovo nas dovodi
do pojma Current record (aktivni slog-zapis) ije vrednosti
kolone elimo da prikaemo u kontroli.

Sve to treba emo uraditi u Form_Load dogaaju kako bi


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
rada korisnik moe da vri navigaciju po slogovima i na taj
nain menja aktivni slog koji se prikazuje u ovako vezanim
kontrolama.

OleDbConnection
OleDbCommand
DataSet
OleDbDataAdapter

Svaka kontrola koja podrava vezivanje podataka poseduje


kolekciju DataBindings koja moe da sadri vie vezivanja
podataka za istu kontrolu, a u praksi se koristi najee
samo jedna. Vano je napomenuti da moemo odrediti na
koje svojstvo kontrole elimo da veemo vrednost kolone
aktivnog sloga. Na primer ako elimo da podatke

Za prikaz podataka koristiemo NWind.mdb bazu i sledee


kolone iz tabele Products:
ProductName (naziv proizvoda)
UnitPrice (cena proizvoda)
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 skratili 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;
Data Source=C:\baza\Nwind.mdb";
OleDbCommand Komanda = new OleDbCommand();
Komanda.Connection = Konekcija;
Komanda.CommandText =
"SELECT ProductName, UnitPrice, Discontinued
FROM Products
ORDER BY ProductName";
DataSet Ds = new DataSet();
OleDbDataAdapter Da = new OleDbDataAdapter();
Da.SelectCommand = Komanda;
Da.Fill(Ds);
}

Sada elimo da podatke prikaemo u DataGridView1 kontroli koja omoguava simple data binding.
U nastavku koda je dovoljno dopisati samo jednu liniju
koda:
dataGridView1.DataSource = Ds.Tables[0];
U dve TextBox kontrole elimo da prikaemo vrednosti
kolona "ProductName" i "UnitPrice". Ovo je complex data
binding. U nastavku upiite sledee dve linije koda:
textBox1.DataBindings.Add("Text", Ds.Tables[0],
"ProductName");
textBox2.DataBindings.Add("Text", Ds.Tables[0],
"UnitPrice");

Ovde smo pripremili teren za simple i complex povezivanje podataka.


Sada na formu treba postaviti elemente korisnikog interfejsa. Na formu postavite redom:

Na kraju elimo da vrednost kolone " Discontinued" prikaemo u CheckBox kontroli. Vrednosti u ovoj koloni mogu
biti samo true ili false, zbog ega smo i izabrali CheckBox
za njen prikaz. Dopiite jo jednu liniju koda:

Jednu DataGridView kontrolu


Dve Label kontrole
Dve TextBox kontrole
Jednu CheckBox kontrolu

checkBox1.DataBindings.Add("Checked", Ds.Tables[0],
"Discontinued");

Svojstva Text za Label i CheckBox kontrole postavite kao


to je prikazano na sledeoj slici:

Obratite panju da ovde ne vezujemo svojstvo "Text" ve


svojstvo "Checked".
58

Sada pokrenite primer. Ako ste sve ispravno upisali treba


da dobijete rezultat kao na sledeoj slici:

Za kraj ovog nastavka i serijala, pokuajte sledee:


Sama forma takoe poseduje DataBindings kolekciju. Ako
elimo da u naslovu forme prikaemo naziv proizvoda,
dovoljno je setiti se da referencu na formu predstavlja kljuna 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 ponovo pokrenete primer primetiete da su podaci ostali neizmenjeni. Sve izmene koje se na ovaj nain rade su lokalnog tipa, odnose se samo na DataSet objekat koji je u
memoriji raunara. Baza podataka se ne aurira automatski. Da bi ovo uradili neophodno je formirati Insert, Update i Delete komande to u ovom momentu prevazilazi
ambicije ovog poetnikog serijala.

59

You might also like