You are on page 1of 355

VISOKA KOLA STRUKOVNIH STUDIJA

ZA INFORMACIONE TEHNOLOGIJE




profesor strukovnih studija
dr Svetlana Aneli, dip. in. inf. sis.




PROGRAMERSKI ALATI

zbirka reenih zadataka









Beograd, 2014.
verzija 1


Sadr aj


Predgovor ___________________________________________________________________ 1
I Kreiranje WinFoms aplikacije u Visual Studio-u ____________________________________ 3
1. Kreiranje novog projekta ________________________________________________________ 3
2. Definisanje projekta kao WinForms ________________________________________________ 3
3. Izgled radne povrine ___________________________________________________________ 4
4. Otvaranje prozora za pisanje koda ________________________________________________ 6
5. Aktivacija dogaaja kontrola _____________________________________________________ 6
6. Dodavanje novih item-a u projekat ________________________________________________ 7
7. Build i run aplikacije ____________________________________________________________ 8
II WinForms kontrole __________________________________________________________ 9
1. Primeri za vebu _______________________________________________________________ 9
III Manipulacija sa bazom podataka ____________________________________________ 130
1. Povezivanje sa bazom podataka ________________________________________________ 130
2. Primeri za vebu _____________________________________________________________ 132
IV Zadaci sa kolokvijuma i ispita _______________________________________________ 206
1. Zadaci sa I kolokvijuma kolske 2012/2013. godine ___________________________________ 206
2. Zadaci sa II kolokvijuma kolske 2012/2013. godine __________________________________ 248
3. Zadaci sa I kolokvijuma kolske 2013/2014. godine ___________________________________ 279
4. Zadaci sa II kolokvijuma kolske 2013/2014. godine __________________________________ 303
5. Integralni ispit septembarski ispitni rok 2013. god __________________________________ 325
6. Integralni ispit oktobarski ispitni rok 2013. god _____________________________________ 332
7. Integralni ispit januarski ispitni rok 2014. god ______________________________________ 340
Prilog _____________________________________________________________________ 347
1. Kreiranje backup-a baze i restore baze _____________________________________________ 347
2. Kreiranje script-a baze i njeno startovanje __________________________________________ 348
3. Podeavanje kompatibilnosti baze sa prethodnim verzijama SQL Server-a ________________ 352
Literatura _________________________________________________________________ 353
1

Predgovor

Zbirka je prvenstveno namenjena studentima II godine Visoke kole strukovnih studija za
informacione tehnologije koji sluaju predmet Programerski alati, ali i svima onima koji ele
da proire svoje znanje iz programiranja, savladavanjem osnovnih i naprednih tehnika
programiranja windows forms aplikacija. Moe se slobodno rei da je u velikoj meri
jedinstvena kako u naoj zemlji, tako i ire, s obzirom da ne postoje (ili su vrlo retke) zbirke
koje se bave vizuelnim programiranjem, te je ovo ujedno i pilot projekta iz ove oblasti.
Nastala je kao rezultat dugogodinjeg pedagokog rada sa studentima. Obuhvata preko 70
reenih zadataka koji su raeni na predavanjima i vebama na predmetu Programerski alati
na ITS-u, kao i zadatke sa kolokvijuma i ispita tokom prethodne dve kolske godine.
Prikazana reenja nisu jedina mogua, postoje i druga reenja koja su moda i elegantnija i
optimalnija. Prilikom reavanja zadataka autor se vodio idejom da reenja budu to
razumljivija veem broju italaca, tj. to laka za shvatanje, a to ponekad znai pisanje i
vie linija koda. U veini zadataka u samom reenju, u vidu komentara, je dato i kratko
objanjenje pojednih delova koda.
Cilj objavljivanja ove zbirke je lake savladavanje nastavne materije iz ovog predmeta, koji
je dosta sloene jer je i sama oblast tj. gradivo dosta sloeno. Preporuka je da se pre izrade
samih zadataka italac upozna i savlada teorijski deo koji se obrauje na nastavi. Zadaci su
razliite sloenosti, od jednostavnih primera do kompleksnih problema koji sadre
integraciju vie klasa, formi, njihovih kontrola, metoda i dogaaja. Svi zadaci su tematski
smisleni, odnosno predstavljaju mini aplikacije koje simuliraju pojedine delove realnih
sistema, to je u skladu sa problemski orijentisanim nainom izvoenja nastave na ITS-u.
Zbirka je koncipirana je u etiri osnovna poglavlja, kako bi je italac lake koristio.
Prvo poglavlje pod nazivom Kreiranje WinForms aplikacije u Visual Studio, ba kao to mu i
ime govori, obuhvata opis samog okruenja za rad, kao i postuapk kreiranja, bildovanja i
startovanja projekta kao windows desktop aplikacije.
Sledee poglavlje, WinForms kontrole, obuhvata zadatke u kojima su one obraene. Ima
dosta manje sloenih primera, ali i primera u kojima se na jednoj formi nalazi vie razliitih
kontrola. Za svaku kontrolu su prikazani neki od najznaajnijih njenih dogaaja. U okviru
ovog poglavlja obraene su i generike kolekcije, koje se u praksi esto koriste. Jedan broj
zadataka se bavi manipulacijom sa fajlovim i folderima, potom rad sa ulazno/izlaznim
tokovima podataka, modalnim i nemodalnim dijalozima, standardnim windows dijalozima,
slanje mejla putem WinForms obrazaca. U nekim zadacima se zahteva kreiranje vie formi,
prelazak sa jedne na drugu, kao i prenos parametara sa forme na formu.
2

Tree poglavlje se odnosi na Manipulaciju sa bazom podataka, odnosno izradu zadataka
koja zahteva rad sa podacima iz baze podataka. Ovde se pod pojmom manipulacija
podrazumeva itanje podataka iz baze (razliite vrste select upita), ubacivanje u bazu
(insert upiti), auriranje podataka (update upiti), brisanje podataka iz baze (delate upiti),
kao i manipulacija sa povezanim tabelama (inner join). Koriene su baze kreirane u MS
SQL Server Management Studio okruenju, s tim da je u par primera kreirana lokalno baza
direktno u MS Visual Studio. Na poetku ovog poglavlja je objanen nain povezivanja
projekta sa bazom, odnosno dodavanje novog DataSource objekta. Obraeni su zadaci koji
pristupaju podacima u konektovanom i diskonektovanom scenariju, kao i WinForms kontrole
za rad sa bazama. Neki zadaci koriste razliite wizard-e, dok se u nekima sve radi iskljuivo
preko C# koda.
Poslednje poglavlje, Zadaci sa kolokvijuma i ispita, obauhvataju primere sa I i II
kolokvijuma i ispita u dve prethodne kolske godine. Zadaci sa I kolkvijuma obuhvataju
gradivo iz skoro itavog drugog poglavlja zbirke osim MenuStrip i ContextMenuStrip
kontrola koje dolaze na II kolokvijumu. Osim njih dve na II kolokvijumu zadaci
obuhvataju i itavo tree poglavlje, manipulaciju sa bazom. Zadaci sa kolokvijuma su tako
bili koncipirani u pomenute dve kolske godine. Ovo nije pravilo i ne treba ga tako shvatati.
Naime, koje oblasti dolaze za koji kolokvijum ostaje na nastavniku da odredi pred sam
termin kolokvijuma i o tome na nastavi obavesti studente. Zadaci sa integralnog ispita
obuhvataju miks celokupnog gradiva i od studenta se zahteva da logiki kombinuje steeno
znanje iz ove oblasti. Neka od prikazanih reenja zadataka iz ovog poglavlja su ba ona koje
su sami studenti napisali na polaganju kolokvijuma i ispita. Data su u cilju da se uvidi
slinost i razlika sa nainom na koji je autor reavao zadatke iz druga dva poglavlja zbirke.
Na kraju ponovo napominjem da je osnovni cilj nastave iz Programerskih alata praktian rad
kroz konkretne primere. Nakon realizacije projekta neophodno ga je prebaciti i na neki
drugi raunar, to podrazumeva i prenos odgovarajue baze podataka. Iz tog razloga u
okviru Priloga, je objanjeno kako se kreira backup i restore baze, kako se kreira script baze
i kako se on startuje, potom podeavanje kompatibilnosti baze sa prethodnim verzijama
SQL Server-a, kao i itanje imena SQL Server-a.
Zbirka je u potpunosti usklaena je sa samim ciljem predmeta - produbljivanje znanja iz
programiranja kroz izuavanje programerskih alata koji omoguavaju kreiranje WinForms
aplikacija, kao i osposobljavanje studenata za samostalan rad u realnom okruenju,
odnosno sa konkretnim zahtevima od strane klijenata.
U cilju poboljanja kvalteta zbirke molim sve dobronamerne itaoce da ukoliko uvide neki
sluajni propust u tekstu upute autoru mejl, kako bi se isti ispravio u narednim izdanjima.
A u t o r
3

I Kreiranje WinFoms aplikacije u
Visual Studio-u

1. Kreiranje novog projekta
Startovati MS Visual Studio. Izbabrati opciju File/New/Project (Slika 1.1).

Slika 1.1. Izgled osnovnog prozora u MS Visual Studio okruenju
2. Definisanje projekta kao WinForms
Da bi se kreirao projekat potrebno je izabrati i tip aplikacije koja e se razvijati. Sa leve
strane (Slika 1.2) se nalaze kategorije, dok se u centarlonm delu, u zavisnosti od izabrane
kategorije, prikazuju tipovi aplikacija. WinForms aplikacije spadaju u grupu Windows
desktop aplikacija, pa u levom delu treba tu kategoriju i selektovati, a u centralnom delu
izabrati opciju Windows Forms Application.
U donjem delu se definie naziv projekta (polje Name), kao i lokacija (Browse). Solution
Name je podrazumevano identian nazivu projekta, ali je mogue definisati i neki drugi
naziv. To je naziv koji e se videti u Solution Explorer-u (Slika 1.3).
4


Slika 1.2. Izbor tipa projekta
3. Izgled radne povrine
Na slici 1.3 je prikazan izgled radne porine. Sa leve strane se nalati paleta sa kontrolama
(Toolbox), koji je radi lakeg pregleda podeljen po kategorijama. Centralni deo se sastoji iz
dva dela. Gornji deo slui za preged i manipulaciju u Design modu (fiziki izgled formi) ili
implementaciju klasa, dogaaja, metoda, direktnim kucanjem C# koda (ekstenzija .cs).
U donjem delu se vidi spisak greaka i upozorenja (Error List) i izlaznih vrednosti (Output).
Error List je bitan deo jer sadri spisak svih sintaksnih greaka obeleenih crvenim kuiem
sa belim znakom putae (x) u sredini. Svaka stavka u toj listi (Errors) sadri tanu lokaciju
gde se nalazi u kodu (redni broj linije koda), kao i opis same greke. Dokle god kod sadri
neku od Error-a nee moi da se startuje (tj. moi e da se startuje sa prikazom prozora u
kome obavetava korisnika da postoje greke i da aplikacija nee validno raditi). U ovom
delu se prikazuje i spisak upozorenja (Warnings) koja upuuju na mogue greke u run time
modu (u toku samog izvravanja programa). Na primer, moe doi do deljenja sa nulom, ili
da je mogue da neka promenljiva nije inicijalizovana, Aplikacija moe da se validno
startuje ako ima upozorenja, s tim da su ona sigurno obezbeena u samom C# kodu od
strane programera.

5


Slika 1.3. Osnovna radna povrina
Desni deo radne povrine (Slika 1.3) je podeljen na dva dela. U gornjem delu je prikazan
Solution Explorer koji sadri prikaz logike organizacije projekta (spisak fajlova i foldera
prikazanih u vidu stabla). Kao to se na pomenutoj slici vidi svaka forma ima ekstenziju .cs i
sadri tri fajla:
sa ekstenzijom .Designer.cs - koji se automatski menja, tj. ubacuje mu
se odgovarajui C# kod (npr. kad se prevue kontrola iz Toolbox-a na formu ili kada
se podese svojstva kontrole pomou Properties prozora)
sa ekstenzijom .resx da dodatavnje dodatnih resursa
klasa - koja sadri izgled (opis) same klase (polja i metode)
Donji desni deo radne povrine (Slika 1.3) sadri prikaz Properties prozora koji omoguava
runo podeavanje osobina i dogaaja kontrola sa forme. U zavisnosti koja kontrola je na
formi selektovana taj prozor se menja, jer razliite kontrole imaju razliite osobine i
dogaaje. Za sve to se ovde podesi automatski se generie odgovarajui kod koji se
smeta u fajl sa ekstenzijom .Designer.cs za odgovarajuu formu.

Okvir sa
kontrolama
Izgled forme
Pregled
organizacije
projekta
Lista greaka i
upozorenja
Podeavanje
osobina i dogaaja
kontrola
osobine
dogaaji
6

4. Otvaranje prozora za pisanje koda
Kao to je ranije napomenuto neki delovi koda se automatski generiu i to je najee deo
vezan za fiziki izgled forme i kontrola. Ali samu ivost aplikaciji daju dogaaji (akcije)
koje se izvravaju kada korisnik inicira neku akciju (klik miem, izbor radio button-a,
selekcija stavke u padajuoj listi, ). Sve ovo programer mora iskodirati direktnim
kucanjem C# koda.
Kako bi se otvario prozor za pisanje koda potrebno je u Solution Explorer-u desnim klikom
mia kliknuti na formu za koju se eli pisati kod (npr. Form1.cs) i izabrati opciju View Code.
Pri emu se otvara prozor slian ovom koji je prikazan na slici 1.4.

Slika 1.4. Prozor za pisanje koda
Na pomenutoj slici je prikazan default-ni kod koji je automatski generisan u fajlu Form1.cs.
5. Aktivacija dogaaja kontrola
Kako bi se oivela kontrola neophodno je inicirati eljeni dogaaj za nju. Ovo se postie
sledeim postupkom. Na formi (u Design-u) selektovati kontrolu za koju se eli aktivirati
dogaaj. Potom sa desne strane u Properties prozoru prebaciti se na dogaaje (klik na znak
munje ) i na kraju izabrati odgovarajui dogaaj iz spiska dostupnih dogaaja za tu
kontrolu. Slika 1.5 prikazuje aktivaciju dogaaja Click za Button kontrolu.
Dupli klik na naziv izabranog dogaaja otvara se prozor za pisanje koda uz generisano
zaglavlje dogaaja koji se implementira (Slika 1.6).


7


Slika 1.5. Aktivacija dogaaja Slika 1.6. Automatski generisano zaglavlje dogaaja
Na slici 1.7 je prikazan deo koda koji omoguava prikaz poruke u Message Box-u (slika 1.8)
kada se klinkne na Button (odnosno kada se u run-time inicira dogaaj Click za kontrolu
Button). Telo dogaaja (tj. metode koja se poziva kada se inicira dogaaj) programer kuca
sam.

Slika 1.7. Implementacija dogaaja Slika 1.8. Izlazni prozor
6. Dodavanje novih item-a u projekat
Jedan projekat moe sadrati vie item-a, tj. foldera i fajlova, najee su to klase i forme
(kod WinForms aplikacija).
Dodavanje forme je jednostavno, desni klik mia na naziv projekta u Solution Explorer-u i
opcija Add/Windows Forms. Slino je i dodavanje klase, desni klik mia na naziv projekta u
Solution Explorer-u i opcija Add/Class.
Analogno se dodaje item bilo kog tipa, desni klik mia na naziv projekta u Solution Explorer-
u i opcija Add/New Item, pri emu se prikazuje prozor sa slike 1.9.

8


Slika 1.9. Dodavanje novog item-a
7. Build i run aplikacije
Build-ovanje aplikacije (kompajliranje, tj. prevoenje koda) se vri izborom opcije
Bulid/Build Solution ili klik na funkcijski taster F6, omoguava pokretanje kompajlera.
Rezultati kompajliranja se vide na donjoj liniji okvira prozora. Ukoliko je kod napisan bez
greaka dobija se poruka Build Succeeded, a ukoliko greke postoje u delu prozora za Error
List (donji deo centralonog prozora) se prikazuje opis greke. Sinteksne greke se mogu
uoiti i ranije, jer su podvuene crvenom linijom u kodu.
Kada se uklone sve greke iz Error List aplikacija se moe pokrenuti tj. startovati.
Startovanje se moe izvriti bez pokretanja dibagera (padajua lista Debug/Start Without
Debugging ili Ctrl+F5) ili sa njim (padajua lista Debug/ Debugging ili F5).







9

II WinForms kontrole
1. Primeri za vebu
Zadatak 2.1. Windows kontrole: Label, LinkLabel, Button, TextBox
Kreirati WinForms aplikaciju pod nazivom WFA_Student 1. Kreirati formu kao na slici 2.1 i
podesiti kontrole kao to je prikazano u tabeli 2.1.

Slika 2.1. Design prozor forme za Zadatak 2.1
Tabela 2.1. Svojstva i dogaaji kontrola za Zadatak 2.1
Kontrola/Svojstva Name Text
Dodatna svojstva i
dogaaji
Label Label1 Ime i prezime:
Label Label2 Adresa:
Label Label3 Smer:
Label Label4 Starost:
Label Label5 Izlaz:
TextBox txtIme
TextBox txtAdresa
TextBox txtSmer
TextBox txtStarost
TextBox txtIzlaz Svojstvo ReadOnly=True
Button btnOK &OK Dogaaj Click
Button btnIzlaz &Izlaz Dogaaj Click
LinkLabel linkLabel1 Vidi skolu Dogaaj LinkClicked

10

Za svojstvo Image LinkLabel kontrole kliknuti na tri takice pri emu se prikazuje prozor za
izbor lokacije slike koja e biti prikazana ispod teksta ove kontrole (Slika 2.2). Klikom na
dugme Import otvara se standardni prozor za Browse.

Slika 2.2. Izbor lokacije slike (svojstvo Image)
Zahtevane funkcionalnosti aplikacije:
Obezbediti da se klikom na dugme OK, u txtIzlaz ispisuje tekst koji je unseen u
gornja tekst polja (videti sliku 2.3).

Slika 2.3. Izlazni ekran za Zadatak 2.1
Klikom na dugme Izlaz aplikacija se zatvara.
Klikom na link (vidi sliku 2.3) otvara se sajt kole (www.its.edu.rs).

11

Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WFA_Student_1
{
public partial class Student : Form
{
// podrazumevani konstruktor
public Student()
{
InitializeComponent();
}

// dogadjaj Clik dugmeta btnIzlaz
private void btnIzlaz_Click(object sender, EventArgs e)
{
this.Close(); // zatvara prozor

//Application.Exit(); // zatvara aplikaciju
}

// dogadjaj Clik dugmeta btnOK
// cita tekst iz TextBox (odnosno svojstvo Text) kontrola za
// ime, adresu, smer i starost
// i upisuje u TextBox kontrolu koja se zove txtIzlaz
private void btnOK_Click(object sender, EventArgs e)
{
this.txtIzlaz.Text = "Ime i prezime: " + this.txtIme.Text +
"\r\nAdresa: " + this.txtAdresa.Text + "\r\nSmer: " + this.txtSmer.Text +
"\r\nStarost: " + this.txtStarost.Text;
}

// dogadjaj LinkCliked link dugmeta linkLabel1
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
// Obelezava se posecenost
this.linkLabel1.LinkVisited = true;

// ide na navedenu adresu
System.Diagnostics.Process.Start("http://www.its.edu.rs");
}
}
}




12

Zadatak 2.2. Windows kontrole: Button, RichTextBox
Kreirati fajl proba.rtf (prazan WordPad dokument) na lokaciji C:\Temp. Kreirati WinForms
aplikaciju pod nazivom RichTextBox. Kreirati formu kao na slici 2.4 i podesiti kontrole kao
to je prikazano u tabeli 2.2.

Slika 2.4. Design prozor forme za Zadatak 2.2
Tabela 2.2. Svojstva i dogaaji kontrola za Zadatak 2.2
Kontrola/Svojstva Name Text
Dodatna svojstva i
dogaaji
RichTextBox rtbSadrzaj
Button btnSacuvaj &Sacuvaj Dogaaj Click
Button btnUcitaj &Ucitaj Dogaaj Click
Button btnIsprazni &Isprazni Dogaaj Click

Zahtevane funkcionalnosti aplikacije:
Tekst koji se kuca RichTextBox obojiti zelenom bojom, a njegovu pozadinu
crvenom bojom (Slika 2.5).
Obezbediti da se klikom na dugme Sacuvaj uneti tekst u RichTextBox upie u fajl
C:\Temp\proba.rtf i korisniku prikazati MessageBox sa slike 2.6.
Klikom na dugme Ucitaj se uitava tekst iz fajla C:\Temp\proba.rtf u RichTextBox.
Klikom na dugme Isprazni se prazni sadraj kontrole RichTextBox.

13


Slika 2.5. Unos teksta u RichTextBox kontrolu Slika 2.6. MessageBox
Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace RichTextBox
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void btnSacuvaj_Click(object sender, EventArgs e)
{
// promena boje pozadine selektovanog teksta
rtbSadrzaj.SelectionBackColor = Color.Red;

// promena boje slova selektovanog teksta
rtbSadrzaj.SelectionColor = Color.Green;

// promena selektovanog teksta u bold
rtbSadrzaj.SelectionFont = new Font(rtbSadrzaj.Font.FontFamily,
rtbSadrzaj.Font.Size, FontStyle.Bold);

// mora da postoji direktorijum sa navedenim fajlom
rtbSadrzaj.SaveFile(@"C:\Temp\proba.rtf", RichTextBoxStreamType.RichText);
MessageBox.Show("Tekst sacuvan");
}

private void btnUcitaj_Click(object sender, EventArgs e)
{
rtbSadrzaj.LoadFile(@"C:\Temp\proba.rtf", RichTextBoxStreamType.RichText);
}

private void btnIsprazni_Click(object sender, EventArgs e)
{
rtbSadrzaj.Clear();
}
}
}
14

Zadatak 2.3. Windows kontrole: Button, RichTextBox, CheckBox
Kreirati WinForms aplikaciju pod nazivom CheckBox. Kreirati formu kao na slici 2.7 i
podesiti kontrole kao to je prikazano u tabeli 2.3.

Slika 2.7. Design prozor forme za Zadatak 2.3
Tabela 2.3. Svojstva i dogaaji kontrola za Zadatak 2.3
Kontrola/Svojstva Name Text
Dodatna svojstva i
dogaaji
RichTextBox rtbPorudzbina
CheckBox cbDorucak dorucak
CheckBox cbRucak rucak
CheckBox cbVecera vecera
CheckBox cbSakrij Sakrij porudzbinu
Button btnPosalji &Posalji Dogaaj Click

Zahtevane funkcionalnosti aplikacije:
Obezbediti da se klikom na dugme Posalji upisuje u RichTextBox odabrani meni tj.
selektovane CheckBox-ove (videti sliku 2.8.).
ekiranjem CheckBox kontrole Sakrij porudzbinu, sakriva se RichTextBox
kontrola (slika 2.9.), a njenim anekiranjem se ponovo prikazuje RichTextBox.

Slika 2.8. Unos teksta u RichTextBox kontrolu Slika 2.9. MessageBox
15

Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CheckBox
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void btnPosalji_Click(object sender, EventArgs e)
{
rtbPorudzbina.Clear();

rtbPorudzbina.AppendText("Odabrali ste :\n");

if (cbDorucak.Checked)
rtbPorudzbina.AppendText("dorucak\n");
if (cbRucak.Checked)
rtbPorudzbina.AppendText("rucak\n");
if (cbVecera.Checked)
rtbPorudzbina.AppendText("vecera");
}

private void cbSakrij_CheckedChanged(object sender, EventArgs e)
{
if (cbSakrij.Checked)
{
rtbPorudzbina.Visible = false;
}
else
{
rtbPorudzbina.Visible = true;
}
}
}
}




16

Zadatak 2.4. Windows kontrole: RadioButton, TextBox, GroupBox
Kreirati WinForms aplikaciju pod nazivom RadioBox. Kreirati formu kao na slici 2.10 i
podesiti kontrole kao to je prikazano u tabeli 2.4.

Slika 2.10. Design prozor forme za Zadatak 2.4
Tabela 2.4. Svojstva i dogaaji kontrola za Zadatak 2.4
Kontrola/Svojstva Name Text
Dodatna svojstva i
dogaaji
GroupBox groupBox1 Odaberite tip prevoza
RadioButton rbAvion Avion Dogaaj CheckedChanged
RadioButton rbAutobus Autobus Dogaaj CheckedChanged
RadioButton rbSopstveni Sopstveni prevoz Dogaaj CheckedChanged
TextBox tbIzbor

Zahtevane funkcionalnosti aplikacije:
Prilikom pokretanja aplikacije avionski prevoz je selektovan i u TextBox-u je ispisan
tekst kao na slici 2.11.
Obezbediti da izborom nekog tipa prevoza (RadioButton-a) automatski ispisuje
njegov tekst u TextBox polje (videti sliku 2.12).

Slika 2.11. Poetni prozor aplikacije Slika 2.12. Prozor prilikom izbora tipa prevoza

17

Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace RadioButton
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
tbIzbor.Text = "Odabrali ste avionski prevoz";
}

private void rbAvion_CheckedChanged(object sender, EventArgs e)
{
tbIzbor.Text = "Odabrali ste avionski prevoz";
}

private void rbAutobus_CheckedChanged(object sender, EventArgs e)
{
tbIzbor.Text = "Odabrali ste autobuski prevoz";
}

private void rbSopstveni_CheckedChanged(object sender, EventArgs e)
{
tbIzbor.Text = "Odabrali ste sopstveni prevoz";
}
}
}


18

Zadatak 2.5. Rad sa modalnim i nemodalnim formama
Kreirati WinForms aplikaciju pod nazivom Modalni_Nemodalni. Kreirati formu frmPocetna
kao na slici 2.13 i podesiti kontrole kao to je prikazano u tabeli 2.5.

Slika 2.13. Design prozor forme frmPocetna za Zadatak 2.5
Tabela 2.5. Svojstva i dogaaji kontrola forme frmPocetna za Zadatak 2.5
Kontrola/Svojstva Name Text
Dodatna svojstva i
dogaaji
Label label1 Ovo je pocetna forma
Svojstvo
ForeColor=Red
Button btnNemodalna
Idi na Nemodalnu
formu
Dogaaj Click
Button btnModalna Idi na Modalnu formu Dogaaj Click

Dodati jo dve Windows Form-e u projekat i nazvati ih frmNemodalna i frmModalna. Na
svakoj dodati po jednu labelu i jedno dugme. Podesiti labele tako da ispisuju tekst kao na
slikama 2.14 i 2.15, a za Button (Name: btnZatvori, Text: Zatvori, dogaaj Click).

Slika 2.14. Design prozor frmNemodalna Slika 2.15. Design prozor frmModalna
Zahtevane funkcionalnosti aplikacije:
Obezbediti da klikom na dugme Idi na Nemodalnu formu otvara frmNemodalna, a
klikom na dugme Idi na Modalnu formu otvara frmModalna.
19

Obezbediti da se klikom dugme Zatvori (na frmNemodalna i frmModalna) zatvara
otvoreni prozor.
Reenje:
// frmPocetna.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Modalni_Nemodalni
{
public partial class frmPocetna : Form
{
public frmPocetna()
{
InitializeComponent();
}

// otvaranje nemodalne forme
private void btnNemodalna_Click(object sender, EventArgs e)
{
frmNemodalna frm = new frmNemodalna();
frm.Show();
}

// otvaranje modalne forme
private void btnModalna_Click(object sender, EventArgs e)
{
frmModalna frm = new frmModalna();
frm.ShowDialog();
frm.Dispose();
}
}
}

// frmNemodalna.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Modalni_Nemodalni
{
public partial class frmNemodalna : Form
{
public frmNemodalna()
{
InitializeComponent();
}

20

private void btnZatvori_Click(object sender, EventArgs e)
{
this.Close();
}
}

// frmModalna.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Modalni_Nemodalni
{
public partial class frmModalna : Form
{
public frmModalna()
{
InitializeComponent();
}

private void btnZatvori_Click(object sender, EventArgs e)
{
this.Close();
}
}
}


21

Zadatak 2.6. Prenos podataka sa forme na formu u okviru istog projekta
Kreirati WinForms aplikaciju pod nazivom Prenos podataka.
Kreirati formu frmPocetna kao na slici 2.16 i podesiti kontrole prema tabeli 2.6.

Slika 2.16. Design prozor forme frmPocetna za Zadatak 2.6
Tabela 2.6. Svojstva i dogaaji kontrola frmPocetna za Zadatak 2.6
Kontrola/Svojstva Name Text
Dodatna svojstva i
dogaaji
Form frmPocetna Prenos podataka - pocetna
TextBox tbPocetna
Button btnNovaForma &Otvori novu formu Dogaaj Click

Kreirati formu frmNova kao na slici 2.17 i podesiti kontrole kao to je prikazano u tabeli 2.7.

Slika 2.17. Design prozor forme frmNova za Zadatak 2.6
Tabela 2.7. Svojstva i dogaaji kontrola frmNova za Zadatak 2.6
Kontrola/Svojstva Name Text
Dodatna svojstva i
dogaaji
Form frmNova Prenos podataka - nova
Dogaaji:
Load i FormClosing
TextBox tbPodatakNova
Button btnOK &OK
Button btnCancel &Cancel


22

Zahtevane funkcionalnosti aplikacije:
Klikom na dugme Otvori novu formu otvara se frmNova, pri emu se uneeni tekst
u TextBox kontrolu (tbPocetna na formi frmPocetna) se upisuje i u TextBox kontrolu
tbPodatakNova forme frmNova (Slika 2.18.)

Slika 2.18. Prenos podataka sa forme frmPocetna na formu frmNova
Obezbediti da se klikom na dugme OK forme frmNova zatvara forma frmNova i
upisuje tekst iz tbPodatakNova (forme frmNova) u tbPocetna forme frmPocetna
(videti sliku 2.19).


Slika 2.19. Prenos podataka sa forme frmNova na formu frmPocetna
Klikom na dugme Cancel forme frmNova zatvara se forma frmNova i u tbPocetna
forme frmPocetna se upisuje tekst: Na prethodnoj formi pritisnuto je CANCEL
dugme (videti sliku 2.19).

Reenje:
Jedno od moguih reenja je u kreiranju pomone klase (u ovom primeru je to klasa Podaci)
u kojoj e se dodati jedan property (tzv. pametno polje) u kome e se uvati podatak koji
se prenosi sa forme na formu.
Dodati item tipa Class, pod nazivom Podaci.cs, iji je kod dat ispod.


23

// Podaci.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Prenos_podataka
{
class Podaci
{
private static string podatak;

public static string Podatak
{
get { return podatak; }
set { podatak = value; }
}
}
}

// frmPocetna.cs
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Prenos_podataka
{
public partial class frmPocetna : Form
{
public frmPocetna()
{
InitializeComponent();
}

private void btnNovaForma_Click(object sender, EventArgs e)
{
frmNova nova = new frmNova();
Podaci.Podatak = tbPocetna.Text;
if (nova.ShowDialog() == DialogResult.OK)
{
tbPocetna.Text = Podaci.Podatak;
}
else
{
tbPocetna.Text = "Na prethodnoj formi pritisnuto je CANCEL dugme";
}
nova.Dispose();
}
}
}





24

// frmNova.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Prenos_podataka
{
public partial class frmNova : Form
{
public frmNova()
{
InitializeComponent();
}

private void frmNova_Load(object sender, EventArgs e)
{
tbPodatakNova.Clear();
tbPodatakNova.Text = Podaci.Podatak;
}

private void frmNova_FormClosing(object sender, FormClosingEventArgs e)
{
Podaci.Podatak = tbPodatakNova.Text;
}
}
}

Napomena: Zadatak se mogao reiti i implementacijom dogaaja Click za dugmad OK i
Cancel forme frmNova, bez dogaaja FormClosing. Cilj ovog zadatka izmeu ostalog jeste i
upoznavanje itaoca sa dogaajem FormClosing, pa je zadatak tako i raen.


25

Zadatak 2.7. Prenos podataka i modalni, nemodalni dijalozi
Zadatak 2.5 reiti primenom samo jedne forme (frmNova), pored poetne forme
(frmPocetna).
Kreirati WinForms aplikaciju pod nazivom Dijalozi. Kreirati formu kao na slici 2.20 i
podesiti kontrole kao to je prikazano u tabeli 2.8.

Slika 2.20. Design prozor poetne forme frmPocetna za Zadatak 2.7
Tabela 2.8. Svojstva i dogaaji kontrola forme frmPocetna za Zadatak 2.7
Kontrola/Svojstva Name Text
Dodatna svojstva i
dogaaji
Label label1 Ovo je pocetna forma
Button btnNemodalna
Idi na Nemodalnu
formu
Dogaaj Click
Button btnModalna Idi na Modalnu formu Dogaaj Click

Dodati jo jednu Windows Form-u u projekat i nazvati je frmNova, koja sadri jednu labelu
(Name: lblPoruka) i jedno dugme (Name: btnZatvori, Text: Zatvori, dogaaj Click) (videti
sliku 2.21). Takoe je potrebno inicirati dogaaj Load za formu, koja e kasnije biti
implementirana.

Slika 2.21. Design prozor forme frmNova za Zadatak 2.7


26

Zahtevane funkcionalnosti aplikacije:
Obezbediti da klikom na dugme Idi na Nemodalnu formu otvara frmNova na kojoj
pie poruka Ovo je nemodalna forma, a klikom na dugme Idi na Modalnu formu
otvara frmNova na kojoj pie poruka Ovo je modalna forma (slika 2.22).







Slika 2.22. Funkcionalnosti Zadatka 2.7
Obezbediti da se klikom dugme Zatvori forme frmNova zatvara ta forma.

Reenje:
Jedno od moguih reenja je u kreiranju pomone klase (u ovom primeru je to klasa Podaci)
u kojoj e se dodati jedan property (tzv. pametno polje) u kome e se uvati podatak koji
se prenosi sa forme na formu.
Dodati item tipa Class, pod nazivom Podaci.cs, iji je kod dat ispod.
// Podaci.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Dijalozi
{
class Podaci
{
private static string poruka;

public static string Poruka
{
get { return poruka; }
set { poruka = value; }
}
}
}

27

// frmPocetna.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Dijalozi
{
public partial class frmPocetna : Form
{
public frmPocetna()
{
InitializeComponent();
}

// otvaranje nemodalne forme
private void btnNemodalna_Click(object sender, EventArgs e)
{
frmNova frmNova = new frmNova();
Podaci.Poruka = "Ovo je nemodalna forma";
frmNova.Show();
}

// otvaranje modalne forme
private void btnModalna_Click(object sender, EventArgs e)
{
frmNova frmNova = new frmNova();
Podaci.Poruka = "Ovo je modalna forma";
frmNova.ShowDialog();
frmNova.Dispose();
}
}
}

// frmNova.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Dijalozi
{
public partial class frmNova : Form
{
public frmNova()
{
InitializeComponent();
}

private void btnZatvori_Click(object sender, EventArgs e)
{
this.Close();
}
28


private void frmNova_Load(object sender, EventArgs e)
{
lblPoruka.Text = Podaci.Poruka;
}
}
}

29

Zadatak 2.8. Standardni windows dijalozi
Kreirati WinForms aplikaciju pod nazivom Standardni dijalozi. Kreirati formu kao na slici
2.23 i podesiti kontrole kao to je prikazano u tabeli 2.9.

Slika 2.23. Design prozor forme za Zadatak 2.8
Tabela 2.9. Svojstva i dogaaji kontrola forme za Zadatak 2.8
Kontrola/Svojstva Name Text
Dodatna svojstva i
dogaaji
Form Dijalozi
Standardni windows
dijalozi
Dogaaj Load
RichTextBox rtbTekst Ovo je pocetna forma
Button btnPromeniFolder Promeni radni folder Dogaaj Click
Button btnSacuvaj Sacuvaj Dogaaj Click
Button btnOtvori Otvori Dogaaj Click
Button btnBoja Boja Dogaaj Click
Button btnFont Font Dogaaj Click
FolderBrowserDialog folderBrowserDialog1
FontDialog fontDialog1
OpenFileDialog openFileDialog1
SaveFileDialog saveFileDialog1
ColorDialog colorDialog1

Zahtevane funkcionalnosti aplikacije:
Prilikom startovanja aplikacije podesiti da se za inicijalne direktorijume za prozore
OpenFileDialog i SaveFileDialog postavi lokacija C:\Temp, a za root folder za prozor
FolderBrowserDialog postavi MyComputer. Takoe stovati font u RichTextBox kontroli
na Calibri veliine 11.
30

Obezbediti da klikom na dugme Promeni radni folder se otvara standardni windows
dijalog za Browse (Slika 2.24).

Slika 2.24. Prozor koji se aktivira klikom na dugme Promeni radni folder
Obezbediti da se klikom na dugme Sacuvaj otvara standardni windows dijalog za
Save As (Slika 2.25). Podesiti da se podrazumevano uva kao rtf fajl. Ukoliko je
RichTextBox prazan korisnik dobija obavetenje kao na slici 2.26.

Slika 2.25. Klik na dugme Sacuvaj Slika 2.26. Obavetenje za prazno polje
Klik na dugme Otvori se otvara standardni windows dijalog za Open (Slika 2.27).
Podesiti da se prikazaju samo fajlovi sa .rtf ekstenzijom.

Slika 2.27. Klik na dugme Open
31

Obezbediti da se klikom na dugme Boja otvara standardni windows dijalog za Color
(Slika 2.28). Selektovani tekst u RichTextBox kontroli se podeava na izabranu boju.
Ukoliko nije selektovan tekst ili deo teksta u RichTextBox kontroli korisnik dobija
obavetenje kao na slici 2.29.

Slika 2.28. Klik na dugme Boja Slika 2.29. Obavetenje za neselektovani tekst
Klikom na dugme Font se otvara standardni windows dijalog za Font (Slika 2.30).
Selektovani tekst u RichTextBox kontroli se podeava na izabrani font. Ukoliko nije
selektovan tekst ili deo teksta u RichTextBox kontroli korisnik dobija obavetenje kao
na slici 2.31.

Slika 2.30. Klik na dugme Font Slika 2.31. Obavetenje da nema selektovanog teksta









32

Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Printing;

namespace Standardni_dijalozi
{
public partial class Dijalozi : Form
{
public Dijalozi()
{
InitializeComponent();
}

private void Dijalozi_Load(object sender, EventArgs e)
{
folderBrowserDialog1.RootFolder = Environment.SpecialFolder.MyComputer;
openFileDialog1.InitialDirectory = @"C:\Temp";
saveFileDialog1.InitialDirectory = @"C:\Temp";
rtbTekst.Font = new Font("Calibri", 11);
}

private void btnPromeniFolder_Click(object sender, EventArgs e)
{
if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
{
string radniFolder = folderBrowserDialog1.SelectedPath;
openFileDialog1.InitialDirectory = radniFolder;
saveFileDialog1.InitialDirectory = radniFolder;
}
}

private void btnSacuvaj_Click(object sender, EventArgs e)
{
saveFileDialog1.Filter = "rtf fajlovi|*.rtf";
if (rtbTekst.Text.Length > 0)
{
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
rtbTekst.SaveFile(saveFileDialog1.FileName,
RichTextBoxStreamType.RichText);
MessageBox.Show("Podaci upisani u fajl");
rtbTekst.Clear();
}
}
else
{
MessageBox.Show("Nije dozvoljeno cuvanje praznog sadrzaja");
return;
}
}

private void btnOtvori_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "Rtf fajlovi|*.rtf";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
33

rtbTekst.LoadFile(openFileDialog1.FileName,
RichTextBoxStreamType.RichText);
}
}

private void btnBoja_Click(object sender, EventArgs e)
{
if (rtbTekst.SelectedText.Length > 0)
{
if (colorDialog1.ShowDialog() == DialogResult.OK)
{
rtbTekst.SelectionColor = colorDialog1.Color;
}
}
else
{
MessageBox.Show("Odaberite tekst koji zelite da obojite");
}
}

private void btnFont_Click(object sender, EventArgs e)
{
if (rtbTekst.SelectedText.Length > 0)
{
if (fontDialog1.ShowDialog() == DialogResult.OK)
{
rtbTekst.SelectionFont = fontDialog1.Font;
}
}
else
{
MessageBox.Show("Odaberite tekst ciji font menjate");
}
}
}
}
34

Zadatak 2.9. Simulacija podeavanja fonta (bold, italic, underline, centar, size)
Kreirati WinForms aplikaciju pod nazivom Kontrola RichTextBox. Kreirati formu kao na
slici 2.32 i podesiti kontrole kao to je prikazano u tabeli 2.10.

Slika 2.32. Design prozor forme za Zadatak 2.9
Tabela 2.10. Svojstva i dogaaji kontrola forme za Zadatak 2.9
Kontrola/Svojstva Name Text Dodatna svojstva i dogaaji
Form Form1 Kontrola RichTextBox
Svojstvo
StartPosition=CenterScreen
RichTextBox rtbTekst Dogaaj LinkClicked
Button btnBold &Bold Dogaaj Click
Button btnItalic &Italic Dogaaj Click
Button btnUnderline &Underline Dogaaj Click
Button btnCentar &Centar Dogaaj Click
Button btnLoad &Load Dogaaj Click
Button btnSave &Save Dogaaj Click
Label label1 Size
TextBox txtVelicinaFonta 8
Dogaaji:
Validating i KeyPress

Zahtevane funkcionalnosti aplikacije:
Obezbediti da se klikom na dugme Bold bojlduje selektovani tekst ili ako je on ve
boldovan onda ga anboldovati. Ukoliko nije selektovan tekst onda tekst koje e se
kucati treba da bude bold ili ako je bold ukljuen iskljuiti ga. Odnosno, ista
funkcionalnost kao u Word-u kada se klikne na opciju za boldovanje .
Obezbediti da se klikom na dugme Italic selektovani tekst prikae kurzivnim
slovima ili ako je on ve italic onda ga ispraviti. Ukoliko nije selektovan tekst onda
tekst koje e se kucati treba da bude italic ili ako je italic ukljuen iskljuiti ga.
Odnosno, ista funkcionalnost kao u Word-u kada se klikne na opciju za italic .
35

Obezbediti da se klikom na dugme Underline selektovani tekst bude podvuen ili
ako je on ve podvuen onda ga ne podvlaiti. Ukoliko nije selektovan tekst onda
tekst koje e se kucati treba da bude underline ili ako je underline ukljuen iskljuiti
ga. Odnosno, ista funkcionalnost kao u Word-u kada se klikne na opciju za underline
.
Obezbediti da se klikom na dugme Center selektovani tekst prikae horizontalno
centriran ili ako je on ve centriran onda ga vratiti na levo poravljanje. Ukoliko nije
selektovan tekst onda tekst koje e se kucati treba da bude horizontalno centriran ili
ako je ukljuena opcija za centriranje iskljuiti je. Odnosno, ista funkcionalnost kao u
Word-u kada se klikne na opciju za horizontalno centriranje .
U polje za veliinu fonta (Size) onemoguiti da korisnik unese bilo koji simbol koji
nije cifra. Podeavanje se aktivira tek nakon ukucanog broja i Enter taster.
Selektovani tekst se podeava na ukucanu veliinu. Ukoliko nije selektovan tekst
onda tekst koje e se kucati treba podesiti na ukucanu veliinu. Odnosno, ista
funkcionalnost kao u Word-u kada se klikne na opciju za izbor veliine fonta .
Klikom na dugme Load se uitava fajl pod nazivom Test.rtf koji se nalazi u folderu
projekta. Ukoliko fajl ne postoji korisnik dobija obavetenje kao na slici 2.33. Koristiti
try-catch blok.

Slika 2.33. Obavetenje za Load Slika 2.34. Obavetenje za Save
Klikom na dugme Save tekst iz RichTextBox kontrole se upisuje u fajl Test.rtf koji se
nalazi u folderu projekta. Korisnik dobija obavetenje kao na slici 2.34. Koristiti try-
catch blok.
Ukoliko korisnik kao tekst unese web adresu, omoguiti da se on tumai kao link i
omoguiti da se klikom na njega otvara web stranica sa te adrese.







36

Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Kontrola_RichTextBox
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void btnBold_Click(object sender, EventArgs e)
{
Font stariFont;
Font noviFont;

// upisujemo font koji se trenutno koristi u izabranom tekstu
stariFont = this.rtbText.SelectionFont;

// Ako se koristi bold, onda ga uklanjamo
if (stariFont.Bold)
noviFont = new Font(stariFont, stariFont.Style & ~FontStyle.Bold);
else
noviFont = new Font(stariFont, stariFont.Style | FontStyle.Bold);

// ubacujemo novi font i vracamo fokus na RichTextBox kontrolu
this.rtbText.SelectionFont = noviFont;
this.rtbText.Focus();
}

private void btnItalic_Click(object sender, EventArgs e)
{
Font stariFont;
Font noviFont;

// upisujemo font koji se trenutno koristi u izabranom tekstu
stariFont = this.rtbText.SelectionFont;

// Ako se koristi bold, onda ga uklanjamo
if (stariFont.Italic)
noviFont = new Font(stariFont, stariFont.Style & ~FontStyle.Italic);
else
noviFont = new Font(stariFont, stariFont.Style | FontStyle.Italic);

// ubacujemo novi font i vracamo fokus na RichTextBox kontrolu
this.rtbText.SelectionFont = noviFont;
this.rtbText.Focus();
}

private void btnUnderline_Click(object sender, EventArgs e)
{
Font stariFont;
Font noviFont;


37

// upisujemo font koji se trenutno koristi u izabranom tekstu
stariFont = this.rtbText.SelectionFont;

// Ako se koristi bold, onda ga uklanjamo
if (stariFont.Underline)
noviFont = new Font(stariFont, stariFont.Style & ~FontStyle.Underline);
else
noviFont = new Font(stariFont, stariFont.Style | FontStyle.Underline);

// ubacujemo novi font i vracamo fokus na RichTextBox kontrolu
this.rtbText.SelectionFont = noviFont;
this.rtbText.Focus();
}

private void btnCentar_Click(object sender, EventArgs e)
{
if (this.rtbText.SelectionAlignment == HorizontalAlignment.Center)
this.rtbText.SelectionAlignment = HorizontalAlignment.Left;
else
this.rtbText.SelectionAlignment = HorizontalAlignment.Center;

this.rtbText.Focus();
}

private void txtVelicinaFonta_KeyPress(object sender, KeyPressEventArgs e)
{
// uklanjamo sve karaktere koji nisu brojevi, backspace ili enter
if ((e.KeyChar < 45 || e.KeyChar > 57) && e.KeyChar != 8 && e.KeyChar != 13)
{
e.Handled = true;
}
else if (e.KeyChar == 13)
{
// primenjujemo velicinu ako korisnik pritisne enter
TextBox txt = (TextBox)sender;

if (txt.Text.Length > 0)
PrihvatiTextSize(txt.Text);

e.Handled = true;
this.rtbText.Focus();
}
}

private void txtVelicinaFonta_Validating(object sender, CancelEventArgs e)
{
TextBox txt = (TextBox)sender;

PrihvatiTextSize(txt.Text);
this.rtbText.Focus();
}

private void PrihvatiTextSize(string textSize)
{
// konvertujemo tekst u float
float novaVelicina = Convert.ToSingle(textSize);

FontFamily trenutnaFontFamily;
Font novFont;

// Konvertujemo u novi font iste familije, ali razlicite velicine
trenutnaFontFamily = this.rtbText.SelectionFont.FontFamily;
novFont = new Font(trenutnaFontFamily, novaVelicina);

38

// Podesimo font izabranog teksta na novi font
this.rtbText.SelectionFont = novFont;
}

// omogucava da ukoliko se ukuca neki link i klikne na njega on i startuje
private void rtfText_LinkClicked(object sender, LinkClickedEventArgs e)
{
// koristi se da se dodje do teksta veze koja je pritisnuta
System.Diagnostics.Process.Start(e.LinkText);
}

private void btnLoad_Click(object sender, EventArgs e)
{
// ucitavamo tekst u kontrolu RichTextBox
try
{
rtbText.LoadFile(@"../../Test.rtf");
}
catch (System.IO.FileNotFoundException)
{
MessageBox.Show("Fajl jos nije ucitan");
}
}

private void btnSave_Click(object sender, EventArgs e)
{
// snimamo tekst
try
{
rtbText.SaveFile(@"../../Test.rtf");
MessageBox.Show("Fajl je uspesno sacuvan");
}
catch (System.Exception err)
{
MessageBox.Show(err.Message);
}
}
}
}
39

Zadatak 2.10. Sloeni zadatak
Kreirati WinForms aplikaciju pod nazivom Slozeni zadatak. Kreirati formu Registracija
kao na slici 2.35 i podesiti kontrole kao to je prikazano u tabeli 2.11.

Slika 2.35. Design prozor forme Registracija za Zadatak 2.10
Tabela 2.11. Svojstva i dogaaji kontrola Registracija za Zadatak 2.10
Kontrola/Svojstva Name Text Dodatna svojstva i dogaaji
From Registracija Registracija
Svojstvo
BackColor=AntiqueWhite
Label label1 Ime
Label label2 Prezime
TextBox tbIme
TextBox tbPrezime
GroupBox groupBox1 Struna sprema
RadioButton rbOsnovna Osnovna kola
RadioButton rbSrednja Srednja kola
RadioButton rbVisa Via kola
RadioButton rbFaks Fakultet
RadioButton rbMagistar Magistratura
RadioButton rbDoktor Doktorske studije
GroupBox groupBox2 Hobi
CheckBox cbSport Sport
CheckBox cbKnjiga Knjiga
CheckBox cbDruzenje Druenje
CheckBox cbFilm Filmovi
LinkLabel linkLabel1
Vidi sve strucne
spreme
Svojstvo Tag=
http://www.latipro.net/pagadm/s
trspreme.asp
RichTextBox rtbPodaci Svojstvo Enabled=False
Button btnPrijavi &Prijavi Dogaaj Click
40

Button btnOdustani &Odustani Dogaaj Click
Button btnZatvori &Zatvori Dogaaj Click

Dodati jo jednu Windows Form-u u projekat pod nazivom Potvrda (Slika 2.36) i podesiti
joj kontrole kao to je prikazano u tabeli 2.12.

Slika 2.36. Design prozor forme Potvrda
Tabela 2.12. Svojstva i dogaaji kontrola forme Potvrda za Zadatak 2.10
Kontrola/Svojstva Name Text Dodatna svojstva i dogaaji
From Potvrda Potvrda Dogaaj Load
Label label1 Podaci:
RichTextBox rtbSadrzaj
Button btnPotvrdi &Potvrdi Dogaaj Click
Button btnOdustani &Odustani

Zahtevane funkcionalnosti aplikacije:
Obezbediti da se klikom na dugme Prijavi otvara forma Potvrda, u kojoj se u
RichtextBox kontroli (rtbSadrzaj) ispisuje tekst sa podacima sa forme registracija
(Slika 2.37).

Slika 2.37. Klik na dugme Prijavi
Klikom na dugme Potvrdi forme Potvrda RichTextBox kontrola forme Registracija
(rtbPodaci) se popunjava kao na slici 2.38.
41


Slika 2.38. Klik na dugme Potvrdi Slika 2.39. Klik na dugme Odustani
forme Potvrda forme Potvrda
Klikom na dugme Odustani forme Potvrda RichTextBox kontrola forme
Registracija (rtbPodaci) se popunjava kao na slici 2.39.
Klikom na dugme Odustani forme Registracija resetovati kontrole kao na slici
2.35.
Klikom na dugme Zatvori forme Registracija zatvoriti formu.
Klikom na link strucne spreme otvara se link
www.latipro.net/pagadm/strspreme.asp.
Reenje:
Jedno od moguih reenja je u kreiranju pomone klase (u ovom primeru je to klasa
Korisnik) u kojoj e se dodati propertiji za sve podatke koje treba pamtiti.
Dodati item tipa Class, pod nazivom Korisnik.cs, iji je kod dat ispod.
// Korisnik.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Slozeni_zadatak
{
class Korisnik
{
private static string ime;

public static string Ime
{
get { return ime; }
set { ime = value; }
}

private static string prezime;

42

public static string Prezime
{
get { return prezime; }
set { prezime = value; }
}

private static string hobi;

public static string Hobi
{
get { return hobi; }
set { hobi = value; }
}

private static string sprema;

public static string Sprema
{
get { return sprema; }
set { sprema = value; }
}
}
}

// Registracija.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Slozeni_zadatak
{
public partial class Registracija : Form
{
public Registracija()
{
InitializeComponent();

// (odakle pocinje link, duzina linka, linkData)
linkLabel1.Links.Add(9, 14, "www.latipro.net/pagadm/strspreme.asp");
}

private void btnZatvori_Click(object sender, EventArgs e)
{
this.Close();
}

// otvaranje navedene adrese u objektu linkData
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
System.Diagnostics.Process.Start(e.Link.LinkData.ToString());
}

// pokupi strucnu spremu - upis u polje sprema
private void pokupiStrucnuSpremu()
{
if (rbOsnovna.Checked) Korisnik.Sprema = "Osnovna skola";
else if (rbSrednja.Checked) Korisnik.Sprema = "Srednja skola";
43

else if (rbVisa.Checked) Korisnik.Sprema = "Visa skola";
else if (rbFaks.Checked) Korisnik.Sprema = "Fakultet";
else if (rbMagistar.Checked) Korisnik.Sprema = "Magistratura";
else Korisnik.Sprema = "Doktorat";
}

// pokupi hobi - upis u polje hobi
private void pokupiHobi()
{
Korisnik.Hobi = "";
if (cbSport.Checked) Korisnik.Hobi += "\tSport\n";
if (cbKnjiga.Checked) Korisnik.Hobi += "\tKnjiga\n";
if (cbDruzenje.Checked) Korisnik.Hobi += "\tDruzenje\n";
if (cbFilm.Checked) Korisnik.Hobi += "\tFilmovi\n";
}

private void btnPrijavi_Click(object sender, EventArgs e)
{

Korisnik.Ime = tbIme.Text;
Korisnik.Prezime = tbPrezime.Text;

// poziv funkcija koje upisuju spremu i hobi u propetije
pokupiStrucnuSpremu();
pokupiHobi();

resetuj(); // funkcija koja ''resetuje'' formu

Potvrda forma = new Potvrda();
if (forma.ShowDialog() == DialogResult.OK)
{
// ucitavanje podataka iz fajla u RichTextBox kontrolu
rtbPodaci.LoadFile(@"C:\Temp\podaci.rtf",
RichTextBoxStreamType.RichText);
}
else
{
rtbPodaci.Text = "Odustali ste od registracije!";
}
forma.Dispose();
}

// postavlja sve kontrole u inicijalno stanje
private void resetuj()
{
tbIme.Text = "";
tbPrezime.Text = "";

rbOsnovna.Checked = true;
rbSrednja.Checked = false;
rbVisa.Checked = false;
rbFaks.Checked = false;
rbMagistar.Checked = false;
rbDoktor.Checked = false;

cbSport.Checked = false;
cbKnjiga.Checked = false;
cbDruzenje.Checked = false;
cbFilm.Checked = false;

rtbPodaci.ResetText();
}


44

private void btnOdustani_Click(object sender, EventArgs e)
{
resetuj();
}
}
}

// Potvrda.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Slozeni_zadatak
{
public partial class Potvrda : Form
{
public Potvrda()
{
InitializeComponent();
}

private void Potvrda_Load(object sender, EventArgs e)
{
// upis podataka u RichTextBox
rtbSadrzaj.Text = "Ime:\t" + Korisnik.Ime + "\n" + "Prezime:\t" +
Korisnik.Prezime + "\n" + "Strucna sprema:\t" + Korisnik.Sprema + "\n" +
"Hobiji:\n" + Korisnik.Hobi;
}

private void btnPotvrdi_Click(object sender, EventArgs e)
{
// snimanje podataka iz RichTextBox kontrole u fajl
rtbSadrzaj.SaveFile(@"C:\Temp\podaci.rtf", RichTextBoxStreamType.RichText);
}
}
}

45

Zadatak 2.11. Windows kontrole: ComboBox i RadioButton
Kreirati WinForms aplikaciju pod nazivom Student 2. Kreirati formu kao na slici 2.40 i
podesiti kontrole kao to je prikazano u tabeli 2.13.

Slika 2.40. Design prozor forme za Zadatak 2.11
Tabela 2.13. Svojstva i dogaaji kontrola za Zadatak 2.11
Kontrola/Svojstva Name Text Dodatna svojstva i dogaaji
Label Label1 Ime i prezime:
Label Label2 Adresa:
Label Label3 Smer:
Label Label4 Starost:
Label Label5 Izlaz:
TextBox txtIme
TextBox txtAdresa
TextBox txtStarost
TextBox txtIzlaz Svojstvo ReadOnly=True
ComboBox cmbSmer
GroupBox groupBox1 Pol
RadioButton rdbMusko
RadioButton rdbZensko
Button btnOK &OK Dogaaj Click
Button btnHelp &Help Dogaaj Click
Button btnIzlaz &Izlaz Dogaaj Click

Za svojstvo Items kontrole ComboBox (cmbSmer) kliknuti na tri takice pri emu se
prikazuje prozor za unos itema kolekcije tj. stavki padajue liste. Uneti stavke kao na slici
2.41. Potvrditi unos na dugme OK.
46


Slika 2.41. Unos stavki ComboBox kontrole
Zahtevane funkcionalnosti aplikacije:
Obezbediti da se klikom na dugme OK, u txtIzlaz ispisuje tekst koji je unseen u
gornja tekst polja (videti sliku 2.42).

Slika 2.42. Klik na dugme OK Slika 2.43. Klik na dugme Help
Obezbediti da se klikom na dugme Help, u txtIzlaz ispisuje se tekst kao na slici
2.43.
Klikom na dugme Izlaz forma se zatvara.

47

Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Student_2
{
public partial class frmStudent : Form
{
public frmStudent()
{
InitializeComponent();
}

private void btnIzlaz_Click(object sender, EventArgs e)
{
this.Close();
}

private void btnOK_Click(object sender, EventArgs e)
{
this.txtIzlaz.Text = "Ime i prezime: " + this.txtIme.Text +
"\r\nAdresa: " + this.txtAdresa.Text +
"\r\nSmer: " + this.cmbSmer.Text +
"\r\nPol: " + (string)(this.rdbZensko.Checked ? "ensko" : "Muko") +
"\r\nStarost: " + this.txtStarost.Text;
}

private void btnHelp_Click(object sender, EventArgs e)
{
this.txtIzlaz.Text = "Ime i prezime = Tvoje ime i prezime" + "\r\nAdresa =
Tvoja adresa" + "\r\nSmer = Izaberi naziv svog smera ili
unesi ako nije ponueno" + "\r\nPol = Izaberite va pol"
+ "\r\nStarost = Broj godina";
}
}
}


48

Zadatak 2.12. Windows kontrole: ListBox i ChekedListBox
Kreirati WinForms aplikaciju pod nazivom Kontrola ListBox. Kreirati formu kao na slici
2.44 i podesiti kontrole kao to je prikazano u tabeli 2.14.

Slika 2.44. Design prozor forme za Zadatak 2.12
Tabela 2.14. Svojstva i dogaaji kontrola za Zadatak 2.12
Kontrola/Svojstva Name Text
Dodatna svojstva i
dogaaji
CheckedListBox chkListaIzbora
ListBox lstSelektovani
Button btnPrebaci Prebaci Dogaaj Click

Za svojstvo Items kontrole CheckedListBox (chkListaIzbora) kliknuti na tri takice pri emu
se prikazuje prozor za unos itema kolekcije tj. stavki CheckedListBox. Uneti stavke kao na
slici 2.45. Potvrditi unos na dugme OK.

Slika 2.45. Unos stavki CheckedListBox kontrole
Zahtevane funkcionalnosti aplikacije:
Dinamiki (u kodu) dodati stavku deset u CheckedListBox.
Obezbediti da se klikom na dugme Prebaci prikazuju selektovane stavke
CheckedListBox kontrole u ListBox kontroli i resetuje selektovane stavke
CheckedListBox (videti sliku 2.46).
49


Slika 2.46. Funkcionalnost aplikacije
Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Kontrola_ListBox
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

// naknadno dodavanje Item u kontrolu CheckedListBox iz koda
this.chkListaIzbora.Items.Add("deset");
}

private void btnPrebaci_Click(object sender, EventArgs e)
{
// provera da li postoji neki izabrani element u kontroli CheckedListBox
if (this.chkListaIzbora.CheckedItems.Count > 0)
{
// praznjenje kontrole ListBox u koju se smestaju izabrani elementi
this.lstSelektovani.Items.Clear();

// prolazi se kroz kolekciju CheckedItems kontrole CheckedListBox
// i dodaju se izabrani elementi u ListBox
foreach (string s in chkListaIzbora.CheckedItems)
{
this.lstSelektovani.Items.Add(s.ToString());
}

// ponistavanje izbora u kontroli CheckedListBox
for (int i = 0; i < this.chkListaIzbora.Items.Count; i++)
this.chkListaIzbora.SetItemChecked(i, false);
}
}
}
}


50

Zadatak 2.13. MessageBox klasa Dialog Result
Kreirati WinForms aplikaciju pod nazivom MessageBox klasa. Kreirati formu kao na slici
2.47 i podesiti kontrole kao to je prikazano u tabeli 2.15.

Slika 2.47. Design prozor forme za Zadatak 2.13
Tabela 2.15. Svojstva i dogaaji kontrola za Zadatak 2.13
Kontrola/Svojstva Name Text
Dodatna svojstva i
dogaaji
Form Form1 MessageBox klasa Dogaaj FormClosng
Button button1 Klikni Dogaaj Click
TextBox txtRezultat Svojstvo ReadOnly=True

Zahtevane funkcionalnosti aplikacije:
Klikom na dugme Klikni se otvara MessageBox kao na slici 2.48.

Slika 2.48. MessageBox za odabir dugmeta Slika 2.49. MessageBox - zatravanje forme
U zavisnosti na koje dugme na MessageBox-u korisnik klikne u TextBox-u forme se
ispisuje odgovarajua poruka:
o klik na Yes poruka: Izabrali ste dugme YES
o klik na No poruka: Izabrali ste dugme NO
o klik na Cancel poruka: Izabrali ste dugme Cancel
Pri pokuaju zatvaranja forme (klik na x) korisniku se prikazuje MessageBox kao na
slici 2.49. Ukoliko korisnik izabere opciju Yes zatvoriti aplikaciju, a ukoliko odabere
No zatvoriti samo taj MessageBox.


51

Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MessageBox_klasa
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
DialogResult rezultat = MessageBox.Show("Odabri jedno dugme i klikni na
njega", "Poruka", MessageBoxButtons.YesNoCancel,
MessageBoxIcon.Information);
switch (rezultat)
{
case DialogResult.Yes:
txtRezultat.Text = "Izabrali ste dugme YES";
break;
case DialogResult.No:
txtRezultat.Text = "Izabrali ste dugme NO";
break;
case DialogResult.Cancel:
txtRezultat.Text = "Izabrali ste dugme Cancel";
break;
}
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult rezultat = MessageBox.Show("Da li si sugaran da zelis da
napustis aplikaciju?", "Obavestenje",
MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (rezultat == DialogResult.No)
{
e.Cancel = true;
}
}
}
}


52

Zadatak 2.14. Windows kontrole: TrackBar i NumericUpDown
Kreirati WinForms aplikaciju pod nazivom Track_Numeric. Kreirati formu kao na slici 2.50
i podesiti kontrole kao to je prikazano u tabeli 2.16.

Slika 2.50. Design prozor forme za Zadatak 2.14
Tabela 2.16. Svojstva i dogaaji kontrola za Zadatak 2.14
Kontrola/Svojstva Name Text
Dodatna svojstva i
dogaaji
TrackBar trackBar1 Dogaaj Scroll
NumericUpDown numericUpDown1 Dogaaj ValueChanged
Label label1 Vrednost TrackBar
Label label2
Vrednost
NumericUpDown

TextBox txtTrackBar Svojstvo ReadOnly=True
TextBox txtNumeric Svojstvo ReadOnly=True

Zahtevane funkcionalnosti aplikacije:
Skrolovanje tj. vrednost na TrackBar kontroli se automatski upisuje u txtTrackBar
(videti sliku 2.51).
Promena vrednosti NumericUpDown kontrole se automatski upisuje u txtNumeric
(videti sliku 2.51).

Slika 2.51. Izlazni ekran


53

Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Track_Numeric
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void trackBar1_Scroll(object sender, EventArgs e)
{
txtTrackBar.Text = trackBar1.Value.ToString();
}

private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
txtNumeric.Text = numericUpDown1.Value.ToString();
}
}
}


54

Zadatak 2.15. Rad sa slikama. Windows kontrole: PictureBox i ImageList
Kreirati WinForms aplikaciju pod nazivom Slike. Kreirati formu kao na slici 2.52 i podesiti
kontrole kao to je prikazano u tabeli 2.17.

Slika 2.52. Design prozor forme za Zadatak 2.15
Tabela 2.17. Svojstva i dogaaji kontrola za Zadatak 2.15
Kontrola/Svojstva Name Text
Dodatna svojstva i
dogaaji
Form Form1 Rad sa slikama Dogaaj Load
Label label1 Slika kao objekat Image klase
Label label2 Slika kao objekat Bitmap klase
Label label3 Slika sa Interneta
Label label4
Slucajno izabrana slika iz
ImageList kontrole

PictureBox pictureBox1 Dogaaj Click
PictureBox pictureBox2 Dogaaj Click
PictureBox pictureBox3
PictureBox pictureBox4
ImageList imageList1
Button button1 Prikazi sliku Dogaaj Click

Kreirati folder Galerija u okviru foldera projekta koji sadri slike (u jpg formatu) sa sledeim
nazivom: ispit, macka, pas, pas_i_macka, student, studentkinja.
55

Za kontrolu imageList1 u svojstvu Collection kliknuti na tri takice i popuniti je kao na slici
2.53.

Slika 2.53. Kolekcija ImageList kontrole
Zahtevane funkcionalnosti aplikacije (slika 2.54):
Prilikom uitavanja forme (znai Load dogaaj):
o u pictureBox1 kao objekat Image klase instancirati sliku ispit
o u pictureBox2 kao objekat Bitmap klase instancirati sliku pas
o u pictureBox3 instancirati sliku sa web adrese
http://www.its.edu.rs/cms/galerija/upload/DiplomeITS_1.jpg
Klikom na pictureBox1 otvariti njenu sliku (ispit) u programu za pregled slika.
Klikom na pictureBox2 u MessageBox-u prikazati Name kontrole koja je izazvala
dogaaj (u ovom primeru je to pictureBox2).
Obezbediti da se klikom na dugme Prikazi sliku po sluajnom izboru (random) u
pictureBox4 prikazuje slika iz ImageList kolekcije.

Slika 2.54. Izlazni ekran
56

Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Slike
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
// slika kao objekat Image klase
// potrebno je navesti stvarnu putanju slike - OBAVEZNO
Image i = Image.FromFile(@"..\..\Galerija\ispit.jpg");
pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
pictureBox1.Image = i;

// slika kao objekat Bitmap klase
// potrebno je navesti stvarnu putanju slike OBAVEZNO
// znak @ oznacava da se radi o adresi tj. putanji fajla
Bitmap b = new Bitmap(@"..\..\Galerija\pas.jpg");
pictureBox2.SizeMode = PictureBoxSizeMode.Zoom;
pictureBox2.Image = b;

// prikaz slike sa Interneta
pictureBox3.SizeMode = PictureBoxSizeMode.Zoom;
pictureBox3.ImageLocation =
"http://www.its.edu.rs/cms/galerija/upload/DiplomeITS_1.jpg";
}

// prikaz Name kontrole koja je izazvala dogadjaj
private void pictureBox2_Click(object sender, EventArgs e)
{
PictureBox pb2 = (PictureBox)sender;
MessageBox.Show(pb2.Name);
}

// otvaranje slike u programu za pregled slika
private void pictureBox1_Click(object sender, EventArgs e)
{
// potrebno je navesti stvarnu putanju slike - OBAVEZNO
System.Diagnostics.Process.Start(@"..\..\Galerija\ispit.jpg");
}

// prikaz slucajno izabrane slike iz ImageList kontrole
private void button1_Click(object sender, EventArgs e)
{
Random rd = new Random();
int broj = rd.Next(imageList1.Images.Count);
pictureBox4.Image = imageList1.Images[broj];
pictureBox4.SizeMode = PictureBoxSizeMode.Zoom;
}
} }
57

Zadatak 2.16. Validacija koriskog ulaza. Dogaaji Validating i Validated.
Kreirati WinForms aplikaciju pod nazivom Validacija. Kreirati formu kao na slici 2.55 i
podesiti kontrole kao to je prikazano u tabeli 2.18.

Slika 2.55. Design prozor forme za Zadatak 2.16
Tabela 2.18. Svojstva i dogaaji kontrola za Zadatak 2.16
Kontrola/Svojstva Name Text
Dodatna svojstva i
dogaaji
TextBox txtBroj
Button btnBroj Provera - Numeric Dogaaj Click
Label label1
Automatska provera unosa
broja

TextBox txtAutomatic Dogaaj KeyPress
TextBox txtDatum
Button btnDatum Provera - Datum Dogaaj Click
Label label2 Dogaaji Validating i Validated
TextBox txtValidacija
Dogaaji:
Validating i Validated
Button btnValidacija Validacija
Dogaaj Click
Svojstvo Enabled=true
ErrorProvider errGreska

Napomena: Za validaciju (proveru) kog je formata uneti podatak (broj, datum, ) pogodno
je koristiti klasu Information koja ima gotove funkcije koje to rade. Ova klasa je definisana
u VisualBasic-u. Kako je ovaj programski jezik podran i integrisan u IDE VisualStudio
okruenje, mogue je u WinForms ukljuiti i njegove klase, odnosno metode. Prvo treba
dodati reference u projekat tako to se u Solution Explorer-u uradi desni klik mia na folder
References i izabere opcija Add Reference. Otvara se prozor kao na slici 2.56. U listi treba
58

ekirati checkBox za Microsoft.VisualBasic. Nakon dodavanja SolutionExplorer prozor ima
izgled kao na slici 2.57.

Slika 2.56. Prozor za dodavanje reference u projekat Slika 2.57. Nakon dodavanja
Sada se u sam kod forme (Form1.cs) moe dodati using direktiva (odnosno ukljuiti prostor
imena) Microsoft.VisualBasic (using Microsoft.VisualBasic;). Nakon ovoga se u klasa
tnInformation moe koristiti u kodu (pogledati reenje).
Zahtevane funkcionalnosti aplikacije:
Klik na dugme Provera - Numeric proverava da li je u txtBroj unet broj. Ukoliko
nije setovati errGreska (ErrorProvider) na txtBroj i poruku Unesite numericku
vrednost.
Za txtAutomatic preko dogaaja KeyPress onemoguiti unos bilo kog karaktera osim
cifre.
Klik na dugme Provera - Datum proverava da li je u txtDatum unet datum. Ukoliko
nije setovati errGreska (ErrorProvider) na txtDatum i poruku Unesite datumsku
vrednost.
Za txtValidacija obezbediti da nakon gubitka fokusa se proverava (pomou dogaaja
Validating) da li je to polje popunjeno i btnValidacija uiniti dostupnim za korienje
(svojstvo Enabled=true). Ukoliko je txtValidacija prazna nakon gubitka fokusa
setovati errGreska (ErrorProvider) na txtValidacija i poruku Unesite vrednost. U
dogaaju Validated obezbediti prikaz MessageBox kao na slici 2.58. (Obratiti panju
kada se koji dogaaj Validating i Validated izvravaju).
Klikom na dugme btnValidacija prikazati MessageBox kao na slici 2.59.
59


Slika 2.58. MessageBox dogaaja Validated Slika 2.59. MessageBox za btnValidacija

Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

// dodato zbog klase Information, koja se nalazi u References/Microsoft.VisualBasic
using Microsoft.VisualBasic;

namespace Validacija
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

// provera da li je uneta vrednost u TextBox kontrolu (txtBroj) numericka
private void btnBroj_Click(object sender, EventArgs e)
{
if (Information.IsNumeric(txtBroj.Text) == false)
{
errGreska.SetError(txtBroj, "Unesite numericku vrednost");
txtBroj.Focus();
txtBroj.SelectAll();
}
else
{
errGreska.SetError(txtBroj, "");
}
}

// ne dozvoljava upis nicega sem brojeva u TextBox
private void txtAutomatic_KeyPress(object sender, KeyPressEventArgs e)
{
if (Char.IsDigit(e.KeyChar) || e.KeyChar == '\b')
{
e.Handled = false;
}
else
{
e.Handled = true;
}
}


60

// provera da li je uneta vrednost u TextBox kontrolu (txtDatum) datum
private void btnDatum_Click(object sender, EventArgs e)
{
if (Information.IsDate(txtDatum.Text) == false)
{
errGreska.SetError(txtDatum, "Unesite datumsku vrednost");
txtDatum.Focus();
txtDatum.SelectAll();
}
else
{
errGreska.SetError(txtDatum, "");
}
}

// ukoliko korisnik klikne na TextBox kontrolu (tj. txtValidacija dobije fokus) i
// ostavi je praznu
// pri pokusaju da predje na neku drugu kontrolu (tj. txtValidacija izgubi fokus)
// pojavlju je se ErrorProvider kontrola sa odgovarajucim obavestenjem
private void txtValidacija_Validating(object sender, CancelEventArgs e)
{
if (String.IsNullOrEmpty(txtValidacija.Text))
{
errGreska.SetError(txtValidacija, "Unesite vrednost");
}
else
{
errGreska.SetError(txtValidacija, "");
btnValidacija.Enabled = true;
}
}

// automatski se poziva nakon dogadjaja txtValidacija_Validating
private void txtValidacija_Validated(object sender, EventArgs e)
{
MessageBox.Show("Sigurni ste da ste uneli pravi podatak?");
}

private void btnValidacija_Click(object sender, EventArgs e)
{
MessageBox.Show("Uspesna validacija!","Poruka", MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
}
}


61

Zadatak 2.17. MaskedTextBox i upotreba regularnih izraza
Kreirati WinForms aplikaciju pod nazivom Regularni izrazi. Kreirati formu kao na slici 2.60
i podesiti kontrole kao to je prikazano u tabeli 2.19.

Slika 2.60. Design prozor forme za Zadatak 2.17
Tabela 2.19. Svojstva i dogaaji kontrola za Zadatak 2.17
Kontrola/Svojstva Name Text Dodatna svojstva i dogaaji
Form Form1 Dogaaj Load
Label label1 Unesi datum
MaskedTextBox mtxtBezMaske
Dogaaj
TypeValidationCompleted
Label label2 Unesi datum
MaskedTextBox mtxtSaMaskom
Dogaaj MaskInputRejected
Svojstvo BeepOnError=True
Button btnPotvrdi Potvrdi Dogaaj Click
Label label3
Unesi nesto duzine od
1 do 10 karaktera:

TextBox txtIzraz1
Button btnIzraz1 Proveri Dogaaj Click
Label label4
Unesi nesto duzine od
1 do 50 znakova:

TextBox txtIzraz2
Button btnIzraz2 Proveri Dogaaj Click
ErrorProvider errorProvider1

Za mtxtSaMaskom postaviti svojstvo Mask na Short date. Postupak je sledei. U Properties
prozoru kontrole mtxtSaMaskom (znai, selektuje se ta kontrola na formi) za svojstvo Mask
se klikne na tri takice pri emu se otvara prozor kao na slici 2.61. Iz liste izabrati Short
date, pri emu se automatski generie odogvarajua maska (Mask=00/00/0000), a korisnik
to polje vidi kao . (Nula u Mask svojstvu menja cifru). Izbor potvrditi na dugme
62

OK. Potrebno je jo za ovu kontrolu (mtxtSaMaskom) setovati svojstvo TextMaskFormat na
ExcludePromptAndLiterals (vidi sliku 2.62.) koja iskljuuje sve prazne karaktere i slova.


Slika 2.61. Izbor Mask svojstva za MaskedTextBox Slika 2.62. Svojstvo TextMaskFormat
Napomena: Kako e se u zadatku koristiti i regularni izrazi neophodno je ukljuiti njen
proctor imena, a to je System.Text.RegularExpressions (pogledati reenje).
Zahtevane funkcionalnosti aplikacije:
Prilikom uitvanja forme (Load dogaaj za Form) setovati ValidatingTaype svojstvo
kontrole mtxtBezMaske na System.DateTime.
Onemoguiti gubitak fokusa za kontrolu mtxtBezMaske dokle god se ne unese
datumska vrednost (koristiti dogaaj TypeValidationCompleted). Ukoliko korisnik nije
uneo datum setovati errorProvider1 na mtxtBezMaske i poruku Vrednost koju ste
uneli nije datum, promenite je!.
Ukoliko korisnik pokua da u mtxtSaMaskom unese karakter koji nije cifra prikazuje
se MessageBox u kome stoji poruka To ne sme!!! (koristiti dogaaj
MaskInputRejected).
Klik na dugme btnPotvrdi prikazuje se MessageBox koji prikazuje sadraj
mtxtSaMaskom. (Npr. Ako se unese 12.12.2014 u MessageBox-u se prikazuje
poruka Vidi sta si uneo: 12122014).
Obezbediti da se klikom na dugme btnIzraz1 proverava da li je u txtIzraz1 unet niz
slova i cifara duine od 1 do 10 karaktera. Ukoliko nije setovati errorProvider1 na
txtIzraz1 i "Unesite od 1 do 10 karaktera.", takoe txtIzraz1 uzima fokus i njegov
sadraj je selektovan.
Obezbediti da se klikom na dugme btnIzraz2 proverava da li je u txtIzraz2 unet niz
alfabetskih karatkera (slova, praznih mesta, taki i jednostrukih navodnika) duine
63

od 1 do 50 karaktera. Prikazati MessageBox sa odgovarajuom porukom kao na slici
2.63. Ukoliko niz nije validan txtIzraz2 uzima fokus i njegov sadraj je selektovan.

Slika 2.63. MessageBox za validan i nevalidan izraz
Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Text.RegularExpressions; // dodato zbog Regex klase

namespace Regularni_izrazi
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

// dogadjaj koji se ispaljuje prilikom ucitavanja forme
private void Form1_Load(object sender, EventArgs e)
{
// definisanje ValidatingTaype svojstva kontrole MaskedTextBox (mtxtBezMaske)
mtxtBezMaske.ValidatingType = typeof(System.DateTime);
}

// dogadjaj koji se ispaljuje kada je zavrsen unos u mtxtBezMaske kontrolu
// ako kontrola mtxtBezMaske dobije fokus,
// dokle god se ne unese bilo koji datum bice onemogucen prelazak na bilo koju
// drugu kontrolu ili izlazak iz apkilacije
// tj. ako kontrola mtxtBezMaske dobije fokus nece ga ''izgubiti'' sve dok se u
// nju ne unese datum
private void mtxtBezMaske_TypeValidationCompleted(object sender,
TypeValidationEventArgs e)
{
if (!e.IsValidInput)
{
errorProvider1.SetError(mtxtBezMaske, "Vrednost koju ste uneli nije
datum, promenite je!");
e.Cancel = true;
}
else
{
errorProvider1.SetError(mtxtBezMaske, "");
}
}
64


// dogadjaj koji se ispaljuje kada se unese ne dozvoljena vrednost
private void mtxtSaMaskom_MaskInputRejected(object sender,
MaskInputRejectedEventArgs e)
{
MessageBox.Show("To ne smes!!!");
}

private void btnPotvrdi_Click(object sender, EventArgs e)
{
MessageBox.Show("Vidi sta si uneo: " + mtxtSaMaskom.Text);
}

// provera izraza uz prikaz poruke u ErrorProvider kontroli
// izraz mora da sadri izmeu 1 i 10 karaktera
private void btnIzraz1_Click(object sender, EventArgs e)
{
string ulaz = txtIzraz1.Text;

if (!Regex.IsMatch(ulaz, @"^[a-zA-Z]{1,10}$"))
{
errorProvider1.SetError(txtIzraz1, "Unesite od 1 do 10 karaktera.");
txtIzraz1.SelectAll();
txtIzraz1.Focus();
}
else
{
errorProvider1.SetError(txtIzraz1, "");
}
}

// provera izraza uz prikaz poruke u MessageBox kontroli
// izraz mora da sadri izmeu 1 i 50 znakova sa alfabetskim karakterima,
// praznim mestima, jednostrukim navodnicima, tackama
private void btnIzraz2_Click(object sender, EventArgs e)
{
string ulaz = txtIzraz2.Text;

if (Regex.IsMatch(ulaz, @"^[a-zA-Z\s'.]{1,50}$"))
{
MessageBox.Show(ulaz + " je validan izraz.");
}
else
{
MessageBox.Show(ulaz + " nije validan izraz.");
txtIzraz2.SelectAll();
txtIzraz2.Focus();
}
}
}
}


65

Zadatak 2.18. Kontrola DataTimePicker
I deo zadatka
Kreirati WinForms aplikaciju pod nazivom Rad sa DataTimePicker kontrolom. Kreirati
formu Picker kao na slici 2.64 i podesiti kontrole kao to je prikazano u tabeli 2.20.

Slika 2.64. Design prozor forme Picker za Zadatak 2.18
Tabela 2.20. Svojstva i dogaaji kontrola forme Picker za Zadatak 2.18
Kontrola/Svojstva Name Text Dodatna svojstva i dogaaji
Label label1 Datum kolokvijuma:
Label label2 Vreme pocetka:
DataTimePicker dtpDatum
Svojstva:
Format=Custom
Value= 03.12.2014. 09:00
DataTimePicker dtpVreme
Svojstva:
ShowUpDown=True
Format=Time
Value= 03.12.2014. 09:00
Button btnPrijava Prijavi se Dogaaj Click
RichTextBox rtbIzvestaj Svojstvo Enabled=False

Zahtevane funkcionalnosti aplikacije:
Prilikom uitvanja forme (u okviru konstruktora forme) postaviti dtpDatum na
sistemski datum, a dtpVreme na sistemsko vreme.
Klik na dugme btnPrijava prikazuje se tekst poruke u rtbIzvestaj kao na slici 2.65.

Slika 2.65. Izlazni ekran forme Picker
66

Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Rad_sa_DataTimePicker_kontrolom
{
public partial class Picker : Form
{
public Picker()
{
InitializeComponent();

// inicijalizacija na trenutni datum i vreme
dtpDatum.Value = System.DateTime.Today;
dtpVreme.Value = System.DateTime.Now;
}

private void btnPrijava_Click(object sender, EventArgs e)
{
// brisanje trenutnog sadrzaja RichTextBox kontrole
rtbIzvestaj.Clear();

// kreiranje objekta za smestanje stringa
StringBuilder sb = new StringBuilder();

sb.AppendLine("Upravo ste se prijavili za kolokvijum");

// upis datuma
sb.Append("\r\nDatum odrzavanja je: ");
sb.AppendLine(dtpDatum.Value.ToShortDateString());

// upis vremena
sb.Append("Vreme odrzavanja je: ");
sb.Append(dtpVreme.Value.ToShortTimeString());

// upis stringBuilder-a u RichtextBox kontrolu
rtbIzvestaj.AppendText(sb.ToString());
}
}
}


67

II deo zadatka
U isti projekat dodati novu formu Kalkulator_odmora_1 kao na slici 2.66 i podesiti
kontrole kao to je prikazano u tabeli 2.21.

Slika 2.66. Design prozor forme Kalkulator_odmora_1 za Zadatak 2.18
Tabela 2.21. Svojstva i dogaaji kontrola forme Kalkulator_odmora_1 za Zadatak 2.18
Kontrola/Svojstva Name Text Dodatna svojstva i dogaaji
Label label1 Prvi dan odmora:
Label label2
Poslednji dan
odmora:

DataTimePicker dtpPocetak Svojstvo Format=Short
DataTimePicker dtpKraj Svojstvo Format=Short
Button btnIzracunaj Izracunaj odmor Dogaaj Click
Label label3
Ukupno dana
odmora:

TextBox tbOdmorTrajanje Svojstvo Enabled=False

Zahtevane funkcionalnosti aplikacije:
Klikom na dugme btnIzracunaj u tbOdmorTrajanje se prikazuje izraunata vrednost
ukupnog broja dana odmora kao na slici 2.67.

Slika 2.67. Izlazni ekran forme Kalkulator_odmora_1
Ukoliko se za poslednji dan odmora izabere datum manji od datuma poetka odmora
prikazati MessageBox kao na slici 2.68.
68


Slika 2.68. MessageBox greke
Napomena: Kako bi se prilikom startovanja projekta startovala ova forma
(Kalkulator_odmora_1) neophodno je u fajlu Program.cs izmeniti poslednju liniju koda u
kojoj se navodi koja forma je run (Application.Run(new Kalkulator_odmora_1());).
Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Rad_sa_DataTimePicker_kontrolom
{
public partial class Kalkulator_odmora_1 : Form
{
public Kalkulator_odmora__1()
{
InitializeComponent();
}

private void btnIzracunaj_Click(object sender, EventArgs e)
{
TimeSpan trajanje = dtpKraj.Value - dtpPocetak.Value;

if (trajanje.Days >= 0)
{
int brDana = (int)trajanje.Days + 1;
tbOdmorTrajanje.Text = brDana.ToString();
}
else
{
MessageBox.Show("Odmor ne moze da se zavrsi pre nego sto pocne!!!",
"Obavestenje", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
}
}

69

Zadatak 2.19. Kontrola MonthCalendar
I deo zadatka
Kreirati WinForms aplikaciju pod nazivom Calendar. Kreirati formu Kalendar kao na slici
2.69 i podesiti kontrole kao to je prikazano u tabeli 2.22.

Slika 2.69. Design prozor forme Kalendar za Zadatak 2.19
Tabela 2.22. Svojstva i dogaaji kontrola forme Kalendar za Zadatak 2.19
Kontrola/Svojstva Name Text Dodatna svojstva i dogaaji
Label label1 Prvi dan u nedelji:
ComboBox cbDani Vreme pocetka:
Za svojstvo Items popuniti Collections
sa nazivima svih dana u nedelji
MonthCalendar mcKalendar Svojstvo ShowToday=False

Zahtevane funkcionalnosti aplikacije:
U zavisnosti koji dan korisnik izabere u cbDani od tog dana se prikazuje mcKalendar
(videti sliku 2.70).

Slika 2.70. Izlazni ekrani forme Kalendar
70

Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Calendar
{
public partial class Kalendar : Form
{
public Kalendar()
{
InitializeComponent();
}

private void cbDani_SelectedIndexChanged(object sender, EventArgs e)
{
switch (cbDani.Text)
{
case "Ponedeljak": mcKalendar.FirstDayOfWeek = Day.Monday; break;
case "Utorak": mcKalendar.FirstDayOfWeek = Day.Tuesday; break;
case "Sreda": mcKalendar.FirstDayOfWeek = Day.Wednesday; break;
case "Cetvrtak": mcKalendar.FirstDayOfWeek = Day.Thursday; break;
case "Petak": mcKalendar.FirstDayOfWeek = Day.Friday; break;
case "Subota": mcKalendar.FirstDayOfWeek = Day.Saturday; break;
case "Nedelja": mcKalendar.FirstDayOfWeek = Day.Sunday; break;
default: mcKalendar.FirstDayOfWeek = Day.Default; break;
}
}
}
}
II deo zadatka
U isti projekat dodati novu formu Kalkulator_odmora_2 kao na slici 2.71 i podesiti
kontrole kao to je prikazano u tabeli 2.23.

Slika 2.71. Design prozor forme Kalkulator_odmora_2 za Zadatak 2.19
71

Tabela 2.23. Svojstva i dogaaji kontrola forme Kalkulator_odmora_2 za Zadatak 2.19
Kontrola/Svojstva Name Text Dodatna svojstva i dogaaji
Label label1 Selektuj odmor:
MonthCalendar mcKalendar
Svojstva:
MaxSelectionCount=100
ShowToday=False
Button btnIzracunaj Izracunaj odmor Dogaaj Click
Label label2
Ukupno dana
odmora:

TextBox tbOdmorTrajanje Svojstvo Enabled=False

Zahtevane funkcionalnosti aplikacije:
Klikom na dugme btnIzracunaj u tbOdmorTrajanje se prikazuje izraunata vrednost
ukupnog broja dana odmora kao na slici 2.72.

Slika 2.72. Izlazni ekran forme Kalkulator_odmora_2
Napomena: Kako bi se prilikom startovanja projekta startovala ova forma
(Kalkulator_odmora_2) neophodno je u fajlu Program.cs izmeniti poslednju liniju koda u
kojoj se navodi koja forma je run (Application.Run(new Kalkulator_odmora_2());).

72

Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Calendar
{
public partial class Kalkulator_odmora_2 : Form
{
public Kalkulator_odmora_2()
{
InitializeComponent();
}

private void btnIzracunaj_Click(object sender, EventArgs e)
{
TimeSpan trajanje = mcKalendar.SelectionEnd - mcKalendar.SelectionStart;

if (trajanje.Days >= 0)
{
int brDana = (int)trajanje.Days + 1;
tbOdmorTrajanje.Text = brDana.ToString();
}
}
}
}


73

Zadatak 2.20. Rad sa generikim redom (Queue<Type>)
Kreirati WinForms aplikaciju pod nazivom Generic. Kreirati formu frmIspit kao na slici
2.73 i podesiti kontrole kao to je prikazano u tabeli 2.24.

Slika 2.73. Design prozor forme za Zadatak 2.20
Tabela 2.24. Svojstva i dogaaji kontrola za Zadatak 2.20
Kontrola/Svojstva Name Text Dodatna svojstva i dogaaji
Label label1 Ime
Label label2 Index
TextBox cbDani tbIme
TextBox mcKalendar tbIndex
Button btnPotvrdi Potvrdi Dogaaj Click
Button btnOdustani Odustani Dogaaj Click
Button btnListaj Prikazi sve Dogaaj Click
Button btnIzbrisi Izbrisi sve Dogaaj Click
Button btnIzbaciPrvog Izbaci prvog Dogaaj Click
TextBox tbSpisak
Svojstva:
Multiline=True
ReadOnly=True
ScrollBars=Vertical

Zahtevane funkcionalnosti aplikacije:
Kreirati klasu Student (Student.cs) koja sadri dva privatna atributa: ime (string) i
index (int). Kreirati parametarski konstruktor koji prosleene podatke o imenu i
indeksu upisuje u odgovarajue atribute. Kreirati read propertije za oba atributa.
Klikom na dugme Potvrdi kreirati novog studenta (objekat stud klase Student) sa
podacima koje se itaju iz odgovarajuih kontrola (tbIme i tbIndex) i ubaciti ga u
generiki red studenata. Nakon toga isprazniti tbIme i tbIndex.
Klikom na dugme Odustani prazne se kontrole tbIme i tbIndex.
74

Klikom na dugme Prikazi sve (btnListaj) ispisati sve studente iz reda u kontrolu
tbSpisak (vidi sliku 2.74.).

Slika 2.74. Izlazni ekrani forme frmIspit
Klikom na dugme Izbrisi sve (btnIzbrisi) brise sve studente iz reda.
Klikom na dugme Izbaci prvog (btnIzbaci) izbacuje prvog studenta iz reda (vidi
sliku 2.75.).

Slika 2.75. Klik na Prikazi sve nakon izbacivanja prvog studenta



75

Reenje:
// Student.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Generic
{
class Student
{
private string ime;
private int index;

public Student(string s, int i)
{
ime = s;
index = i;
}

public string IsipsImena()
{
return ime;
}

public int IsipsIndexa()
{
return index;
}
}
}

// frmIspit.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Generic
{
public partial class frmIspit : Form
{
private Queue<Student> red;

public frmIspit()
{
InitializeComponent();
red = new Queue<Student>(); // kreiranje reda studenata
}

// ubacivanje novog studenta u red
private void btnPotvrdi_Click(object sender, EventArgs e)
{
string s = tbIme.Text; // pamti ime
int i = int.Parse(tbIndex.Text); // pamti indeks
76

// kreira novog studenta, tj. objekat stud
Student stud = new Student(s, i);

red.Enqueue(stud); // ubacuje u red

// prazni TextBox kontrole
tbIme.Clear();
tbIndex.Clear();
}

// ispis studenata koji su ubaceni u red - I nacin
private void btnListaj_Click(object sender, EventArgs e)
{
tbSpisak.Clear(); // prazni TextBox
tbSpisak.AppendText("Spisak studenata:\n\n"); // dodaje tekst u TextBox

int brojac = 0; // ukupan broj studenata

// za svakog studenta uvecava brojac
// ispisuje redni broj, ime i indeks
foreach (Student stud in red)
{
++brojac;
tbSpisak.AppendText(" " + brojac.ToString() + ". " +
stud.IsipsImena() + "\t" +
(stud.IsipsIndexa()).ToString() + "\n");
}

// ispisuje ukupan broj studenata
tbSpisak.AppendText("\n\nUkupan broj studenata je " +
(red.Count()).ToString() + ".");
}

/* // ispis studenata koji su ubaceni u red - II nacin
private void btnListaj_Click(object sender, EventArgs e)
{
tbSpisak.Clear();
tbSpisak.AppendText("Spisak studenata:\n\n");
int brojac = 0;
IEnumerator<Student> ev = red.GetEnumerator();
while (ev.MoveNext())
{
++brojac;
tbSpisak.AppendText(" " + brojac.ToString() + ". " +
ev.Current.IsipsImena() + "\t" +
(ev.Current.IsipsIndexa()).ToString() + "\n");
}

tbSpisak.AppendText("\n\nUkupan broj studenata je " +
(red.Count()).ToString() + ".");
}*/

// brisanje sadrzaja TextBox kontrola za ime i prezime
private void btnOdustani_Click(object sender, EventArgs e)
{
tbIme.Clear();
tbIndex.Clear();
}

// praznjenje reda - izbacivanje svih studenata od prvog do poslednjeg
private void btnIzbrisi_Click(object sender, EventArgs e)
{
tbSpisak.Clear();
while (red.Count() != 0)
77

{
red.Dequeue();
}
}

// izbacivanje iz reda - izbacuje se prvi student
private void btnIzbaciPrvog_Click(object sender, EventArgs e)
{
tbSpisak.Clear();
red.Dequeue();
}
}
}

Predlog: Uraditi ovaj zadatak sa:
generikim stekom (Stack<Student>)
generikom listom (List<Student>)
ArrayList

78

Zadatak 2.21. Klasa Object prikaz nekih njenih metoda
Kreirati WinForms aplikaciju pod nazivom Klasa Object. Kreirati formu kao na slici 2.76 i
podesiti kontrole kao to je prikazano u tabeli 2.25.

Slika 2.76. Design prozor forme za Zadatak 2.21
Tabela 2.25. Svojstva i dogaaji kontrola za Zadatak 2.21
Kontrola/Svojstva Name Text Dodatna svojstva i dogaaji
Label label1 Unesi nesto
Label label2 Unesi nesto
TextBox txtPrvi
TextBox txtDrugi
Button btnEquals Equals Dogaaj Click
Button btnHashCode HashCode Dogaaj Click
Button btnGetType GetType Dogaaj Click
Button btnReferenceEquals ReferenceEquals Dogaaj Click
Label label3 Izlaz
RichTextBox rtbIzlaz

Zahtevane funkcionalnosti aplikacije:
Klikom na dugme Equals proverava se da li su uneti stringovi u txtPrvi i txtDrugi
jednaki. Rezulat metode Equals klase Object se prikazuje u rtbIzlaz.
Klikom na dugme HashCode se izraunava HashCode podatka koji je unet u
txtPrvi. Rezulat metode HashCode klase Object se prikazuje u rtbIzlaz.
Klikom na dugme GetType se ita tip podatka koji je unet u txtPrvi. Rezulat
metode GetType klase Object se prikazuje u rtbIzlaz.
Klikom na dugme ReferenceEquals se proverava da li dva objekta predstavljaju
istu instancu. Rezulat metode ReferenceEquals klase Object se prikazuje u rtbIzlaz.
Proveriti za sledea dva sluaja:
o string s1 = "abcd" i string s2 = s1
o string s3 = "abcd" I string s4 = String.Copy(s3)
79

Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Klasa_Object
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

// upis u RichTextBox
private void Stampaj(object o)
{
rtbIzlaz.AppendText(o.ToString() + "\n");
}

// provera jednakosti objekata
private void btnEquals_Click(object sender, EventArgs e)
{
Stampaj(Object.Equals(txtPrvi.Text, txtDrugi.Text));
}

// vraca HasCode za prvi TextBox
private void btnHashCode_Click(object sender, EventArgs e)
{
Stampaj(txtPrvi.Text.GetHashCode());
}

// vraca tip prvog TextBox-a
private void btnGetType_Click(object sender, EventArgs e)
{
int y;
double z;
object x = txtPrvi.Text;
if (int.TryParse(txtPrvi.Text, out y))
{
Stampaj(y.GetType());
}
else if (double.TryParse(txtPrvi.Text, out z))
{
Stampaj(z.GetType());
}
else
{
Stampaj(x.GetType());
}
}

// provera da li dva objekta predstavljaju istu instancu
private void btnReferenceEquals_Click(object sender, EventArgs e)
{
string s1 = "abcd";
string s2 = s1;
80

Stampaj(Object.ReferenceEquals(s1, s2)); // true

string s3 = "abcd";
string s4 = String.Copy(s3);
Stampaj(Object.ReferenceEquals(s3, s4)); // false
}
}
}


81

Zadatak 2.22. Klasa String prikaz nekih njenih metoda
Kreirati WinForms aplikaciju pod nazivom Klasa String. Kreirati formu kao na slici 2.77 i
podesiti kontrole kao to je prikazano u tabeli 2.26.

Slika 2.77. Design prozor forme za Zadatak 2.22 Slika 2.78. Izlazni prozor za Zadatak 2.22
Tabela 2.26. Svojstva i dogaaji kontrola za Zadatak 2.22
Kontrola/Svojstva Name Text Dodatna svojstva i dogaaji
Label label1 Unesi svoje ime
Label label2 Unesi ime svog kolege
TextBox txtJa
TextBox txtKolega
Button btnVelikaSlova Velika slova Dogaaj Click
Button btnMalaSlova Mala slova Dogaaj Click
Button btnPodedjenje Poredjenje Dogaaj Click
RichTextBox richTextBox1

Zahtevane funkcionalnosti aplikacije (Slika 2.78):
Klikom na dugme Velika slova tekst iz txtJa ispisati velikim slovima u
richTextBox1.
Klikom na dugme Mala slova tekst iz txtJa ispisati malim slovima u richTextBox1.
Klikom na dugme Poredjenje se poredi:
o moje i kolegino ime primenom metode Compare
o moje i kolegino ime primenom metode CompareTo
o kolegino i moje ime primenom metode CompareTo
o moje i moje ime primenom metode CompareTo
Rezultate poreenja ispisati u richTextBox1 kontroli.


82

Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Klasa_String
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Stampaj(object o)
{
richTextBox1.AppendText(o.ToString() + "\n");
}

// prebacivanje u velika slova
private void btnVelikaSlova_Click(object sender, EventArgs e)
{
Stampaj(txtJa.Text.ToUpper());
}

// prebacivanje u mala slova
private void btnMalaSlova_Click(object sender, EventArgs e)
{
Stampaj(txtJa.Text.ToLower());
}

// poredjenje
private void btnPoredjenje_Click(object sender, EventArgs e)
{
// poredjenje mog i koleginog imena primenom metode Comapare
Stampaj(String.Compare(txtJa.Text, txtKolega.Text));

// poredjenje mog i koleginog imena primenom metode ComapareTo
Stampaj(txtJa.Text.CompareTo(txtKolega.Text));

// poredjenje koleginog i mog imena
Stampaj(txtKolega.Text.CompareTo(txtJa.Text));

// poredjenje mog i mog imena
Stampaj(txtJa.Text.CompareTo(txtJa.Text)); // 0
}
}
}

83

Zadatak 2.23. Primer konverzije
Kreirati WinForms aplikaciju pod nazivom Konverzija. Kreirati formu kao na slici 2.79 i
podesiti kontrole kao to je prikazano u tabeli 2.27.

Slika 2.79. Design prozor forme za Zadatak 2.23 Slika 2.80. Izlazni prozor za Zadatak 2.23
Tabela 2.27. Svojstva i dogaaji kontrola za Zadatak 2.23
Kontrola/Svojstva Name Text Dodatna svojstva i dogaaji
Label label1 Prvi operand
Label label2 Drugi operand
TextBox txtPrvi
TextBox txtDrugi
Button btnIzracunaj Izracunaj Dogaaj Click
Label label3 Rezultat
TextBox txtRezultat

Zahtevane funkcionalnosti aplikacije (Slika 2.80):
Klikom na dugme Izracunaj se proverava da li su u txtPrvi i txtDrugi unete double
vrednosti. Ukoliko nisu u txtRezultat ispisati poruku: Prva vrednost nije realni broj
ili Druga vrednost nije realni broj. Ukoliko jesu izraunati zbir prve i druge
vrednosti i prikazuje ga u txtRezultat.

84

Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Konverzija
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void btnIzracunaj_Click(object sender, EventArgs e)
{
double prvi, drugi;

// provera da li je prvi operand double
if (!Double.TryParse(txtPrvi.Text, out prvi))
{
txtRezultat.Text = "Prva vrednost nije realni broj";
return;
}

// provera da li je drugi operand double
if (Double.TryParse(txtDrugi.Text, out drugi) != true)
{
txtRezultat.Text = "Druga vrednost nije realni broj";
return;
}

// sabiranje
double zbir = prvi + drugi;

// konvertovanje u string
txtRezultat.Text = zbir.ToString();
}
}
}

85

Zadatak 2.24. Manipulacija sa fajlovima i folderima
Kreirati WinForms aplikaciju pod nazivom Fajlovi i folderi. Kreirati formu kao na slici 2.81 i
podesiti kontrole kao to je prikazano u tabeli 2.28.

Slika 2.81. Design prozor forme za Zadatak 2.24
Tabela 2.28. Svojstva i dogaaji kontrola za Zadatak 2.24
Kontrola/Svojstva Name Text
Dodatna svojstva i
dogaaji
Label label1 Unesi naziv foldera
Label label2 Unesi lokaciju foldera
Label label3 Unesi naziv podfoldera
Label label4 Unesi naziv fajla
Label label5 Unesi novu lokaciju foldera
TextBox txtNazivFoldera
TextBox txtLokacijaFoldera
TextBox txtNazivPodfoldera
TextBox txtNazivFajla
TextBox txtNovaLokacija
Button btnIzracunaj Kreiraj folder Dogaaj Click
Button btnIzracunaj Prikazi podfoldere Dogaaj Click
Button btnIzracunaj Prikazi fajlove Dogaaj Click
Button btnIzracunaj Kreiraj podfolder Dogaaj Click
Button btnIzracunaj Kreiraj fajl u folderu Dogaaj Click
Button btnIzracunaj Premesti folder Dogaaj Click
Button btnIzracunaj Kopiraj sadrzaj foldera Dogaaj Click
RichTextBox richTextBox1
86

Zahtevane funkcionalnosti aplikacije:
Klikom na dugme Kreiraj folder se kreira folder sa zadatim nazivom
(txtNazivFoldera) na zadatoj lokaciji (txtLokacijaFoldera). Proveriti da li taj folder na
toj lokaciji ve postoji. Ukoliko postoji pitati korisnika da li eli da ga obrie i
postupiti po korisnikovim upustvima (brisati ili ne postojei folder). Ukoliko ne eli da
ga brie obavestiti ga da mora promeniti naziv foldera, ako eli da ga kreira na
navedenoj lokaciji. Prikazati odgovarajui MessageBox o uspehu kreiranja. Koristiti
try-catch blok.
Klikom na dugme Prikazi foldere se u richTextBox1 prikazuje spisak svih
podfoldera sa zadate lokacije (txtLokacijaFoldera).
Klikom na dugme Prikazi fajlove se u richTextBox1 prikazuje spisak svih faljlova sa
zadate lokacije (txtLokacijaFoldera).
Klikom na dugme Kreiraj podfolder se kreira podfolder sa zadatim imenom
(txtNazivPodfoldera) u okviru foldera (txtNazivFoldera). Proveriti da li taj podfolder u
tom folderu ve postoji. Ukoliko postoji pitati korisnika da li eli da ga obrie i
postupiti po korisnikovim upustvima (brisati ili ne postojei podfolder). Prikazati
odgovarajui MessageBox o uspehu kreiranja. Koristiti try-catch blok.
Klikom na dugme Kreiraj fajl u folderu se kreira fajl sa zadatim imenom
(txtNazivFajla) u okviru foldera (txtNazivFoldera). Prikazati odgovarajui MessageBox
o uspehu kreiranja. Koristiti try-catch blok.
Klikom na dugme Premesti folder se kopira sadrzaj foldera (txtNazivFoldera) na
novu lokaciju (txtNovaLokacija). Prikazati odgovarajui MessageBox o uspehu
premetanja. Koristiti try-catch blok.
Klikom na dugme Kopiraj sadrzaj foldera se kopira sadrzaj foldera
(txtNazivFoldera) na novu lokaciju (txtNovaLokacija). Prikazati odgovarajui
MessageBox o uspehu kopiranja. Koristiti try-catch blok.

Napomena: Za kopiranje direktorijuma je zgodno koristiti metodu CopyDirectory koja je
definisana u klasi FileSystem. Ova klasa je definisana u VisualBasic-u i mora se dodati
referenca Microsoft.VisualBasic u projekat. Ovaj postupak je opisan u Zadatku 16.


87

Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO; // dodato zbog klasa Directory, DirectoryInfo, File, FileInfo
using Microsoft.VisualBasic.FileIO; // dodato zbog klase FileSystem

namespace Fajlovi_i_folderi
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

// kreira folder ako on ne postoji
// a ako postoji brise postojeci, pa kreira novi
private void btnKreirajFolder_Click(object sender, EventArgs e)
{
string lokacija = txtLokacijaFoldera.Text;
string naziv = txtNazivFoldera.Text;
try
{
Environment.CurrentDirectory = lokacija;

if (!Directory.Exists(naziv))
{
// Kreiraj direktorijum ako ne postoji
Directory.CreateDirectory(naziv);
MessageBox.Show("Direktorijum je kreiran", "Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
if (MessageBox.Show("Direktorijum vec postoji. Hoces li da ga
obrises?", "Obavestenje",
MessageBoxButtons.OKCancel,
MessageBoxIcon.Question) == DialogResult.OK)
{
Directory.Delete(naziv, true);
Directory.CreateDirectory(naziv);
MessageBox.Show("Direktorijum je kreiran", "Obavestenje",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
else
{
MessageBox.Show("Moras promeniti naziv direktorijuma ili
lokaciju", "Obavestenje", MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
}
}



88

catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

// prikaz svih poddirektorijuma u folderu
private void btnPrikaziPodfoldere_Click(object sender, EventArgs e)
{
string lokacija = txtLokacijaFoldera.Text;
StringBuilder sb = new StringBuilder();
DirectoryInfo osnovni = new DirectoryInfo(@lokacija);
DirectoryInfo[] podfolderi = osnovni.GetDirectories();
foreach (DirectoryInfo di in podfolderi)
{
sb.Append("Podfolder: " + di.Name + "\n");
}
richTextBox1.Text = sb.ToString();
}

// prikazuje sve fajlove
private void btnPrikaziFajlove_Click(object sender, EventArgs e)
{
StringBuilder sb = new StringBuilder();
DirectoryInfo osnovni = new DirectoryInfo(txtLokacijaFoldera.Text);
FileInfo[] fi = osnovni.GetFiles();
foreach (FileInfo f in fi)
{
sb.Append("Naziv fajla: " + f.Name + "\n");
}
richTextBox1.Text = sb.ToString();
}

// kreira podfolder ako on ne postoji
// a ako postoji brise postojeci, pa kreira novi
private void btnKreirajPodfolder_Click(object sender, EventArgs e)
{
string lokacijaFoldera = Path.Combine(txtLokacijaFoldera.Text,
txtNazivFoldera.Text);
string lokacijaPodfoldera = Path.Combine(txtLokacijaFoldera.Text,
txtNazivPodfoldera.Text);
string naziv = txtNazivPodfoldera.Text;

try
{
DirectoryInfo dpodfolder = new DirectoryInfo(lokacijaPodfoldera);
DirectoryInfo dfolder = new DirectoryInfo(lokacijaFoldera);

if (!dpodfolder.Exists)
{
// Kreiraj poddirektorijum ako ne postoji
// Ako ne postoji parent od poddirektorijuma i njega kreira
// automatski
dfolder.CreateSubdirectory(naziv);
MessageBox.Show("Poddirektorijum je kreiran", "Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
if (MessageBox.Show("Poddirektorijum vec postoji. Hoces li da ga
obrises?", "Obavestenje",
MessageBoxButtons.OKCancel,
MessageBoxIcon.Question) == DialogResult.OK)
{
89

// brisanje praznog foldera
Directory.Delete(lokacijaFoldera, true);
//FileSystem.DeleteDirectory(naziv, DeleteDirectoryOption.DeleteAllContents);
// moze i ovako
MessageBox.Show("Poddirektorijum je obrisan", "Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
dfolder.CreateSubdirectory(naziv);
MessageBox.Show("Poddirektorijum je kreiran", "Obavestenje",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

// kreira fajl u folderu
private void btnKreirajFajl_Click(object sender, EventArgs e)
{
try
{
string lokacijaFoldera = Path.Combine(txtLokacijaFoldera.Text,
txtNazivFoldera.Text);
File.CreateText(lokacijaFoldera + @"\" + txtNazivFajla.Text);
MessageBox.Show("Fajl je kreiran", "Obavestenje", MessageBoxButtons.OK,
MessageBoxIcon.Asterisk);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

// premestanje fajlova i foldera
private void btnPremestiFolder_Click(object sender, EventArgs e)
{
try
{
// obrati paznju: npr. Directory.Move(@"C:\Proba\Novi ", @"C:\Temp\Moj")
// znaci da se folder Novi premesta u C:\Temp pod nazivom Moj
Directory.Move(txtLokacijaFoldera.Text, txtNovaLokacija.Text);
MessageBox.Show("Folder je premesten", "Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Asterisk);

/* // premestanje fajlova
File.Move(@"C:\Temp\podaci1.rtf", @"C:\Temp\Mama\Podaci2.rtf");
MessageBox.Show("Fajl je kopiran", "Obavestenje", MessageBoxButtons.OK,
MessageBoxIcon.Asterisk);*/
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}







90

// kopiranje sadrzaja foldera na novu lokaciju
private void btnKopirajFolder_Click(object sender, EventArgs e)
{
try
{
// prikazuje se standardni prozor za kopiranje zbog UIOption.AllDialogs
FileSystem.CopyDirectory(txtLokacijaFoldera.Text, txtNovaLokacija.Text,
UIOption.AllDialogs);
MessageBox.Show("Folder je kopiran", "Obavestenje", MessageBoxButtons.OK,
MessageBoxIcon.Asterisk);

/* // kopiranje fajla
File.Copy(txtLokacijaFoldera.Text, txtNovaLokacija.Text);
MessageBox.Show("Fajl je premesten", "Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Asterisk);*/
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}

91

Zadatak 2.25. Rad sa tokovima - Upis i itanje txt fajlova
Kreirati WinForms aplikaciju pod nazivom Upis i citanje iz fajlova. Kreirati formu kao na
slici 2.82 i podesiti kontrole kao to je prikazano u tabeli 2.29.

Slika 2.82. Design prozor forme za Zadatak 2.25
Tabela 2.29. Svojstva i dogaaji kontrola za Zadatak 2.25
Kontrola/Svojstva Name Text
Dodatna svojstva i
dogaaji
Button btnUpis Upisi u fajl Dogaaj Click
Button btnCitaj Citaj txt fajl Dogaaj Click
RichTextBox richTextBox1

Zahtevane funkcionalnosti aplikacije:
Klikom na dugme Upisi u fajl se kreira fajl Folderi.txt na lokaciji C:\Temp u koji se
upisuje spisak svih sistemskih fajlova i foldera sa C diska. Prikazati odgovarajui
MessageBox o uspehu kreiranja.
Klikom na dugme Citaj txt fajl se u richTextBox1 prikazuje sadraj fajla Folderi.txt
sa lokacije C:\Temp (fajl koji je u prethodnoj taki kreiran).


92

Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO; // dodato zbog DirectoryInfo, FileInfo, StreamWriter

namespace Upis_i_citanje_iz_fajlova
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

// upis svih sistemskih fajlova sa C diska u txt fajl
private void btnUpis_Click(object sender, EventArgs e)
{
DirectoryInfo root = new DirectoryInfo(@"C:\");

// kreira niz od sistemskih fajlova
DirectoryInfo[] cDirs = root.GetDirectories();

FileInfo fi = new FileInfo(@"C:\Temp\Folderi.txt");

// ako fajlovi vec postoje onda se brisu
if (fi.Exists)
{
fi.Delete();
}

// kreiranje instance FileStream klase sa zadatom lokacijom i modom
FileStream fs = new FileStream(@"C:\Temp\Folderi.txt", FileMode.CreateNew);

// kreiranje instance StreamWriter klase sa instancom FileStream klase
StreamWriter sw = new StreamWriter(fs);

// svaki sistemski fajl iz niza upisuje se u instancu StreamWriter klase
foreach (DirectoryInfo dir in cDirs)
{
sw.WriteLine(dir.Name);
}

sw.Close(); // zatvaranje ulaznog toka StreamWriter
fs.Close(); // zatvaranje FileStream toka

MessageBox.Show("Fajl kreiran");
}

// citanje txt fajla
private void btnCitaj_Click(object sender, EventArgs e)
{
string putanja = @"C:\Temp\Folderi.txt";

// kreiranje instance FileStream klase sa zadatom lokacijom i
// modom za citanje (Open mod)
FileStream fs = new FileStream(putanja, FileMode.Open);
93

// kreiranje instance StreamWriter klase sa instancom FileStram klase
StreamReader sr = new StreamReader(fs);

// kreiranje instance StringBuilder klase
StringBuilder sb = new StringBuilder();

string linija = "";
// upis u instancu StringBulilder klase red po red
while ((linija = sr.ReadLine()) != null)
{
sb.Append(linija + "\n");
}

/* // moze i ovakva while petlja - upis karakter po karakter
while (sr.Peek() != -1) // uzima karakter po karakter
{
sb.Append((char)(sr.Read()));
}
*/

sr.Close(); // zatvaranje izlaznog toka StreamReader
fs.Close(); // zatvaranje FileStream toka

richTextBox1.Text = sb.ToString();
}
}
}

94

Zadatak 2.26. Kompleksni zadatak
Kreirati WinForms aplikaciju pod nazivom Kompleksni zadatak - resenje. Kreirati formu
frmSkola kao na slici 2.83 i podesiti kontrole kao to je prikazano u tabeli 2.30.

Slika 2.83. Design prozor forme frmSkola za Zadatak 2.26
Tabela 2.30. Svojstva i dogaaji kontrola frmSkola za Zadatak 2.26
Kontrola/Svojstva Name Text
Dodatna svojstva i
dogaaji
ListBox lblSkola
Button btnUnos Unos studenata Dogaaj Click
Button btnIzbaci Izbaci studenta Dogaaj Click
Button btnIzbaciSve Izbaci sve Dogaaj Click
Button btnExport Export u txt Dogaaj Click
Button btnZatvori Zatvori Dogaaj Click

U projekat dodati jo jednu formu frmUnosStudenata kao na slici 2.84 i podesiti kontrole
kao to je prikazano u tabeli 2.31.

Slika 2.84. Design prozor forme frmUnosStudenata za Zadatak 2.26
95

Tabela 2.31. Svojstva i dogaaji kontrola frmUnosStudenata za Zadatak 2.26
Kontrola/Svojstva Name Text
Dodatna svojstva i
dogaaji
Label label1 Smer:
Label label2 Ime i prezime:
Label label3 Godina rodjenja:
ComboBox cbSmer
Dogaaji:
Validating i KeyPress
TextBox tbIme Dogaaj Validating
TextBox tbGodRodjenja Dogaaj KeyPress
GroupBox gbPol Pol
RadioButton rbMuski Muski
RadioButton rbZenski Zenski
Button btnPrihvati Prihvati Dogaaj Click
Button btnOtkazi Otkazi Dogaaj Click
Button btnZatvori Zatvori Dogaaj Click
ErrorProvider errGreska

Zahtevane funkcionalnosti aplikacije:
Kreirati javnu klasu Student koja sadri:
o privatne atribute: ime (string), smer (string), pol (string), godRodjenja (int)
o odgovarajue Propertije
o podrazumevani konstrukor koji postavlja polja ime, smer i pol da imaju
vrednost praznog stringa, a godRodjenja da bude 0
o parametarski konstruktor koji kao ulazne parametre dobija ime, smer, pol i
godRodjenja
o override-ovati metodu ToString() tako da vraa podatke o studentu u obliku:
Ime i prezime: Ana Savi | Pol: enski | Godina roenja: 1978 | Smer:
Informacione tehnologije
Obezbediti sledee funkcionalnosti frmSkola:
o klik na dugme Unos studenta otvara se forma frmUnosStudenata i ubacuje
studenta sa unetim podacima u generiki red studenata (Queue<Student>) i
prikazuje red u ListBox kontroli (obavezno korienje klase Student i Queue
za prikaz podataka u listBox-u).
o klik na dugme Izbaci studenta izbacuje prvog studenta iz reda, prikazuje
MessageBox sa odgovarajuim obavetenjem i prikazuje auriran red u
ListBox kontroli.
o klik na dugme Izbaci sve izbacuje sve studente iz reda i prikazuje
MessageBox sa odgovarajuim obavetenjem
o klik na dugme Export u txt ubacuje red studenata u fajl studenti.txt i
prikazuje MessageBox sa odgovarajuim obavetenjem
o klik na dugme Zatvori zatvara aplikaciju
Obezbediti sledee funkcionalnosti frmUnosStudenata:
96

o onemoguiti da korisnik sam unosi novi naziv smera u ComboBox kontrolu,
oja sadri sledee stavke: Informacione tehnologije, Elektronsko poslovanje,
Raunarska multimedija, Organizacija poslovnih sistema.
o onemoguiti da korisnik za godinu roenja unosi bilo ta osim brojeva
(koristiti dogaaj KeyPress)
o za kontrole cbSmer i txtIme implementirati dogaaj Validating uz postavljanje
ErrorProvider kontrole sa odgovarajuim obavetenjem
o klik na dugme Prihvati proveriti ispravnost unetih podataka i ako je sve OK
onda vratiti odgovarjui DialogResult ili u sluaju da korisnik nije uneo sve
podatke, obavestiti ga o tome i onemoguiti snimanje
o klik na dugme Otkazi resetovati sve kontrole na formi
o klik na dugme Zatvori zatvoriti formu.

Reenje:
// Student.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Kompleksni_zadatak___resenje
{
class Student
{
private string ime;
private int godRodjenja;
private string pol;
private string smer;

public string Ime
{
get { return this.ime; }
set { this.ime = value; }
}

public int GodRodjenja
{
get { return this.godRodjenja; }
set { this.godRodjenja = value; }
}

public string Pol
{
get { return this.pol; }
set { this.pol = value; }
}

public string Smer
{
get { return this.smer; }
set { this.smer = value; }
}
97


public Student()
{
this.ime = "";
this.pol = "";
this.smer = "";
this.godRodjenja = 0;
}

public Student(string s, string i, string p, int gr)
{
this.smer = s;
this.ime = i;
this.pol = p;
this.godRodjenja = gr;
}

public override string ToString()
{
return "Ime i prezime: " + this.ime + " | Pol: " + this.pol + " | Godina
rodjenja: " + godRodjenja.ToString() + " | Smer: " + this.smer;
}
}
}

// frmSkola.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO; // dodato zbog klase StreamWriter

namespace Kompleksni_zadatak___resenje
{
public partial class frmSkola : Form
{
private Queue<Student> studenti;

public frmSkola()
{
InitializeComponent();
studenti = new Queue<Student>();
}

// prikaz svih studenta u ListBox kontroli
private void prikaziSpisak()
{
foreach (Student s in studenti)
{
lbSpisak.Items.Add(s.ToString());
}
}




// otvaranje frmUnosStudenata i sakupljanje podataka
// upis podataka u studenta
98

// upis studenta u red
// poziv metode za prikaz studenata iz reda
private void btnUnos_Click(object sender, EventArgs e)
{
frmUnosStudenata frm = new frmUnosStudenata();

if (DialogResult.OK == frm.ShowDialog())
{
// s = new Student(frm.Smer, frm.Ime, frm.Pol, frm.GodRodjenja);
studenti.Enqueue(frm.stud);
lbSpisak.Items.Clear();
prikaziSpisak();
}
}

// izbacivanje prvog studenta u redu
// poziv metode za prikaz studenata iz reda
private void btnIzbaci_Click(object sender, EventArgs e)
{
if (studenti.Count != 0)
{
studenti.Dequeue();
lbSpisak.Items.Clear();
MessageBox.Show("Prvi student je izbacen", "Obavestenje");
prikaziSpisak();
}
else
{
MessageBox.Show("U redu nema studenata", "Obavestenje");
}
}

// izbacivanje svih studenata iz reda
private void btnIzbaciSve_Click(object sender, EventArgs e)
{
studenti.Clear();
lbSpisak.Items.Clear();
MessageBox.Show("Svi studenti su izbaceni", "Obavestenje");
}

// upis reda studenata u txt fajl
private void btnExport_Click(object sender, EventArgs e)
{
StreamWriter sw = new StreamWriter("studenti.txt");
foreach (Student s in studenti)
sw.WriteLine(s.ToString());
sw.Close();
MessageBox.Show("Fajl studenti.txt je uspeno snimljen", "Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}

// zatvaranje forme
private void btnZatvori_Click(object sender, EventArgs e)
{
this.Close();
}
}
}


99

// frmUnosStudenata.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.VisualBasic; // dodato zbog klase Information

namespace Kompleksni_zadatak___resenje
{
public partial class frmUnosStudenata : Form
{
internal Student stud;

public frmUnosStudenata()
{
InitializeComponent();
}

private string vratiPol()
{
string pol = "";
if (rbMuski.Checked == true)
{
pol = "Muski";
}
else
{
pol = "Zenski";
}

return pol;
}

// resetovanje kontrola
private void resetuj()
{
tbIme.Clear();
tbGodRodjenja.Clear();
cbSmer.Text = "";
}

// onemogucavanje unosa svega sem brojeva u TextBox kontrolu za godinu rodjenja
private void tbGodRodjenja_KeyPress(object sender, KeyPressEventArgs e)
{
if (Information.IsNumeric(e.KeyChar) || e.KeyChar == '\b')
{
e.Handled = false;
}
else
{
e.Handled = true;
}
}

// validacija TextBox-a za ime
private void tbIme_Validating(object sender, CancelEventArgs e)
{
if (tbIme.Text == "")
{
100

errGreska.SetError(tbIme, "Morate uneti ime i prezime");
tbIme.Focus();
}
else
{
errGreska.Clear();
}
}

// validacija TextBox-a za godinu rodjenja
private void tbGodRodjenja_Validating(object sender, CancelEventArgs e)
{
if (tbGodRodjenja.Text == "")
{
errGreska.SetError(tbGodRodjenja, "Morate uneti godinu rodjenja");
tbGodRodjenja.Focus();
}
else
{
errGreska.Clear();
}
}

// validacija ComboBox-a smer
private void cbSmer_Validating(object sender, CancelEventArgs e)
{
if (cbSmer.Text == "")
{
errGreska.SetError(cbSmer, "Morate izabrati smer");
cbSmer.Focus();
}
else
{
errGreska.Clear();
}
}

// onemogucivanje unosa teksta u ComboBox kontrolu
private void cbSmer_KeyPress(object sender, KeyPressEventArgs e)
{
errGreska.SetError(cbSmer, "Morate izabrati smer");
e.Handled = true;
}

// vracanje odogovarajuceg DialoGResult-a
private void btnPrihvati_Click(object sender, EventArgs e)
{
if (tbIme.Text != "" && tbGodRodjenja.Text != "" && cbSmer.Text != "")
{
stud = new Student(cbSmer.Text, tbIme.Text, vratiPol(),
int.Parse(tbGodRodjenja.Text));

DialogResult = DialogResult.OK;
}
else
{
MessageBox.Show("Niste uneli sve podatke", "Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}




101

// resetovanje kontrola
private void btnOtkazi_Click(object sender, EventArgs e)
{
resetuj();
}

// zatvaranje forme
private void btnZatvori_Click(object sender, EventArgs e)
{
this.Close();
}
}
}



102

Zadatak 2.27. Kontrole MenuStrip, ContextMenuStrip, HelpProvider, ToolTip,
StatusStrip
Kreirati WinForms aplikaciju pod nazivom Rad sa menijima. Kreirati formu frmRegistracija
kao na slici 2.85 i podesiti kontrole kao to je prikazano u tabeli 2.32.

Slika 2.85. Design prozor frmRegistracija za Zadatak 2.27
Tabela 2.32. Svojstva i dogaaji kontrola frmRegistracija za Zadatak 2.27
Kontrola/Svojstva Name Text
Dodatna svojstva i
dogaaji
MenuStrip MenuStrip1
Label label1 Ime
Label label2 Prezime
Label label3 Grad
TextBox tbIme
TextBox tbPrezime
ComboBox cbGrad
CheckBox cbStudent Student
Label label4 Datum
DataTimePicker dtpDatum
GroupBox groupBox1 Iskustvo
RadioButton rb1 do 1 godine
RadioButton rb2 od 1 do 4
RadioButton rb3 od 5 do 9
RadioButton rb4 10 ili vie
CheckedListBox clbHobi
Svojstvo
CheckOnClick=True
Button btnSnimi &Snimi Dogaaj Click
Button btnOtkazi &Otkazi Dogaaj Click
StatusStrip statusStrip1
HelpProvider helpProvider1
ToolTip toolTip1
ErrorProvider errGreska
ContextMenuStrip contextMenuStrip1
103

Kontrola menuStrip1 sadri dva menija: Novi i Info. Meni Novi ima dva podmenija Kreiraj i
Snimi, s tim da je Snimi disejblovano dok se neki korisnik ne registruje.
Konteksni meni (contextMenuStrip1) sadri dve opcije: Snimi i Otkazi. Ovaj meni treba
povezati sa formom, odnosno omoguiti njegovo pojavljivanje kad korisnik klikne desnim
klikom mia bilo gde na formi. To se postie tako to se svojstvo ContextMenuStrip forme
setuje na contextMenuStrip1.
Za statusStrip1 za svojstvo Items kliknuti na tri takice i otvara se prozor kao na slici 2.86.
Dodati statusnu labelu pod nazivom tslPoruka (vidi sliku 2.86).

Slika 2.86. Unos kolekcije item-a u StatusStrip kontrolu
Kontrolu toolTip1 povezati sa btnSnimi i btnOtkazi. Odnosno svojstvo ToolTip on toolTip1 za
dugme btnSnimi setovati na Registruj clana, a za dugme btnOtkazi na Resetuj kontrole.
Kontrolu helpProvider1 povezati sa btnSnimi i btnOtkazi. Prvo za obe kontrole je potrebno
setovati njihovo svojstvo ShowHelp on helpProvider1. Potom, svojstvo HelpString on
helpProvider1 za dugme btnSnimi setovati na Pomoc: Mozes snimati sve clanove u jedan
fajl, a za dugme btnOtkazi na Ne trebati help za mene.
U projekat dodati jo jednu formu frmInformacije kao na slici 2.87. Tekst je smeten u dve
labele, a za dugme OK treba obezbediti da se na njegov klik ova forma zatvara.

Slika 2.87. Forma frmInformacije
104

Zahtevane funkcionalnosti aplikacije:
Kreirati klasu Clan koja sadri odogovarajue propertije za sve kontrole u koje se
unose podaci na formi, podrazumevani i parametarski konstruktor, kao i preklopljenu
metodu ToString().
ComboBox sa gradovima (cbGrad) se puni dinamiki u kodu sa vrednostima:
Beograd, Novi Sad, Pancevo, Nis, Krusevac.
CheckedListBox sa hobijima (clbHobi) se puni dinamiki u kodu sa vrednostima:
Sport, Knjiga, Film, Setnja, Putovanje, Spavanje, Internet, Muzika.
Polje za datum (dtpDatum) postaviti na sistemski datum.
Prilikom zatvaranja forme prikazuje se MessageBox sa pitanjem Da li ste sigurni da
zelite da zatvorite aplikaciju? i dva dugmeta (Yes i No).
Klikom na padajui meni Novi/Kreiraj kontrole postaju dostupne za upis podataka,
kao i meni Snimi.
Klikom na padajui meni Novi/Snimi otvara se SaveFileDialog sa sledeim
karakteristikama:
o Inicijalni direktorijum je C:/Temp
o Naziv fajla je Clanovi
o Format fajla je txt
o Naslov dijaloga je Klub uspesnih
o Omoguiti overwrite fajla i validaciju naziva fajla
Prilikom snimanja prvo se podaci ubacuju u objekat klase Clan, a potom iz objekta u
txt fajl.
Kada je fajl sauvan u StatusBar-u se prikazuje poruka: Clan je sacuvan.
Konteksni meni (contextMenuStrip1) opcija Snimi ima istu funkcionalnost kao
Novi/Snimi i dugme Snimi, a opcija Otkazi ima istu funkcionalnost kao dugme Otkazi
(resetuje sve kontrole).
Klikom na meni Info otvara se forma frmInformacije.



105

Reenje:
// Clan.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Rad_sa_menijima
{
class Clan
{
private string ime;
private string prezime;
private string grad;
private bool student;
private DateTime datum;
private string iskustvo;
private List<string> hobi;

public string Ime { get { return this.ime; } }
public string Prezime { get { return this.prezime; } }
public string Grad { get { return this.grad; } }
public bool Student { get { return this.student; } }
public DateTime Datum { get { return this.datum; } }
public string Iskustvo { get { return this.iskustvo; } }
public List<string> Hobi { get { return this.hobi; } }

public Clan()
{
this.ime = "";
this.prezime = "";
this.grad = "";
this.student = false;
this.datum = System.DateTime.Now;
this.iskustvo = "";
this.hobi.Clear();
}

public Clan(string ime, string prezime, string grad, bool student, DateTime
datum, string iskustvo, List<string> hobi)
{
this.ime = ime;
this.prezime = prezime;
this.grad = grad;
this.student = student;
this.datum = datum;
this.iskustvo = iskustvo;
this.hobi = hobi;
}

public override string ToString()
{
string pom = "Ime: " + this.ime + "\r\nPrezime: " + this.prezime + "\r\nGrad:
" + this.grad + "\r\nStudent: " + this.student + "\r\nDatum: "
+ this.datum + "\r\nIskustvo: " + this.iskustvo + "\r\nHobi: ";
foreach (string s in this.hobi)
pom += (s + " ");
return pom;
}
}
}
106

// frmRegistracija.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO; // dodato zbog StreamWriter

namespace Rad_sa_menijima
{
public partial class frmRegistracija : Form
{
private string[] spisakGradova = {"Beograd", "Novi Sad", "Pancevo", "Nis",
"Krusevac" };
private string[] spisakHobija = {"Sport", "Knjiga", "Film", "Setnja",
"Putovanje", "Spavanje", "Internet", "Muzika"};

public frmRegistracija()
{
InitializeComponent();

// dinamicko popunjavanje ComboBox kontrole
foreach (string s in spisakGradova)
{
cbGrad.Items.Add(s);
}

// dinamicko popunjavanje CheckedListBox kontrole
foreach (string s in spisakHobija)
{
clbHobi.Items.Add(s);
}

zakljucaj();
ocisti();
}

// zabranjuje pristup kontrolama
private void zakljucaj()
{
tbIme.Enabled = false;
tbPrezime.Enabled = false;
cbGrad.Enabled = false;
cbStudent.Enabled = false;
dtpDatum.Enabled = false;
groupBox1.Enabled = false;
clbHobi.Enabled = false;
contextMenuStrip1.Enabled = false;
btnSnimi.Enabled = false;
btnOtkazi.Enabled = false;
snimiToolStripMenuItem.Enabled = false;
}

// omogucava pristup kontrolama
private void otkljucaj()
{
tbIme.Enabled = true;
tbPrezime.Enabled = true;
cbGrad.Enabled = true;
cbStudent.Enabled = true;
107

dtpDatum.Enabled = true;
groupBox1.Enabled = true;
clbHobi.Enabled = true;
contextMenuStrip1.Enabled = true;
btnSnimi.Enabled = true;
btnOtkazi.Enabled = true;
snimiToolStripMenuItem.Enabled = true;
}

// resetuje kontrole na pocetne vrednosti
private void ocisti()
{
tbIme.Clear(); // ili tbIme.Text = String.Empty ili tbIme.Text = ""
tbPrezime.Clear();
cbStudent.Checked = false;
rb1.Checked = true;
dtpDatum.Value = System.DateTime.Now;
// tslPoruka.Text = String.Empty;
cbGrad.Text = spisakGradova[0];

// resetovanje svih elemenata u CheckedListBox kontroli
// svojstvo CheckedIndices vraca kolekciju tj. skup indeksa cekiranih elem.
// svojstvo CheckState setuje stanje pojedinacnih CheckBox-ova na
// Checked ili Unchecked
foreach (int i in clbHobi.CheckedIndices)
{
clbHobi.SetItemCheckState(i, CheckState.Unchecked);
}
}

// vraca svojstvo Text selektovanog radioButton-a za iskustvo
private string vratiIskustvio()
{
string s;
if (rb1.Checked) s = rb1.Text;
else if (rb2.Checked) s = rb2.Text;
else if (rb3.Checked) s = rb3.Text;
else s = rb4.Text;
return s;
}

// vraca listu selektovanih hobija
private List<string> vratiHobi()
{
List<string> hobi = new List<string>();
foreach (string s in clbHobi.CheckedItems)
hobi.Add(s + " ");
return hobi;
}

// vraca true ako je selektovan student ili false ukoliko nije
private bool vratiStudent()
{
bool student = false;
if (cbStudent.Checked)
student = true;
return student;
}






108

// dogadjaj u trenutku zatvaranja forme - pre nego sto se zatvori
private void frmRegistracija_FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show("Da li ste sigurni da zelite da zatvorite
aplikaciju?", "Potvrda", MessageBoxButtons.YesNo,
MessageBoxIcon.Question) != DialogResult.Yes)
{
e.Cancel = true;
}
}

// dogadjaj Click za dugme Snimi
private void btnSnimi_Click(object sender, EventArgs e)
{
snimi();
}

// dogadja Click za dugme Otkazi
private void btnOtkazi_Click(object sender, EventArgs e)
{
ocisti();
tslPoruka.Text = String.Empty;
}

// dogadjaj Click za MenuStrip-Kreiraj
private void kreirajToolStripMenuItem_Click(object sender, EventArgs e)
{
tslPoruka.Text = String.Empty;
ocisti();
otkljucaj();
}

// dogadjaj Click za MenuStrip-Snimi
private void snimiToolStripMenuItem_Click(object sender, EventArgs e)
{
snimi();
}

// dogadjaj Click za MenuStrip-Info
private void infoToolStripMenuItem_Click(object sender, EventArgs e)
{
frmInformacije frm = new frmInformacije();
frm.ShowDialog();
}

// dogadjaj Click za ContextMenu-Kreiraj
private void cmSnimi_Click(object sender, EventArgs e)
{
snimi();
}

// dogadjaj Click za ContextMenu-Otkazi
private void cmOtkazi_Click(object sender, EventArgs e)
{
ocisti();
tslPoruka.Text = String.Empty;
}

// kreiranje i otvaranje SavFileDialog-a
// upis podataka sa kontrola u objekat klase Clan
// poziv metode za upis podataka iz objekta u fajl
private void snimi()
{
if (tbIme.Text != "" && tbPrezime.Text != "")
109

{
errGreska.Clear();
// kreiranje i otvaranje SaveFileDialog-a
SaveFileDialog cuvaj = new SaveFileDialog();
cuvaj.DefaultExt = "txt";
cuvaj.AddExtension = true;
cuvaj.FileName = "Potvrda o registraciji";
cuvaj.InitialDirectory = @"C:\Temp";
cuvaj.OverwritePrompt = true;
cuvaj.Title = "Klub uspesnih";
cuvaj.ValidateNames = true;

try
{
// ako korisnik izabere opciju Snimi u SaveFileDialog-u
// podaci sa kontrola se upisuju u objekat klase Clan
if (cuvaj.ShowDialog() == DialogResult.OK)
{
// kreiranje objekta sa navedenim parametrima
Clan clan = new Clan(tbIme.Text, tbPrezime.Text, cbGrad.Text,
vratiStudent(), dtpDatum.Value,
vratiIskustvio(), vratiHobi());

// poziv metode za upis podataka iz objekta u fajl
upisiUFajl(cuvaj.FileName, clan);

// poziv metoda za zakljucavanje kontrola
zakljucaj();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
else
{
errGreska.SetError(btnSnimi, "Niste uneli sve podatke");
}
}

// upis podataka iz objekta u fajl
private void upisiUFajl(string imeFajla, Clan clan)
{
try
{
// primena using iskaza omogucava da objekat postoji samo unutar njega
// tako da nije neophodno navoditi sw.Close()
// ukoliko se ne zeli dodavanje novog clana u txt fajl onda je StreamWriter(imeFajla)
using (StreamWriter sw = new StreamWriter(imeFajla, true))
{
sw.WriteLine("Spisak uspesno registrovanih kandidata\r\n");
sw.WriteLine(clan.ToString());
}
// popunjavanje statusStrip kontrole tipa Label
tslPoruka.Text = "Clan je sacuvan";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
110

// frmInofrmacije.cs
using Sstem;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Rad_sa_menijima
{
public partial class frmInformacije : Form
{
public frmInformacije()
{
InitializeComponent();
}

private void btnOK_Click(object sender, EventArgs e)
{
this.Close();
}
}
}


111

Zadatak 2.28. ProgresBar - simulacija
Kreirati WinForms aplikaciju pod nazivom Primena StatusStrip. Kreirati formu kao na slici
2.88 i podesiti kontrole kao to je prikazano u tabeli 2.33.

Slika 2.88. Design prozor za Zadatak 2.28
Tabela 2.33. Svojstva i dogaaji kontrola za Zadatak 2.28
Kontrola/Svojstva Name Text
Dodatna svojstva i
dogaaji
Label label1 Ime:
Label label2 Prezime:
Label label3 JMBG:
TextBox tbIme Dogaaj Leave
TextBox tbPrezime
Dogaaji:
Leave i Enter
TextBox tbMaticni
Dogaaji:
Leave i Enter
Button btnPrihvati Prihvati Dogaaj Click
Button btnOtkazi Otkazi Dogaaj Click
SatusStrip statusStrip1

U statusStrip1 kontrolu ubaciti po jednu ProgressBar kontrolu (setovati joj svojstvo Name
na tsProgressBar) i Label kontrolu (setovati joj svojstvo Name na tsLabela). Ovo se postie
kada se za kontrolu statusStrip1 za svojstvo Items klikne na tri takice. Tada se otvara
prozor kao na slici 2.89.
112


Slika 2.89. Dodavanje kontrola u StatusStrip kontrolu
Zahtevane funkcionalnosti aplikacije:
Prilikom startovanja aplikacije tbPrezime i tbMaticni nisu dostupni za upis (svojstva
Enabled su im setovana na true).
Prelazak na sledee TextBox polje omoguiti tek nakon unosa u TextBox polje u
kome se korisnik trenutno nalazi i to pritiskom na Tab taster na tastaturi.
Setovati ProgressBar i Labelu u StatusBar-u na odogovarajue vrednosti (videti sliku
2.90).


Slika 2.90. Izlazni prozori za Zadatak 2.28

113

Klikom na dugme Potvrdi proveriti da li su sva polja popunjena. Ukoliko jesu
prikazati MessageBox kao na slici 2.91, a ako nisu kao na slici 2.92. Na kraju
prikazati poruku Uspesna registracija.

Slika 2.91. MessageBox Pitanje Slika 2.92. MessageBox - Uspeh
Klikom na dugme Otkazi prikazati MessageBox kao na slici 2.91. U sluaju
potvrdnog odgovora isprazniti sva polja i formu inicijalizovati na stanje kao prilikom
startovanaj aplikacije.

Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Primena_StatusStrip
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
resetuj();
}

private void resetuj()
{
tbIme.Clear();
tbPrezime.Clear();
tbMaticni.Clear();
tbIme.Enabled = true;
tbPrezime.Enabled = false;
tbMaticni.Enabled = false;
tsProgresBar.Value = tsProgresBar.Minimum;
tsLabela.Text = "";
}

private void tbIme_Leave(object sender, EventArgs e)
{
if (String.IsNullOrEmpty(tbIme.Text))
114

{
tsProgresBar.Value = tsProgresBar.Minimum;
}
else
{
tbPrezime.Enabled = true;
tbIme.Enabled = false;
tbPrezime.Focus();
}
}

private void tbPrezime_Enter(object sender, EventArgs e)
{
tsProgresBar.Value = tsProgresBar.Maximum / 3;
tsLabela.Text = "Korak 1 zavrsen";
}

private void tbPrezime_Leave(object sender, EventArgs e)
{
if (String.IsNullOrEmpty(tbPrezime.Text))
{
tsProgresBar.Value = tsProgresBar.Maximum / 3;
}
else
{
tbIme.Enabled = false;
tbPrezime.Enabled = false;
tbMaticni.Enabled = true;
tbMaticni.Focus();
}
}

private void tbMaticni_Enter(object sender, EventArgs e)
{
tsProgresBar.Value = (2 * tsProgresBar.Maximum) / 3;
tsLabela.Text = "Korak 2 zavrsen";
}

private void tbMaticni_Leave(object sender, EventArgs e)
{
if (String.IsNullOrEmpty(tbMaticni.Text))
{
tsProgresBar.Value = (2 * tsProgresBar.Maximum) / 3;
}
else
{
tbIme.Enabled = false;
tbPrezime.Enabled = false;
tbMaticni.Enabled = false;
tsProgresBar.Value = tsProgresBar.Maximum;
tsLabela.Text = "Korak 3 zavrsen";
}
}

private void btnOtkazi_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Da li si siguran?", "Pitanje",
MessageBoxButtons.OKCancel, MessageBoxIcon.Question) ==
DialogResult.OK)
{
resetuj();
}
}

115

private void btnPrihvati_Click(object sender, EventArgs e)
{
if (String.IsNullOrEmpty(tbIme.Text) || String.IsNullOrEmpty(tbPrezime.Text)
|| String.IsNullOrEmpty(tbMaticni.Text))
{
MessageBox.Show("Sva polja su obavezna",
"Neuspeh", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
if (MessageBox.Show("Da li si siguran?", "Pitanje",
MessageBoxButtons.OKCancel, MessageBoxIcon.Question)
== DialogResult.OK)
{
MessageBox.Show("Uspesna registracija", "Uspeh",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
}
}

116

Zadatak 2.29. Pokretanje drugih aplikacija iz WinForms
Kreirati WinForms aplikaciju pod nazivom Procesi. Kreirati formu kao na slici 2.93 i
podesiti kontrole kao to je prikazano u tabeli 2.34.

Slika 2.93. Design prozor za Zadatak 2.29
Tabela 2.34. Svojstva i dogaaji kontrola za Zadatak 2.29
Kontrola/Svojstva Name Text
Dodatna svojstva i
dogaaji
Button btnMozilla Mozilla Firefox Dogaaj Click
Button btnWord MS Word Dogaaj Click
Button btnExcel MS Excel Dogaaj Click
Button btnWMP WinMediaPlayer Dogaaj Click
Button btnStartInfo StartInfo Dogaaj Click

Zahtevane funkcionalnosti aplikacije:
Klikom na dugme btnMozilla otvoriti sajt kole (www.its.edu.rs) u Mozilla Firefox
browser-u.
Klikom na dugme btnWord otvoriti fajl Klikom na dugme btnMozilla otvoriti
C:\Temp\Podaci.rtf u MS Word programu.
Klikom na dugme btnExcel otvoriti MS Excel program.
Klikom na dugme btnWMP otvoriti .mp4 fajl u WinMediaPlayer program sa lokacije
C:\ Temp\Budi_i_ti_IT_-_Dejan_Cuki_i_ITAkademija.mp4.
Klikom na dugme btnStartInfo pokrenuti Internet Explorer browser, minimizirati ga
(otvoriti u startnoj liniji) i u njemu otovriti sajt kole.



117

Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics; // dodato zbog klase Process

namespace Procesi
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

// pokretanje Mozilla Firefox-a
private void btnMozilla_Click(object sender, EventArgs e)
{
// Process.Start("firefox.exe"); // pokretanje Mozilla Firefox
// pokretanje sa otvaranjem odredjene stranice
Process.Start("firefox.exe", "www.its.edu.rs");
}

// pokretanje MS Word-a
private void btnWord_Click(object sender, EventArgs e)
{
// Process.Start("winword.exe"); // pokretanje MS Word-a
// pokretanje sa otvaranjem odredjenog fajla
Process.Start("winword.exe", @"C:\Temp\Folderi.txt");
}

// pokretanje MS Excel-a
private void btnExcel_Click(object sender, EventArgs e)
{
Process.Start("excel.exe"); // pokretanje MS Excel-a
}

// pokretanje Windows Media Player-a
private void btnWMP_Click(object sender, EventArgs e)
{
// pokretanje sa otvaranjem odredjenog fajla
Process.Start("wmplayer.exe", @"C:\Temp\Budi_i_ti_IT_-
_Dejan_Cuki_i_ITAkademija.mp4");
}

// pokretanje proseca pomocu ProcessStartInfo
private void btnStartInfo_Click(object sender, EventArgs e)
{
ProcessStartInfo startInfo = new ProcessStartInfo("IExplore.exe");
startInfo.WindowStyle = ProcessWindowStyle.Minimized;
startInfo.Arguments = "www.its.edu.rs";

Process.Start(startInfo);
}
}
}

118

Zadatak 2.30. Rukovanje mejlom slanje mejla iz WinForms aplikacije
Kreirati WinForms aplikaciju pod nazivom Rukovanje mejlom. Kreirati formu kao na slici
2.94 i podesiti kontrole kao to je prikazano u tabeli 2.35.

Slika 2.94. Design prozor za Zadatak 2.30
Tabela 2.35. Svojstva i dogaaji kontrola za Zadatak 2.30
Kontrola/Svojstva Name Text
Dodatna svojstva i
dogaaji
Label label1 Adresa primaoca
Label label2 Adresa posiljaoca
Label label3 Ime posiljaoca
Label label4 Lozinka posiljaoca
Svojstvo
PasswordChar=*
Label label5 Naslov poruke
Label label6 Tekst poruke
TextBox tbPrimaoc
TextBox tbPosiljaocAdr
TextBox tbPosiljaocIme
TextBox tbPosiljaocLoz
TextBox tbNaslov
RichTextBox rtbTekstPoruke
Button btnAttach Attachment Dogaaj Click
Button btnPosalji Posalji Dogaaj Click
OpenFileDialog openFileDialog1


119

Zahtevane funkcionalnosti aplikacije:
Klikom na dugme Attachment otvoriti standarni windows OpenDialog u kome korisnik
bira fajl koji alje u mejlu (tj. pamti se putanja fajla)
Klikom na Posalji poruka se alje.
Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Mail; // dodato zbog klasa MailAdress, Attachment, SmtpClient
using System.Net; // dodato zbog klase NetworkCredential

namespace Rukovanje_mejlom
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

// polje u kome se pamti adresa selektovanog fajla za attachment
private string fajl;

private void button1_Click(object sender, EventArgs e)
{
// kreiranje posiljaoca
MailAddress posiljalac = new MailAddress(tbPosiljaocAdr.Text,
tbPosiljaocIme.Text);

// kreiranje primaoca
MailAddress primalac = new MailAddress(tbPrimaoc.Text);

// kreiranje poruke
MailMessage poruka = new MailMessage();
poruka.From = posiljalac; // dodeljivanje adrese posiljaoca poruci
poruka.To.Add(primalac); // dodeljivanje adrese primaoca poruci
poruka.Subject = tbNaslov.Text; // definisanje naslova poruke
poruka.Body = rtbTekstPoruke.Text; // definisanje teksta poruke

// kreiranje attachment-a
// kreiranje objekta koji sadrzi fajl za slanje
Attachment at = new Attachment(fajl);
// dodavanje kreiranog objekta kolekciji Attachments poruke
poruka.Attachments.Add(at);

// kreiranje SMTP klijent servera
// kreiranje objekta koji sadrzi adresu smtp servera provajdera
SmtpClient mailClient = new SmtpClient("smtp.gmail.com");
mailClient.EnableSsl = true; // definisanje nacina slanja poruke
mailClient.Port = 587; // definisanje porta
// dodavanje korisnickog imena i lozinke za pristup serveru
mailClient.Credentials = new NetworkCredential(tbPosiljaocAdr.Text,
tbPosiljaocLoz.Text);
120

// slanje poruke
try
{
mailClient.Send(poruka); // pozivanje Send metoda koji salje mejl
MessageBox.Show("Poruka je poslata");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void btnAttach_Click(object sender, EventArgs e)
{
// preuzimenja adrese selektovanog fajla za kacenje
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
fajl = openFileDialog1.InitialDirectory.ToString() +
openFileDialog1.FileName.ToString();
}
}
}
}

121

Zadatak 2.31. WebBrowser kontrola
Kreirati WinForms aplikaciju pod nazivom WebBrowser. Kreirati formu kao na slici 2.935
Ona sadri jednu WebBrowser kontrolu i jednu MenuStrip kontrolu, koju treba definisati kao
na slici 2.95 (tri menija: WebSajtovi, Fajlovi, Reci za pretragu, pri emu WebSajtovi sadre
etiri podmenjia ITS, ITHS, LinkGroup, Comtrade, a Reci za pretragu sadri dva
podmenija ITS, WinForms).

Slika 2.95. Design prozor za Zadatak 2.31 Slika 2.96. Izlazni prozor za Zadatak 2.31
Zahtevane funkcionalnosti aplikacije:
Klikom na podmeni ITS menija WebSajtovi u WebBrowser kontroli otvoriti sajt kole
(www.its.edu.rs).
Klikom na podmeni ITHS menija WebSajtovi u WebBrowser kontroli otvoriti sajt ITHS
(www.iths.edu.rs).
Klikom na podmeni LinkGroup menija WebSajtovi u WebBrowser kontroli otvoriti sajt
LinkGroup (www.link.co.rs).
Klikom na podmeni Comtrade menija WebSajtovi u WebBrowser kontroli otvoriti sajt
Comtrade (www.cometrade.rs).
Klikom na meni Fajlovi u WebBrowser kontroli otvoriti txt fajl sa lokacije
C:\Temp\Folderi.txt.
Klikom na podmeni ITS menija Reci za pretragu u WebBrowser kontroli otvoriti
google sa ukucanom rei ITS u polju za pretragu (vidi sliku 2.96).
Klikom na podmeni WinForms menija Reci za pretragu u WebBrowser kontroli
otvoriti google sa ukucanom rei WinForms u polju za pretragu.



122

Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WebBrowser
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void iTSToolStripMenuItem_Click(object sender, EventArgs e)
{
webBrowser1.Navigate("www.its.edu.rs");
}

private void iTHSToolStripMenuItem_Click(object sender, EventArgs e)
{
webBrowser1.Navigate("www.iths.edu.rs");
}

private void linkGroupToolStripMenuItem_Click(object sender, EventArgs e)
{
webBrowser1.Navigate("www.link.co.rs");
}

private void cometradeToolStripMenuItem_Click(object sender, EventArgs e)
{
webBrowser1.Navigate("www.comtrade.rs");
}

private void fajloviToolStripMenuItem_Click(object sender, EventArgs e)
{
webBrowser1.Navigate(@"C:\Temp\Folderi.txt");
}

private void iTSToolStripMenuItem1_Click(object sender, EventArgs e)
{
webBrowser1.Navigate("http://" + "google.com/search?q=" +
iTSToolStripMenuItem1.Text);
}

private void winFormsToolStripMenuItem_Click(object sender, EventArgs e)
{
webBrowser1.Navigate("http://" + "google.com/search?q=" +
winFormsToolStripMenuItem.Text);
}
}
}


123

Zadatak 2.32. WebBrowser kontrola navigacija
Kreirati WinForms aplikaciju pod nazivom Navigacija. Kreirati formu kao na slici 2.97 i
podesiti kontrole kao to je prikazano u tabeli 2.36.

Slika 2.97. Design prozor za Zadatak 2.32
Tabela 2.36. Svojstva i dogaaji kontrola za Zadatak 2.32
Kontrola/Svojstva Name Text
Dodatna svojstva i
dogaaji
Form From1 Navigacija Dogaaj Load
Panel panel1
Button btnPrethodna Prethodna Dogaaj Click
Button btnSledeca Sledeca Dogaaj Click
Button btnNadji Nadji Dogaaj Click
TextBox tbAdresa
WebBrowser webBrowser1
Dogaaj
DocumentComplited
ListBox
lbLinkovi
Dogaaj
SelectedIndexChanged

Kontrole btnPrethodna, btnSledeca, btnNadji i tbAdresa su ubaene u okviru panel1
kontrole.
Kako bi se omoguilo da prilikom poveanja prozora se automatski panel1, webBrowser1 i
listBox1 kontrole proirivale neophodo je postaviti njihova Anchore svojstva. Za panel1
setovati na Top, Left, Right, za webBrowser1 na Top, Bottom, Left, a za listBox1 je na
Top, Bottom, Left, Right.

124

Zahtevane funkcionalnosti aplikacije:
Prilikom startovanja aplikacije u webBrowser1 kontroli prikazati home stranicu
default-nog browser-a.
Klikom na dugme Prethodna u webBrowser1 kontroli prikazati prethodno
prikazivanu stranicu u webBrowser1 kontroli (simulacija opcije Back).
Klikom na dugme Sledeca u webBrowser1 kontroli prikazati naredno prikazivanu
stranicu u webBrowser1 kontroli (simulacija opcije Forward).
Klikom na dugme Nadji u webBrowser1 kontroli prikazati stranicu ija web adresa
je uneta u tbAdresa (simulacija AddressBar).
U ListBox kontroli (lbLinkovi) prikazati spisak svih linkova koji se nalaze na stranici
koja je trenutno prikazana u webBrowser1 kontroli (slika 2.98). Obezbediti da se
lbLinkovi popunjava tek nakon uitavanja stranice u webBrowser1 (korisrtiti dogaaj
DocumentComplited WebBrowser kontrole).

Slika 2.98. Izlazni prozor za Zadatak 2.32

125

Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Navigacija
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
webBrowser1.GoHome();
}

private void btnPrethodna_Click(object sender, EventArgs e)
{
webBrowser1.GoBack();
}

private void btnSledeca_Click(object sender, EventArgs e)
{
webBrowser1.GoForward();
}

private void btnNadji_Click(object sender, EventArgs e)
{
webBrowser1.Navigate(tbAdresa.Text);
}

private void popuniListBox()
{
lbLinkovi.Items.Clear();
HtmlDocument doc = webBrowser1.Document;
HtmlElementCollection linkovi = doc.GetElementsByTagName("a");
foreach (HtmlElement link in linkovi)
{
lbLinkovi.Items.Add(link.GetAttribute("href"));
}
}

// popunjavanje ListBox-a mora da bude tek nakon kompletnog ucitavanja sajta
private void webBrowser1_DocumentCompleted(object sender,
WebBrowserDocumentCompletedEventArgs e)
{
popuniListBox();
}

private void lbLinkovi_SelectedIndexChanged(object sender, EventArgs e)
{
webBrowser1.Navigate(lbLinkovi.SelectedItem.ToString());
}
} }
126

Zadatak 2.33. ListView kontrola
Kreirati WinForms aplikaciju pod nazivom ListView kontrola. Kreirati formu kao na slici
2.99. Ona sadri po jednu Label, ComboBox i ListView kontrolu. U Combo Box ubaciti
kolekciju item-a: Velike ikone, Male ikone, Detalji, Lista. Dodati jo dve ImageList kontrole
(imageListMaleIkone i ImageListVelikeIkone), u ije kolekcije treba uneti proizvolje slike. U
ovom primeru su unite tri slike (Ispit.jpg, Student.jpg, Studentkinja.jpg).

Slika 2.99. Design forme za Zadatak 2.33
U ListView definisati kolekciju item-a, pri emu svaki item sadri po jednu sliku. Na ListView
desni klik mia i izabrati opciju Edit Items (slika 2.100) i definisati ih kao na slici 2.101.

Slika 2.100. ListView Tasks meni
127

Za svaki item dodati po jedan SubItem. Selektovati odgovarajui item na levoj strani
prozora sa slike 2.101 i u properties prozoru (desni deo prozora na slici 2.101) izabrati
opciju SubItems. Otvara se prozor kao na slici 2.102, koja prikazuje subitem za item
Ispit, gde je u svojstvu tekst definisano svojstvo Text=Ovo je ispit. Ovo uraditi i za
druga dva ListViewItem-a (Student, Studentkinja) sa odgovarajui tekstom u SubItem-
u.

Slika 2.101. Definisanje kolekcije ListViewItem
Ono to je definisano u SubItem kolekciji je vidljivo kada se ListView prikae u reimu
Details. Da bi se videlo zaglavlje kolona u tom reimu potrebno je jo definisati i kolekciju
Columns.

Slika 2.102. Definisanje kolekcije ListViewSubItem
128

Definisanje kolona se vri slino definisanju item-a. U ListView Tasks prozoru (slika 2.100)
izabare se opcija Edit Columns, pri emu se otvara prozor koa na slici 2.103.

Slika 2.103. Definisanje kolona za ListView
Dodati dve kolone: columnSlika sa zaglavljem Slika i columnOpis sa zaglavljem Opis (videti
sliku 2.103).
Za ovako definisane SubItem-e i kolone ListView e za opciju Details imati izgled kao na slici
2.104.

Slika 2.104. Izlazni ekran forme za opciju Details ListView kontrole
Zahtevane funkcionalnosti aplikacije:
Prilikom izbora opcije u ComboBox kontroli prikazati ListView kontrolu u izabranom
pogledu (View).
129

Reenje:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ListView_kontrola
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
comboBox1.SelectedIndex = 0;
}

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
int izbor = comboBox1.SelectedIndex;
switch (izbor)
{
case 0:
listView1.View = View.LargeIcon;
break;
case 1:
listView1.View = View.SmallIcon;
break;
case 2:
listView1.View = View.Details;
break;
case 3:
listView1.View = View.List;
break;
}

}
}
}
130

III Manipulacija sa baom podataka
1. Povezivanje sa bazom podataka
U Visual Studio-ju iz padajueg menija Project izabrati opciju Add New data Source. U Data
Source Explorer-u izabrati opciju Add New Data Source, pri emu se otvara prozor za izbor
Data Source Type (izabrati Database), a nakon toga prozor za izbor Database Model
(izabrati Dataset) (Slici 3.1).

Slika 3.1. Izbor Data Source Type i Database Model
Potom se ovrata prozor za dodavanje konekcije (Slika 3.2) u kome se setuju sledee
vrednosti:
Data Source postvalja se na Microsoft SQL Server (SqlClient)
Server name upisuje se ime servera koje se vidi kada se pokrene SQL Management
Studio
Za logovanje na server se bira opcija koja je izabrana i prilikom kreiranja baze.
Ukoliko pri kreiranju baze nije korienja SQL autentifikacija odabrati Use Windows
Authentication. U suprotnom izabrati drugu opciju i uneti parametre za logovanje na
server.
Conneect to database izabrati prvu opciju i iz combobox-a izabrati eljenu bazu
Test Connection testiranje konekcije
Na kraju se u okviru Server Explorer-a prikazuje eljena baza (Slika 3.3). U Solution
Explorer-u se automatski dodaje App.config fajl, koji sadri sledei kod:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
</configSections>
<connectionStrings>
131

<add name="WinFormsApp.Properties.Settings.StudentiConnectionString"
connectionString="Data Source=AMD2600\SQLEXPRESS;Initial
Catalog=Studenti;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
</configuration>

Slika 3.2. Prozor Add Connection Slika 3.3. Server Explorer
Jedna od opcija je da se kreira klasa koja sadri konekcioni string:
class Konekcija
{
public static string konString = Properties.Settings.Default.StudentiConnectionString;
}
Kako je ovo definisano kao static atribut, pristupa mu se Konekcija.konString, tj.
nazivKlase.nazivAtributa.
Kako bi se koristile klase za rad sa bazom podataka, neophodno je na poetku ukljuiti
proctor imena (namespace) u kojoj su one definisane. Za MSSQL bazu to je SqlClient,
odnosno direktivu:
using System.Data.SqlClient;

132

2. Primeri za vebu
Zadatak 3.1. itanje podataka iz baze select (konektovano okruenje)
Kreirati bazu podataka Prijemni koja ima dve povezane tabele, ija je struktura prikazana
na slici 3.4. Povezati ih po ifri studijskog programa. Uneti par zapisa u tabele. Kreirati
stored procedure spSviKandidati koja prikazuje sve kandidate.

Slika 3.4. Struktura baze Prijemni
Kreirati WinForms aplikaciju pod nazivom Citanje podataka. Kreirati formu kao na slici 3.5
i podesiti kontrole kao to je prikazano u tabeli 3.1.

Slika 3.5. Design prozor za Zadatak 3.1
Tabela 3.1. Svojstva i dogaaji kontrola za Zadatak 3.1
Kontrola/Svojstva Name Text
Dodatna svojstva i
dogaaji
Button btnProgrami Prikazi studijske programe Dogaaj Click
Button btnKandidat Kandidati preko 80 poena Dogaaj Click
Button btnPrikazi Prikazi Dogaaj Click
Button btnSviKandidati Svi kandidati Dogaaj Click
Button btnUkupno Ukupan broj kandidata Dogaaj Click
Label label1 Broj poena
TextBox tbPoeni
RichTextBox richTextBox1
133

Zahtevane funkcionalnosti aplikacije:
Klikom na dugme btnProgrami u richTextBox1 kontroli prikazati sve studijske
programe.
Klikom na dugme btnKandidat u richTextBox1 kontroli prikazati sve kandidate (broj
prijave, prezime i ime) koji imaju vie od 80 poena.
Klikom na dugme btnPrikazi u richTextBox1 kontroli prikazati sve kandidate (broj
prijave, prezime i ime) koji imaju vie od broja poena koje korisnik ukuca u tbPoeni.
Klikom na dugme btnSviKandidat u richTextBox1 kontroli prikazati sve kandidate
(broj prijave, prezime i ime) pozivom stored procedure spSviKandidati iz baze.
Klikom na dugme btnUkupno u MessageBox-u prikazati poruku o ukupnom broju
kandidata.
Napomena: U reenju je prikazana upotreba SqlKomand klase na razliite naine.
Reenje:
// Konekcija.cs
class Konekcija
{
public static string konString = Properties.Settings.Default.PrijemniConnectionString;
}

// Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient; // dodato zbog rada sa bazom

namespace Citanje_podataka
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void btnProgrami_Click(object sender, EventArgs e)
{
richTextBox1.Clear();

// kreiranje SqlConnection objekta
SqlConnection konekcija = new SqlConnection(Konekcija.konString);

// kreiranje SqlCommand objekta
SqlCommand komanda = new SqlCommand("select * from StudijskiProgrami",
konekcija);


134

// kreiranje SqlDataReader objekta u koji se smestaju rezultati upita
SqlDataReader reader = null;

StringBuilder sb = new StringBuilder();

try
{
// otvaranje konekcije
konekcija.Open();
// izvrsavanje komande
reader = komanda.ExecuteReader();

sb.Append("Sifra" + " " + "Naziv" + "\n");

// citanje rezultata
while (reader.Read())
{
sb.Append(reader[0].ToString() + " " + reader[1].ToString() +
"\n");
}

// zatvaranje konekcije
konekcija.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

// prikaz u richTextBox1
richTextBox1.Text = sb.ToString();
}

private void btnKandidat_Click(object sender, EventArgs e)
{
richTextBox1.Clear();

SqlConnection konekcija = new SqlConnection(Konekcija.konString);

SqlCommand komanda = new SqlCommand();
komanda.Connection = konekcija;
komanda.CommandType = CommandType.Text;
komanda.CommandText = "SELECT BrojPrijave, PrezimeIme FROM Kandidati WHERE
BrojPoena>80";

SqlDataReader reader = null;
StringBuilder sb = new StringBuilder();

try
{
// otvaranje konekcije
konekcija.Open();

// izvrsavanje komande
reader = komanda.ExecuteReader();

sb.Append("Broj prijave" + "\t" + "Prezime i ime" + "\n");

// citanje rezultata
while (reader.Read())
{
sb.Append(reader[0].ToString() + "\t\t" + reader[1].ToString() +
"\n");
}
135

// zatvaranje konekcije
konekcija.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
// prikaz u richTextBox1
richTextBox1.Text = sb.ToString();
}

private void btnPrikazi_Click(object sender, EventArgs e)
{
richTextBox1.Clear();

SqlConnection konekcija = new SqlConnection(Konekcija.konString);
using (SqlCommand komanda = new SqlCommand("SELECT BrojPrijave, PrezimeIme
FROM Kandidati WHERE BrojPoena>@poeni", konekcija))
{
// kreiraj parametar
SqlParameter poeniParam = new SqlParameter("@poeni", SqlDbType.Float);

/* // dodaj parametar u kolekciju parametara komande
komanda.Parameters.Add(poeniParam);

// dodeli vrednost parametru
poeniParam.Value = Convert.ToDouble(tbPoeni.Text); */

// prethodne dve linije koda moguce je napisati i kao jednu
komanda.Parameters.AddWithValue("@poeni",
Convert.ToDouble(tbPoeni.Text));

SqlDataReader reader = null;
StringBuilder sb = new StringBuilder();

try
{
// otvaranje konekcije
konekcija.Open();

// izvrsavanje komande
reader = komanda.ExecuteReader();

sb.Append("Broj prijave" + "\t" + "Prezime i ime" + "\n");

// citanje rezultata
while (reader.Read())
{
sb.Append(reader[0].ToString() + "\t\t" + reader[1].ToString() +
"\n");
}

// zatvaranje konekcije
konekcija.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

// prikaz u richTextBox1
richTextBox1.Text = sb.ToString();
}
}
136

private void btnUkupno_Click(object sender, EventArgs e)
{
SqlConnection konekcija = new SqlConnection(Konekcija.konString);

SqlCommand komanda = new SqlCommand("select count(*) from Kandidati",
konekcija);

int brKandidata = 0;

try
{
konekcija.Open();
brKandidata = (int)komanda.ExecuteScalar();
konekcija.Close();
}
catch (Exception xcp)
{
MessageBox.Show(xcp.Message);
return;
}

MessageBox.Show("Ukupan broj prijavljenih kandidata je " + brKandidata,
"Poruka");
}

private void btnSviKanidati_Click(object sender, EventArgs e)
{
richTextBox1.Clear();

// kreiranje SqlConnection objekta
SqlConnection konekcija = new SqlConnection(Konekcija.konString);

// kreiranje SqlCommand objekta koji izvrsava StoreProcedure

/* SqlCommand komanda = new SqlCommand();
komanda.Connection = konekcija;
komanda.CommandText = "spSviKandidati";*/

// prethodna tri reda koda se mogu zameniti sa ovom linijom
SqlCommand komanda = new SqlCommand("spSviKandidati", konekcija);

komanda.CommandType = CommandType.StoredProcedure;

// kreiranje SqlDataReader objekta u koji se smestaju rezultati upita
SqlDataReader reader = null;

StringBuilder sb = new StringBuilder();

try
{
// otvaranje konekcije
konekcija.Open();

// izvrsavanje komande
reader = komanda.ExecuteReader();

sb.Append("Broj prijave" + "\t" + "Prezime i ime" + "\n");

// citanje rezultata
while (reader.Read())
{
sb.Append(reader[0].ToString() + "\t\t" + reader[1].ToString() +
"\n");
}
137


// zatvaranje konekcije
konekcija.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

// prikaz u richTextBox1
richTextBox1.Text = sb.ToString();
}
}
}


138

Zadatak 3.2. Auriranje podataka u bazi update, insert, delete
(konektovano okruenje)
Kreirati bazu podataka Prijemni koja ima dve povezane tabele, ija je struktura prikazana
na slici 3.4 (Zadatak 3.1). Tabelu StudijskiProgrami popuniti podacima sa slike 3.6.

Slika 3.6. Zapisi u tabeli StudijskiProgrami Slika 3.7. Design prozor za Zadatak 3.2
Kreirati WinForms aplikaciju pod nazivom Azuriranje podataka. Kreirati formu kao na slici
3.7 i podesiti kontrole kao to je prikazano u tabeli 3.2.
Tabela 3.2. Svojstva i dogaaji kontrola za Zadatak 3.2
Kontrola/Svojstva Name Text
Dodatna svojstva i
dogaaji
Button btnAzuriraj Azuriraj Dogaaj Click
Button btnBrisi Brisi Dogaaj Click
Button btnPrikazi Prikazi Dogaaj Click
Button Ubaci Svi kandidati Dogaaj Click
RichTextBox richTextBox1

Zahtevane funkcionalnosti aplikacije (Slika 3.8):
Klikom na dugme btnPrikazi u richTextBox1 kontroli prikazati sve studijske
programe.
Klikom na dugme btnAzuriraj promeniti naziv studijskog programa Informacione
tehnologije u Informacione tehnologije - IT. Obavestiti korisnika o uspehu izmene
putem MessageBox-a i u richTextBox1 kontroli prikazati sve studijske programe
nakon auriranja.
Klikom na dugme btnBrisi izbrisati studijski program sa ifrom 4. Obavestiti korisnika
o uspehu brisanja putem MessageBox-a i u richTextBox1 kontroli prikazati sve
studijske programe nakon brisanja.
139

Klikom na dugme btnUbaci insertovati novi studijski program sa ifrom 5 i nazivom
Novi program. Obavestiti korisnika o uspehu ubacivanja putem MessageBox-a i u
richTextBox1 kontroli prikazati sve studijske programe nakon ubacivanja.

Slika 3.8. Izlazni prozor za Zadatak 3.2
Reenje:
// Konekcija.cs
class Konekcija
{
public static string konString = Properties.Settings.Default.PrijemniConnectionString;
}

// Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient; // dodato zbog rada sa bazom

namespace Azuriranje_podataka
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

140

private void prikazi()
{
// kreiranje SqlConnection objekta
SqlConnection konekcija = new SqlConnection(Konekcija.konString);

// kreiranje SqlCommand objekta
SqlCommand komanda = new SqlCommand("select * from StudijskiProgrami",
konekcija);

// kreiranje SqlDataReader objekta u koji se smestaju rezultati upita
SqlDataReader reader = null;

StringBuilder sb = new StringBuilder();

try
{
konekcija.Open();
reader = komanda.ExecuteReader();
sb.Append("Sifra" + " " + "Naziv" + "\n");

// citanje rezultata
while (reader.Read())
{
sb.Append(reader[0].ToString() + " " + reader[1].ToString() +
"\n");
}

// zatvaranje konekcije
konekcija.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

// prikaz u richTextBox1
richTextBox1.AppendText(sb.ToString());
}

private void btnPrikazi_Click(object sender, EventArgs e)
{
richTextBox1.Clear();
prikazi();
}

private void btnAzuriraj_Click(object sender, EventArgs e)
{
SqlConnection konekcija = new SqlConnection(Konekcija.konString);
StringBuilder sb = new StringBuilder();
sb.Append("UPDATE StudijskiProgrami ");
sb.Append("SET Naziv='Informacione tehnologije - IT' ");
sb.Append("WHERE StudijskiProgramID = 1");

SqlCommand komanda = new SqlCommand(sb.ToString(), konekcija);

try
{
konekcija.Open();
komanda.ExecuteNonQuery();
konekcija.Close();
}


catch (Exception ex)
141

{
MessageBox.Show(ex.Message);
return;
}

MessageBox.Show("Podaci promenjeni");

richTextBox1.AppendText("\nPodaci nakon izmene:\n");
prikazi();
}

private void btnBrisi_Click(object sender, EventArgs e)
{
SqlConnection konekcija = new SqlConnection(Konekcija.konString);

SqlCommand komanda = new SqlCommand("DELETE FROM StudijskiProgrami WHERE
StudijskiProgramID = 4", konekcija);

try
{
konekcija.Open();
komanda.ExecuteNonQuery();
konekcija.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}

MessageBox.Show("Podaci izbrisani");
richTextBox1.AppendText("\nPodaci nakon brisanja:\n");
prikazi();
}

private void btnUbaci_Click(object sender, EventArgs e)
{
SqlConnection konekcija = new SqlConnection(Konekcija.konString);

SqlCommand komanda = new SqlCommand("INSERT INTO StudijskiProgrami
(StudijskiProgramID, Naziv) VALUES (5, N'Novi smer')", konekcija);

try
{
konekcija.Open();
komanda.ExecuteNonQuery();
konekcija.Close();
}
catch (Exception xcp)
{
MessageBox.Show(xcp.Message);
return;
}

MessageBox.Show("Podaci insertovani");
richTextBox1.AppendText("\nPodaci nakon ubacivanja:\n");
prikazi();
}
}
}


142

Zadatak 3.3. Unos podataka u bazu iz kontrola (konektovano okruenje)
Kreirati bazu podataka Vezba koja ima tabelu Spisak, ija je struktura prikazana na slici
3.9. Za ID podesiti da je auto increment (svojstvo Identity Specification setovati na Yes u
definiciji tabele).

Slika 3.9. Struktura tabele Spisak Slika 3.10. Design prozor za Zadatak 3.3
Kreirati WinForms aplikaciju pod nazivom Parametarski unos. Kreirati formu kao na slici
3.10 i podesiti kontrole kao to je prikazano u tabeli 3.3.
Tabela 3.3. Svojstva i dogaaji kontrola za Zadatak 3.3
Kontrola/Svojstva Name Text Dodatna svojstva i dogaaji
Label label1 ID
Label label2 Ime
Label label3 Prezime
TextBox tbID Svojstvo ReadOnly=True
TextBox tbIme
TextBox tbPrezime
Button btnUbaci Ubaci Dogaaj Click
Button btnPrikazi Prikazi Dogaaj Click
RichTextBox richTextBox1

Zahtevane funkcionalnosti aplikacije (Slika 3.11):
Klikom na dugme btnPrikazi u richTextBox1 kontroli prikazati sve zapise iz tabele
Spisak.
Klikom na dugme btnUbaci uneti novi zapis sa podacima koji se uzimaju iz
odgovarajuih TextBox kontrola. Obavestiti korisnika o uspehu izmene putem
MessageBox-a. Nakon ubacivanja prikazati ID iz baze u tbID.
143


Slika 3.11. Izlazni prozor za Zadatak 3.3
Reenje:
// Konekcija.cs
class Konekcija
{
public static string konString = Properties.Settings.Default.VezbaConnectionString;
}

// Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient; // dodato zbog rada sa bazom

namespace Parametarski_unos
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void btnUbaci_Click(object sender, EventArgs e)
{
SqlConnection konekcija = new SqlConnection(Konekcija.konString);
StringBuilder sb = new StringBuilder();

sb.Append("INSERT INTO Spisak");
sb.Append("(Ime, Prezime) ");
sb.Append("VALUES (@ime, @prezime) ");
sb.Append(";SELECT @ID =@@IDENTITY"); // zato sto je ID autoincrement

SqlCommand komanda = new SqlCommand(sb.ToString(), konekcija);

SqlParameter imeParam = new SqlParameter("@ime", SqlDbType.NVarChar, 25);
144

SqlParameter prezimeParam = new SqlParameter("@prezime", SqlDbType.NVarChar,
25);
SqlParameter idParam = new SqlParameter("@id", SqlDbType.Int);

// uzima svojstva autoincrementa
idParam.Direction = ParameterDirection.Output;

komanda.Parameters.Add(imeParam);
komanda.Parameters.Add(prezimeParam);
komanda.Parameters.Add(idParam);

// uzima unite podatke iz TextBox i smesta u parametre
imeParam.Value = tbIme.Text;
prezimeParam.Value = tbPrezime.Text;

try
{
konekcija.Open();
komanda.ExecuteNonQuery();
konekcija.Close();
}

catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}

MessageBox.Show("Podaci insertovani");
tbID.Text = idParam.Value.ToString(); // prikaz ID iz baze u tbID
}

private void btnPrikazi_Click(object sender, EventArgs e)
{
richTextBox1.Clear();
SqlConnection konekcija = new SqlConnection(Konekcija.konString);
SqlCommand komanda = new SqlCommand("select * from Spisak", konekcija);
SqlDataReader reader = null;
StringBuilder sb = new StringBuilder();

try
{
konekcija.Open();
reader = komanda.ExecuteReader();
sb.Append("ID" + "\t" + "Ime" + "\t" + "Prezime" + "\n");

while (reader.Read())
{
sb.Append(reader[0].ToString() + "\t" + reader[1].ToString() + "\t "
+ reader[2].ToString() + "\n");
}

konekcija.Close();
}

catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

richTextBox1.Text = sb.ToString();
}
}
}
145

Zadatak 3.4. Simulacija prijavnog formulara (konektovano okruenje)
Kreirati bazu podataka Login koja ima jednu tabelu Korisnik, ija je struktura prikazana
na slici 3.12. Primarni klju KorisnikID je setovan kao autoincrement. Kreirati jednu stored
procedure-u pod nazivom InsertKorisnik koja sadri parametarski upit za insertovanje
novog korisnika u tabelu pri emu se podaci o korisniku zadaju preko paramatara.

Slika 3.12. DesignView tabele Korisnik Slika 3.13. Design frmPocetna za Zadatak 3.4
Kreirati WinForms aplikaciju pod nazivom LoginKon. Kreirati formu kao na slici 3.13 i
podesiti kontrole kao to je prikazano u tabeli 3.4.
Tabela 3.4. Svojstva i dogaaji kontrola formu frmPocetna za Zadatak 3.4
Kontrola/Svojstva Name Text Dodatna svojstva i dogaaji
Label label1 User name:
Label label2 Password:
TextBox tbUN Dogaaj Validating
TextBox tbPsw Dogaaj Validating
Button btnLogin LogIN Dogaaj Click
Button btnRegistracija Registracija Dogaaj Click
Button btnUpdate Update Dogaaj Click
ErrorProvider errorProvider1

Dodati jo dve forme kao na slici 3.14 i podesiti kontrole kao to je prikazano u tabeli 3.5.
Za formu frmUpdate svojstva Name za TextBox kontrole su iste kao i za formu
frmRegistracija, dok je za Button kontrolu Name=btnUpdate1.
146


Slika 3.14. Design view formi frmRegistracija i frmUpdate za Zadatak 3.4
Tabela 3.5. Svojstva i dogaaji kontrola formi frmRegistracija za Zadatak 3.4
Kontrola/Svojstva Name Text Dodatna svojstva i dogaaji
Label label1 Registruj se:
Label label2 Naziv firme:
Label label3 PIB:
Label label4 Adresa:
Label label5 Grad:
Label label6 Ime i prezime:
Label label7 Kontakt telefon:
Label label8 Korisniko ime:
Label label9 Email adresa:
Label label10 Password:
TextBox tbNaziv
TextBox tbPib
TextBox tbAdresa
TextBox tbGrad
TextBox tbIme
TextBox tbTel
TextBox tbUserName
TextBox tbEmail
TextBox tbPsw
Button button1 Registruj se Dogaaj Click



147

Zahtevane funkcionalnosti aplikacije:
Prilikom startovanja aplikacije prikazuje se poetna forma frmPocetna. Dugme
btnUpdate je nedostupno za korienje. Njene funkcionalnosti su:
o Za tbUN i tbPsw pomou dogaaja Validating onemoguiti korisniku da ta
polja ostanu prazna. Obavestiti ga pomou errorProvider1 kontrole.
o Klikom na dugme btnLogin proverava se da li postoji korisnik sa zadatim
korisnikim imenom i lozinkom. Ukoliko postoji prikazuje se MessageBox sa
porukom: Ulogovani ste kao xxxxx i dugme btnUpdate postaje dostupno.
Ukoliko nije ispravna kombinacija korisnikog imena i lozinke putem
MessageBox-a obavestiti korisnika o tome.
o Klikom na dugme btnRegistration otvara se forma frmRegistracija.
Klikom na dugme Registruj se (forme frmRegistracija) podaci o
korisniku (iz odgovarajuih TextBox kontrola) se ubacuju u bazu.
Korisnik se obavetava putem MessageBox-a o uspehu upisa podataka
u bazu.
o Klikom na dugme btnUpdate otvara se forma frmUpdate, ija TextBox polja su
popunjena odgovarajuim podacima iz baze za ulogovanog korisnika.
Klikom na dugme Update (forme frmUpdate) podaci o korisniku (iz
odgovarajuih TextBox kontrola) se auriraju u bazi. Korisnik se
obavetava putem MessageBox-a o uspehu auriranja podataka u
bazu.
Reenje:
// Konekcija.cs
class Konekcija
{
public static string konString = Properties.Settings.Default.LoginConnectionString;
}
// Sifra.cs
class Sifra
{
private static string korIme;
private static string sif;

public static string KorIme
{
get { return korIme; }
set { korIme = value; }
}

public static string Sif
{
get { return sif; }
set { sif = value; }
}
}

148

// frmPocetna.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient; // dodato zbog rada sa bazom

namespace LoginKon
{
public partial class frmPocetna : Form
{
public frmPocetna()
{
InitializeComponent();
btnUpdate.Enabled = false;
}

private void btnLogin_Click(object sender, EventArgs e)
{
// konekcija na bazu
SqlConnection connection = new SqlConnection();
connection.ConnectionString = Konekcija.konString;
connection.Open();

// definisanje SQL naredbe
// obratiti paznju na sintaksu
// za sva tekstualna polja obavezno se koriste apostrofi ispered i iza
// na primer za tbUN ispred i iza idu apostrofi u SQL naredbi
SqlCommand loginCommand = new SqlCommand("SELECT KorisnickoIme,Password FROM
Korisnik WHERE KorisnickoIme='" + tbUN.Text + "' and Password='" +
tbPsw.Text + "'", connection);

// izvrsavanje SQL komande
// s obzirom da je u pitanju SELECT klauzula koja vraca neke podatke o
// korisniku, koristi se metoda ExecuteReader()
SqlDataReader dr = loginCommand.ExecuteReader();

// Reader sadrzi samo jednog korisnika, pa nije neophodno da se koristi
// while petlja, dovoljno je if
if (dr.Read())
{
MessageBox.Show("Ulogovani ste kao " + dr["KorisnickoIme"].ToString(),
"Obavestenje", MessageBoxButtons.OK, MessageBoxIcon.Information);

btnUpdate.Enabled = true;
}
else
{
MessageBox.Show("Kombinacija korisnickog imena i lozinke nije dobra!",
"Obavestenje", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

// zatvaranje Reader-a i konekcije
dr.Close();
connection.Close();
}



149

// validacija TextBox polja za korisnicko ime
private void tbUN_Validating(object sender, CancelEventArgs e)
{
if (this.tbUN.Text == "")
{
errorProvider1.SetError(this.tbUN, "Niste uneli korisnicko ime");
tbUN.Focus();
tbUN.SelectAll();
}
else
{
errorProvider1.SetError(this.tbUN, "");
}
}

// validacija TextBox polja za lozinku
private void tbPsw_Validating(object sender, CancelEventArgs e)
{
if (this.tbPsw.Text == "")
{
errorProvider1.SetError(this.tbPsw, "Niste uneli lozinku ime");
tbUN.Focus();
tbUN.SelectAll();
}
else
{
errorProvider1.SetError(this.tbPsw, "");
}
}

private void btnRegistracija_Click(object sender, EventArgs e)
{
frmRegistracija frm = new frmRegistracija();
frm.ShowDialog();

tbUN.Clear();
tbPsw.Clear();
}

private void btnUpdate_Click(object sender, EventArgs e)
{
Sifra.KorIme = tbUN.Text;
Sifra.Sif = tbPsw.Text;

frmUpdate reg = new frmUpdate();
reg.ShowDialog();

tbUN.Clear();
tbPsw.Clear();
btnUpdate.Enabled = false;
}
}
}


150

// frmRegistracija.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient; // dodato zbog rada sa bazom

namespace LoginKon
{
public partial class frmRegistracija : Form
{
public frmRegistracija()
{
InitializeComponent();
}

private void btnRegistracija_Click(object sender, EventArgs e)
{
// objekat konekcije
SqlConnection connection = new SqlConnection();
connection.ConnectionString = Konekcija.konString;

// kreiranje objekta komande
// povezivanje sa Stored Procedure
SqlCommand insertCommand = new SqlCommand();

// naziv mora da bude identican nazivu Stored Procedure
insertCommand.CommandText = "InsertKorisnik";

insertCommand.CommandType = CommandType.StoredProcedure;
insertCommand.Connection = connection;

// kreiranje parametara
// nazivi parametara u zagradama moraju da se poklapaju sa
// nazivima parametara Stored Procedure
SqlParameter NazivFirmeParametar = new SqlParameter("@NazivFirme",
SqlDbType.NVarChar);
SqlParameter PibParametar = new SqlParameter("@Pib", SqlDbType.Int);
SqlParameter AdresaParametar = new SqlParameter("@Adresa",
SqlDbType.NVarChar);
SqlParameter GradParametar = new SqlParameter("@Grad", SqlDbType.NVarChar);
SqlParameter ImePrezimeParametar = new SqlParameter("@ImePrezime",
SqlDbType.NVarChar);
SqlParameter KontakTelParametar = new SqlParameter("@KontaktTel",
SqlDbType.Int);
SqlParameter KorisnickoImeParametar = new SqlParameter("KorisnickoIme",
SqlDbType.NVarChar);
SqlParameter EmailParametar = new SqlParameter("@Email", SqlDbType.VarChar);
SqlParameter PswParametar = new SqlParameter("@Psw", SqlDbType.NVarChar);

// kreiranje parametra koji je primarni kljuc
SqlParameter KorisnikIDParametar = new SqlParameter("@KorisnikID",
SqlDbType.Int);
//definisanje izlaznog parametra
KorisnikIDParametar.Direction = ParameterDirection.Output;

// dodavanje kreiranih parametara objektu SqlCommand
insertCommand.Parameters.Add(NazivFirmeParametar);
insertCommand.Parameters.Add(PibParametar);
151

insertCommand.Parameters.Add(AdresaParametar);
insertCommand.Parameters.Add(GradParametar);
insertCommand.Parameters.Add(ImePrezimeParametar);
insertCommand.Parameters.Add(KontakTelParametar);
insertCommand.Parameters.Add(KorisnickoImeParametar);
insertCommand.Parameters.Add(EmailParametar);
insertCommand.Parameters.Add(PswParametar);
insertCommand.Parameters.Add(KorisnikIDParametar);

//dodela vrednosti parametrima
NazivFirmeParametar.Value = tbNaziv.Text;
PibParametar.Value = Convert.ToInt32(tbPib.Text);
AdresaParametar.Value = tbAdresa.Text;
GradParametar.Value = tbGrad.Text;
ImePrezimeParametar.Value = tbIme.Text;
KontakTelParametar.Value = Convert.ToInt32(tbTel.Text);
KorisnickoImeParametar.Value = tbUserName.Text;
EmailParametar.Value = tbEmail.Text;
PswParametar.Value = tbPsw.Text;

int ID = 0;
try
{
connection.Open();

// izvrsavanje komande koja ne vraca vrednost
insertCommand.ExecuteNonQuery();

ID = Convert.ToInt32(KorisnikIDParametar.Value);
connection.Close();
MessageBox.Show("Ubacen korisnik ciji je ID:" + ID.ToString(), "Uspesna
registracija", MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Greska pri konekciji sa bazom");
}
}
}
}


152

// frmUpdate.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient; // dodato zbog rada sa bazom

namespace LoginKon
{
public partial class frmUpdate : Form
{
// pamti sifru ulogovanog korisnika
// da bi se azurirali podaci kod pravog korisnika
private string korisnikID;

public frmUpdate()
{
InitializeComponent();
ucitavanje();
}

private void ucitavanje()
{
// konekcija na bazu
SqlConnection connection = new SqlConnection();
connection.ConnectionString = Konekcija.konString;

// kreiranje objekta SqlReader
SqlDataReader dr = null;

try
{
connection.Open();

// definisanje SQL naredbe
// obratiti paznju na sintaksu
SqlCommand loginCommand = new SqlCommand("SELECT * FROM Korisnik WHERE
KorisnickoIme='" + Sifra.KorIme + "' and
Password='" + Sifra.Sif + "'", connection);

// izvrsavanje SQL komande koja vraca tabelarni zapis
dr = loginCommand.ExecuteReader();

// upisivanje podataka iz Reader-a u odgovarajuce kontrole na formi
if (dr.Read())
{
korisnikID = dr["KorisnikID"].ToString();
tbNaziv.Text = dr["NazivFirme"].ToString();
tbPib.Text = dr["Pib"].ToString();
tbAdresa.Text = dr["Adresa"].ToString();
tbGrad.Text = dr["Grad"].ToString();
tbIme.Text = dr["ImePrezime"].ToString();
tbTel.Text = dr["KontaktTel"].ToString();
tbUserName.Text = Sifra.KorIme;
tbEmail.Text = dr["Email"].ToString();
tbPsw.Text = Sifra.Sif;
}
}

153

catch (Exception ex)
{
MessageBox.Show(ex.Message, "Greska pri konekciji sa bazom");
}

// blok koji se uvek izvrsava
// preporuka je da se u okviru njega uvek zatvara konekcija
finally
{
dr.Close();
connection.Close();
}
}

private void btnUpdate_Click(object sender, EventArgs e)
{
// konekcija na bazu
SqlConnection connection = new SqlConnection();
connection.ConnectionString = Konekcija.konString;

try
{
connection.Open();

// definisanje SQL naredbe
// obratiti paznju na sintaksu
// neophodno je za podatke tipa string napisati isperd 'N
// a iza samo apostrof
StringBuilder upit = new StringBuilder();
upit.Append("UPDATE [dbo].[Korisnik]");
upit.Append("SET NazivFirme=N'" + this.tbNaziv.Text + "',Pib=" +
this.tbPib.Text + ",Adresa=N'" + this.tbAdresa.Text +
"',Grad=N'" + this.tbGrad.Text + "',ImePrezime=N'" +
this.tbIme.Text + "',KontaktTel=" + this.tbTel.Text +
",KorisnickoIme=N'" + this.tbUserName.Text + "',Email=N'" +
this.tbEmail.Text + "',Password=N'" + this.tbPsw.Text + "'");
upit.Append("WHERE KorisnikID =" + this.korisnikID);

// kreiranje SqlCommand objekta sa definisanim upitom i konekcijom
SqlCommand updateKomanda = new SqlCommand(upit.ToString(), connection);

// izvrsavanje SQL komande koja ne vraca vrednost
updateKomanda.ExecuteNonQuery();

MessageBox.Show("Uspesno izmenjeni podaci korisnika u bazi podataka",
"Uspesno azuriranje", MessageBoxButtons.OK,
MessageBoxIcon.Information);
}

catch (Exception ex)
{
MessageBox.Show(ex.Message, "Greska pri konekciji sa bazom");
}

// blok koji se uvek izvrsava
// preporuka je da se u okviru njega uvek zatvraju objekti i konekcija
finally
{
connection.Close();
}
}
}
}

154


Zadatak 3.5. Manipulacija podacima (selecet, insert, update, delete) u
diskonektovanom okruenju
Kreirati bazu podataka Prijemni koja ima dve povezane tabele, ija je struktura prikazana
na slici 3.4 (struktura baze data je u zadataku 3.1). Tabelu Kandidati popuniti podacima sa
slike 3.15.

Slika 3.15. Zapisi u tabeli Kandidati Slika 3.16. Design prozor za Zadatak 3.5
Kreirati WinForms aplikaciju pod nazivom Diskonektovani. Kreirati formu kao na slici 3.16
i podesiti kontrole kao to je prikazano u tabeli 3.6.
Tabela 3.6. Svojstva i dogaaji kontrola za Zadatak 3.5
Kontrola/Svojstva Name Text Dodatna svojstva i dogaaji
Label label1 Izaberi kandidata
Label label2 Broj prijave
Label label3 Broj poena
Label label4 Studijski program
Label label5 Prezime i ime
ComboBox cbKandidat
Dogaaj
SelectedIndexChanged
TextBox tbID
TextBox tbPoeni
TextBox tbSmer
TextBox tbIme
Button btnUbaci Ubaci Dogaaj Click
Button btnPromeni Promeni Dogaaj Click
Button btnBrisi Brisi Dogaaj Click
Button btnResetuj Resetuj Dogaaj Click

Napomena: Zadatak reiti u diskonektovanom scenariju, pri emu se DataAdapter i DataSet
objekti kreiraju u kodu. Koristiti try-catch blokove.

155

Zahtevane funkcionalnosti aplikacije:
Prilikom startovanja aplikacije popuniti cbKandidat sa prezimenima i imenima iz
tabele Kandidati (atribut PrezimeIme).
Izborom nekog kandidata ostala TextBox polja se popunjavaju podacima za tog
kandidata.
Klikom na dugme btnUbaci insertuje se novi kandidat u bazu i korisniku se prikazuje
odgovarajua MessageBox poruka.
Klikom na dugme btnPromeni auriraju se podaci o izabranom kandidatu u bazi i
korisniku se prikazuje odgovarajua MessageBox poruka.
Klikom na dugme btnBrisi brie se izabrani kandidat iz baze i korisniku se prikazuje
odgovarajua MessageBox poruka.
Klikom na dugme btnResetuj resetuju (prazne) se TextBox polja.

Reenje:
// Konekcija.cs
class Konekcija
{
public static string konString = Properties.Settings.Default.PrijemniConnectionString;
}

// Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient; // dodato zbog rada sa bazom

namespace Diskonektovani
{
public partial class Form1 : Form
{
private SqlDataAdapter da = null;

public Form1()
{
InitializeComponent();
puniComboKandidati();
}

// metoda koja cita podatke iz baze i
// kao rezultat vraca tabelu sa procitanim podacima
private DataTable citajTabeluKandidati()
{
SqlConnection konekcija = new SqlConnection(Konekcija.konString);

// kreiranje DataSet objekta
DataSet ds = new DataSet();
156


// punjenje objekta SqlDataAdapter-a sa podacima iz tabele Kandidati
da = new SqlDataAdapter("select * from Kandidati", konekcija);
da.MissingSchemaAction = MissingSchemaAction.AddWithKey;

// punjenje objekta DataSet sa podacima iz SqlDataAdapter
da.Fill(ds, "Kandidati");

// kreiranje tabele koja predstavlja kopiju tabele Kandidati
DataTable mojaTabela = ds.Tables["Kandidati"];

return mojaTabela;
}


// metoda koja popunjava ComboBox sa podacima iz baze
private void puniComboKandidati()
{
// mojaTabela puni podacima iz baze
DataTable mojaTabela = citajTabeluKandidati();

// izvor podataka za ComboBox se postavlja mojaTabela
cbKandidat.DataSource = mojaTabela;

// definisanje koji atribut se vidi u ComboBox-u
cbKandidat.DisplayMember = "PrezimeIme";

// definisanje koji atribut se pamti u ComboBox-u
cbKandidat.ValueMember = "BrojPrijave";
}

private void btnUbaci_Click(object sender, EventArgs e)
{
DataTable mojaTabela = citajTabeluKandidati();
string ID = tbID.Text;

try
{
// kreiranje novog reda u tabeli
DataRow novaVrsta = mojaTabela.NewRow();

// popunjavanje novog reda sa podacima
novaVrsta["BrojPrijave"] = ID;
novaVrsta["BrojPoena"] = tbPoeni.Text;
novaVrsta["StudijskiProgram"] = tbSmer.Text;
novaVrsta["PrezimeIme"] = tbIme.Text;

// dodavanje popunjenog reda u tabelu
mojaTabela.Rows.Add(novaVrsta);

// azuriranje SqlDataAdapter-a
da.Update(mojaTabela);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
MessageBox.Show("Zapis ubacen u bazu");

// poziv metode za punjenje ComboBox-a
// u koji ce biti ubacen i novi zapis
puniComboKandidati();

157

// postavljanje ComboBox-a na tek dodati zapis
cbKandidat.SelectedValue = ID;
}

private void btnPromeni_Click(object sender, EventArgs e)
{
string ID = tbID.Text;
DataTable mojaTabela = citajTabeluKandidati();
try
{
// pronalazenje zapisa po zadatom primarnom kljucu
DataRow vrstaZaPromenu = mojaTabela.Rows.Find(ID);
vrstaZaPromenu["BrojPoena"] = tbPoeni.Text;
vrstaZaPromenu["StudijskiProgram"] = tbSmer.Text;
vrstaZaPromenu["PrezimeIme"] = tbIme.Text;

// azuriranje SqlDataAdapter-a
int brojVrsta = da.Update(mojaTabela);
}
catch (SqlException ex)
{
MessageBox.Show(ex.Message);
return;
}

puniComboKandidati();
cbKandidat.SelectedValue = ID;
MessageBox.Show("Zapis azuriran");
}

private void btnBrisi_Click(object sender, EventArgs e)
{
DataTable mojaTabela = citajTabeluKandidati();
try
{
// pronalazenje zapisa po zadatom primarnom kljucu
DataRow vrstaZaBrisanje = mojaTabela.Rows.Find(tbID.Text);
vrstaZaBrisanje.Delete();

// azuriranje SqlDataAdapter-a
int brojVrsta = da.Update(mojaTabela);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
MessageBox.Show("Zapis obrisan iz baze");

puniComboKandidati();
resetuj();
}

private void resetuj()
{
tbID.Clear();
tbPoeni.Clear();
tbIme.Clear();
tbSmer.Clear();
cbKandidat.SelectedIndex = -1;
}



158

private void btnResetuj_Click(object sender, EventArgs e)
{
resetuj();
}

// popunjavanje TextBox polja za selektovanog kandidata
private void cbKandidat_SelectedIndexChanged(object sender, EventArgs e)
{
if (cbKandidat.SelectedIndex != -1)
{
DataRowView mojaVrsta = (DataRowView)cbKandidat.SelectedItem;
tbID.Text = mojaVrsta["BrojPrijave"].ToString(); ;
tbPoeni.Text = mojaVrsta["BrojPoena"].ToString();
tbSmer.Text = mojaVrsta["Studijskiprogram"].ToString();
tbIme.Text = mojaVrsta["PrezimeIme"].ToString();
}
}
}
}

159

Zadatak 3.6. Simulacija prijavnog formulara (diskonektovano okruenje)
Zadatak 3.4. reiti u diskonektovanom okruenju, bez Validating dogaaja i ErrorProvider
kontrole.
Kreirati bazu podataka Login koja ima jednu tabelu Korisnik, ija je struktura prikazana
na slici 3.17. Primarni klju KorisnikID je setovan kao autoincrement. Kreirati jednu stored
procedure-u pod nazivom InsertKorisnik koja sadri parametarski upit za insertovanje
novog korisnika u tabelu pri emu se podaci o korisniku zadaju preko paramatara.

Slika 3.17. DesignView tabele Korisnik Slika 3.18. Design Logovanje za Zadatak 3.6
Kreirati WinForms aplikaciju pod nazivom Login. Kreirati formu Logovanje kao na slici
3.18 i podesiti kontrole kao to je prikazano u tabeli 3.7.
Tabela 3.7. Svojstva i dogaaji kontrola formu Logovanje za Zadatak 3.6
Kontrola/Svojstva Name Text Dodatna svojstva i dogaaji
Label label1 User name:
Label label2 Password:
TextBox tbUN
TextBox tbPsw
Button btnLogin LogIN Dogaaj Click
Button btnRegistracija Registracija Dogaaj Click
Button btnUpdate Update Dogaaj Click

Dodati jo dve forme kao na slici 3.14 i podesiti kontrole kao to je prikazano u tabeli 3.5.
Za formu Update svojstva Name za TextBox kontrole su iste kao i za formu Registracija,
dok je za Button kontrolu Name=btnUpdate1.
160


Slika 3.19. Design view formi Registracija i Update za Zadatak 3.6
Tabela 3.8. Svojstva i dogaaji kontrola formi Registracija za Zadatak 3.6
Kontrola/Svojstva Name Text Dodatna svojstva i dogaaji
Label label1 Registruj se:
Label label2 Naziv firme:
Label label3 PIB:
Label label4 Adresa:
Label label5 Grad:
Label label6 Ime i prezime:
Label label7 Kontakt telefon:
Label label8 Korisniko ime:
Label label9 Email adresa:
Label label10 Password:
TextBox tbNaziv
TextBox tbPib
TextBox tbAdresa
TextBox tbGrad
TextBox tbIme
TextBox tbTel
TextBox tbUserName
TextBox tbEmail
TextBox tbPsw
Button button1 Registruj se Dogaaj Click



161

Zahtevane funkcionalnosti aplikacije:
Prilikom startovanja aplikacije prikazuje se poetna forma frmPocetna. Dugme
btnUpdate je nedostupno za korienje. Njene funkcionalnosti su:
o Klikom na dugme btnLogin proverava se da li postoji korisnik sa zadatim
korisnikim imenom i lozinkom. Ukoliko postoji prikazuje se MessageBox sa
porukom: Ulogovani ste kao xxxxx i dugme btnUpdate postaje dostupno.
Ukoliko nije ispravna kombinacija korisnikog imena i lozinke putem
MessageBox-a obavestiti korisnika o tome.
o Klikom na dugme btnRegistration otvara se forma Registracija.
Klikom na dugme Registruj se (forme frmRegistracija) podaci o
korisniku (iz odgovarajuih TextBox kontrola) se ubacuju u bazu.
Korisnik se obavetava putem MessageBox-a o uspehu upisa podataka
u bazu.
o Klikom na dugme btnUpdate otvara se forma Update, ija TextBox polja su
popunjena odgovarajuim podacima iz baze za ulogovanog korisnika.
Klikom na dugme Update (forme frmUpdate) podaci o korisniku (iz
odgovarajuih TextBox kontrola) se auriraju u bazi. Korisnik se
obavetava putem MessageBox-a o uspehu auriranja podataka u
bazu.
Reenje:
// Konekcija.cs
class Konekcija
{
public static string konString = Properties.Settings.Default.LoginConnectionString;
}
// Sifra.cs
class Sifra
{
private static string korIme;
private static string sif;

public static string KorIme
{
get { return korIme; }
set { korIme = value; }
}

public static string Sif
{
get { return sif; }
set { sif = value; }
}
}




162

// Logovanje.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient; // dodato zbog rada sa bazom

namespace Login
{
public partial class Logovanje : Form
{
public Logovanje()
{
InitializeComponent();
btnUpdate.Enabled = false;
}

private void btnLogin_Click(object sender, EventArgs e)
{
// kreiranje adaptera sa primarnim kljucem
// kada se koristi adapter nije neophodno otvoriti i zatvoriti bazu
// jer se to automatski radi
SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Korisnik WHERE
KorisnickoIme='" + tbUN.Text + "' and Password='" +
tbPsw.Text + "'", Konekcija.konString);
da.MissingSchemaAction = MissingSchemaAction.AddWithKey;

// kreiranje DataSet-a
DataSet ds = new DataSet();

// punjenje adaptera sa DataSet-a podacima iz tabele Korisnik iz baze
da.Fill(ds, "Korisnik");

// kreiranje lokalne promenljive tb tipa tabele koja je identicna
// tabeli Korisnik iz DataSet-a
DataTable tb = ds.Tables["Korisnik"];

// trazenje zapisa u tabeli sa navedenim korisnickim imenom i lozinkom
try
{
// Rows[0] jer se pretpostavlja da nema vise korisnika sa
// identicnim username i password
if (tb.Rows[0]["KorisnickoIme"].ToString() == this.tbUN.Text &&
tb.Rows[0]["Password"].ToString() == this.tbPsw.Text)
{
MessageBox.Show("Ulogovani ste kao " +
tb.Rows[0]["KorisnickoIme"].ToString(),
"Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Information);
DialogResult = DialogResult.OK;
btnUpdate.Enabled = true;
}
}
catch (Exception ex)
{
MessageBox.Show("Kombinacija korisnickog imena i lozinke nije dobra!",
"Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Information);
tbUN.Clear();
163

tbPsw.Clear();
}
}

private void btnUpdate_Click(object sender, EventArgs e)
{
Sifra.KorIme = tbUN.Text;
Sifra.Sif = tbPsw.Text;

Update reg = new Update();
reg.ShowDialog();

tbUN.Clear();
tbPsw.Clear();
btnUpdate.Enabled = false;
}

private void btnRegistration_Click(object sender, EventArgs e)
{
Registracija frm = new Registracija();
frm.ShowDialog();

tbUN.Clear();
tbPsw.Clear();
}

}
}

// Registracija.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient; // dodato zbog rada sa bazom

namespace Login
{
public partial class Registracija : Form
{
public Registracija()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
// kreiranje adaptera
SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Korisnik",
Konekcija.konString);

// kreiranje DataSet-a
DataSet ds = new DataSet();

// punjenje adaptera sa DataSet-a podacima iz tabele Korisnik iz baze
da.Fill(ds, "Korisnik");

DataTable tb = ds.Tables["Korisnik"];
164


// kreiranje novog reda u tabeli tb
DataRow novaVrsta = tb.NewRow();

// dodeljivanje vrednosti poljima novog reda
novaVrsta["NazivFirme"] = tbNaziv.Text;
novaVrsta["Pib"] = tbPib.Text;
novaVrsta["Adresa"] = tbAdresa.Text;
novaVrsta["Grad"] = tbGrad.Text;
novaVrsta["ImePrezime"] = tbIme.Text;
novaVrsta["KontaktTel"] = tbTel.Text;
novaVrsta["KorisnickoIme"] = tbUserName.Text;
novaVrsta["Email"] = tbEmail.Text;
novaVrsta["Password"] = tbPsw.Text;

// dodavanje popunjenog reda tabeli tb
tb.Rows.Add(novaVrsta);

// definisanje SQL upita za insertovanje podataka
string SQLInsert = String.Format("INSERT INTO Korisnik (NazivFirme, Pib,
Adresa, Grad, ImePrezime, KontaktTel, KorisnickoIme,
Email, Password) " +
"VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}',
'{7}', '{8}');",
tbNaziv.Text, tbPib.Text, tbAdresa.Text, tbGrad.Text, tbIme.Text,
tbTel.Text, tbUserName.Text, tbEmail.Text, tbPsw.Text);

// kreiranje konekcije i njeno otvaranje
SqlConnection kon = new SqlConnection(Konekcija.konString);

// ubacivanje definisanog upita u adapter kao InsertCommand
da.InsertCommand = new SqlCommand(SQLInsert, kon);

int brVrsta = 0;

try
{
// ubacivanje promene u bazu
brVrsta = da.Update(tb);

MessageBox.Show("Registracija je uspesno obavljena");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}


165

// Update.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient; // dodato zbog rada sa bazom

namespace Login
{
public partial class Update : Form
{
public Update()
{
InitializeComponent();
ucitavanje();
}

// polje u kome ce se cuvati KorisnikID za ulogovanog korisnika
string ID;

// ucitavanje podataka iz baze za ulogovanog korisnika
private void ucitavanje()
{
try
{
// kreiranje adaptera sa primarnim kljucem koji sadrzi podatke za
// ulogovanog korisnika
SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Korisnik WHERE
KorisnickoIme='" + Sifra.KorIme + "' and Password='"
+ Sifra.Sif + "'", Konekcija.konString);
da.MissingSchemaAction = MissingSchemaAction.AddWithKey;

// kreiranje DataSet-a
DataSet ds = new DataSet();

// punjenje adaptera sa DataSet-a podacima iz tabele Korisnik iz baze
da.Fill(ds, "Korisnik");
DataTable tb1 = ds.Tables["Korisnik"];

// setovanje ID polja sa vrednoscu KorisnikID za ulogovanog korisnika
ID = tb1.Rows[0]["KorisnikID"].ToString();

// popunjavanje TextBox kontrola podacima iz tabele
// za ulogovanog korisnika
this.tbNaziv.Text = tb1.Rows[0]["NazivFirme"].ToString();
this.tbPib.Text = tb1.Rows[0]["Pib"].ToString();
this.tbAdresa.Text = tb1.Rows[0]["Adresa"].ToString();
this.tbGrad.Text = tb1.Rows[0]["Grad"].ToString();
this.tbIme.Text = tb1.Rows[0]["ImePrezime"].ToString();
this.tbTel.Text = tb1.Rows[0]["KontaktTel"].ToString();
this.tbUserName.Text = tb1.Rows[0]["KorisnickoIme"].ToString();
this.tbEmail.Text = tb1.Rows[0]["Email"].ToString();
this.tbPsw.Text = tb1.Rows[0]["password"].ToString();
}
catch (Exception exc)
{
MessageBox.Show(exc.Message, "Greska pri konekciji sa bazom");
}
}
166

private void btnUpdate1_Click(object sender, EventArgs e)
{
// kreiranje adaptera sa primarnim kljucem
SqlDataAdapter da = new SqlDataAdapter("select * from Korisnik",
Konekcija.konString);
da.MissingSchemaAction = MissingSchemaAction.AddWithKey;

// kreiranje DataSet-a
DataSet ds = new DataSet();

// punjenje adaptera sa DataSet-a podacima iz tabele Korisnik iz baze
da.Fill(ds, "Korisnik");

DataTable tb = ds.Tables["Korisnik"];

// kreiranje reda iz tabele za ulogovanog korisnika
// na osnovu njegovog KorisnikID
DataRow vrsta = tb.Rows.Find(ID);

// popunjavanje odgovarajucih polja reda sa vrednostima TextBox kontrola
vrsta["NazivFirme"] = tbNaziv.Text;
vrsta["Pib"] = tbPib.Text;
vrsta["Adresa"] = tbAdresa.Text;
vrsta["Grad"] = tbGrad.Text;
vrsta["ImePrezime"] = tbIme.Text;
vrsta["KontaktTel"] = tbTel.Text;
vrsta["KorisnickoIme"] = tbUserName.Text;
vrsta["Email"] = tbEmail.Text;
vrsta["Password"] = tbPsw.Text;

// definisanje SQL upita za update podataka
string SQLUpdate = String.Format("UPDATE [dbo].[Korisnik] SET NazivFirme=N'"
+ this.tbNaziv.Text + "',Pib=" + this.tbPib.Text +
",Adresa=N'" + this.tbAdresa.Text + "',Grad=N'" +
this.tbGrad.Text + "',ImePrezime=N'" + this.tbIme.Text +
"',KontaktTel=" + this.tbTel.Text + ",KorisnickoIme=N'" +
this.tbUserName.Text + "',Email=N'" + this.tbEmail.Text +
"',Password=N'" + this.tbPsw.Text + "' WHERE KorisnikID ="
+ ID);

// kreiranje konekcije i njeno otvaranje
SqlConnection kon = new SqlConnection(Konekcija.konString);

// ubacivanje definisanog upita u adapter kao UpdateCommand
da.UpdateCommand = new SqlCommand(SQLUpdate, kon);

int brVrsta = 0;

try
{
// ubacivanje promene u bazu
brVrsta = da.Update(tb);

MessageBox.Show("Podaci korisnika su azurirani!", "Obavestenje");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

}
}

167

Zadatak 3.7. Manipulacija podacima (selecet, insert, update, delete) primenom
tipiziranog DataSet-a
Zadatak 3.5 reiti primenom tipiziranog DataSet-a. Za studijske programe predvideti
ComboBox kontrolu koja se puni podacima iz baze.
Struktura baze Prijemni je opisana u Zadataku 3.1. Kreirati PrijemniDataSet ija je
struktura prikazana na slici 3.20.

Slika 3.20. PrijemniDataSet

Slika 3.21. Design prozor za Zadatak 3.7
Kreirati WinForms aplikaciju pod nazivom TipiziraniPrijemni. Kreirati formu kao na slici
3.21 i podesiti kontrole kao to je prikazano u tabeli 3.9.
Tabela 3.9. Svojstva i dogaaji kontrola za Zadatak 3.7
Kontrola/Svojstva Name Text Dodatna svojstva i dogaaji
Form Form1
Rad sa tipiziranim
DataSet-om
Dogaaj Load
Label label1 Izaberi kandidata
Label label2 Broj prijave
Label label3 Prezime i ime
Label label4 Broj poena
Label label5 Studijski program
ComboBox cbKandidat
Svojstvo
DropDownStyle=DropDownList
168

Dogaaj
SelectedIndexChanged
ComboBox cbSmer
Svojstvo
DropDownStyle=DropDownList
TextBox tbID
TextBox tbPoeni
TextBox tbIme
Button btnUbaci Ubaci Dogaaj Click
Button btnPromeni Promeni Dogaaj Click
Button btnBrisi Brisi Dogaaj Click
Button btnResetuj Resetuj Dogaaj Click

Zahtevane funkcionalnosti aplikacije:
Prilikom startovanja aplikacije popuniti cbKandidat sa prezimenima i imenima iz
tabele Kandidati (atribut PrezimeIme).
Izborom nekog kandidata ostala TextBox polja i cbSmer se popunjavaju podacima za
tog kandidata.
Klikom na dugme btnUbaci insertuje se novi kandidat u bazu i korisniku se prikazuje
odgovarajua MessageBox poruka.
Klikom na dugme btnPromeni auriraju se podaci o izabranom kandidatu u bazi i
korisniku se prikazuje odgovarajua MessageBox poruka.
Klikom na dugme btnBrisi brie se izabrani kandidat iz baze i korisniku se prikazuje
odgovarajua MessageBox poruka.
Klikom na dugme btnResetuj resetuju (prazne) se TextBox polja.

Reenje:
// Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

// dodato zbog klasa PrijemniDataSet
using TipiziraniPrijemni.PrijemniDataSetTableAdapters;

namespace TipiziraniPrijemni
{
public partial class Form1 : Form
{
// kreiranje objekata DataSet i TableAdapter
// koji se inicijaliyujuu Load dogadjaju
private PrijemniDataSet ds;
private KandidatiTableAdapter kta;
private StudijskiProgramiTableAdapter sta;

169

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
ds = new PrijemniDataSet();
kta = new KandidatiTableAdapter();
sta = new StudijskiProgramiTableAdapter();

puniDataSet();
puniKandidate();
puniSmer();
}

// popunjava odgovarajuce tabele DataSet-a preko
// odgovarajucih TableAdapter-a
private void puniDataSet()
{
kta.Fill(ds.Kandidati);
sta.Fill(ds.StudijskiProgrami);
}

// popunjavanje ComboBox-a koji prikazuje prezimena i imena kandidata
private void puniKandidate()
{
cbKandidat.DataSource = ds.Kandidati;
cbKandidat.DisplayMember = "PrezimeIme";
cbKandidat.ValueMember = "BrojPrijave";
}

// popunjavanje ComboBox-a koji prikazuje studijske programe
private void puniSmer()
{
cbSmer.DataSource = ds.StudijskiProgrami;
cbSmer.DisplayMember = "Naziv";
cbSmer.ValueMember = "StudijskiProgramID";
}

private void btnUbaci_Click(object sender, EventArgs e)
{
// provera da li su sva polja popunjena
if (String.IsNullOrEmpty(tbID.Text) || String.IsNullOrEmpty(tbIme.Text) ||
String.IsNullOrEmpty(tbPoeni.Text) || (cbSmer.SelectedIndex == -1))
{
MessageBox.Show("Sva polja su obavezna", "Obavestenje");
return;
}
try
{
// poziv gotove metode za insertovanje podataka u bazu
kta.Insert(Convert.ToInt32(tbID.Text), tbIme.Text,
Convert.ToDouble(tbPoeni.Text),
Convert.ToInt32(cbSmer.SelectedValue));
}
catch (Exception)
{
MessageBox.Show("Greska pri unosu podataka");
return;
}



170

// novo punjenje DataSet sa podacima iz baze
// kako bi se ucitao i ubaceni kandidat
puniDataSet();

// novo punjenje cbKandidati sa podacima iz DataSet-a
// kako bi se prikazao i ubaceni kandidat
puniKandidate();

// novi kandidat se ubacuje kao poslednji red
// pamti se koji je to red u brVrsta
int brVrsta = ds.Kandidati.Rows.Count;

// cbKandidat se setuje na poslednji red
// kako bi se prikazli podaci bas za novog kandidata
cbKandidat.SelectedValue = ds.Kandidati.Rows[brVrsta - 1][0];

MessageBox.Show("Novi red je uspesno ubacen");
}


private void btnPromeni_Click(object sender, EventArgs e)
{
// pamti se BrojPrijave selektovanog kandidata
int id = Convert.ToInt32(tbID.Text);

// pronalazi se red koji sadrzi podatke o selektovanom kandidatu
// preko njegovog primarnog kljuca
PrijemniDataSet.KandidatiRow vrsta = ds.Kandidati.FindByBrojPrijave(id);

vrsta.BeginEdit(); // "otvaranje" reda za promene
vrsta.PrezimeIme = tbIme.Text;
vrsta.BrojPoena = Convert.ToDouble(tbPoeni.Text);
int idSmer = Convert.ToInt32(cbSmer.SelectedValue);
vrsta.StudijskiProgram = idSmer;
vrsta.EndEdit(); // "zatvaranje" reda za promene

try
{
kta.Update(vrsta); // poziv metode za update
}
catch (Exception)
{
MessageBox.Show("Greska pri menjanju podataka");
return;
}

// novo punjenje DataSet sa podacima iz baze
// kako bi se ucitali izmenjeni podaci
puniDataSet();

// novo punjenje cbKandidati sa podacima iz DataSet-a
// kako bi se prikazali izmenjeni podaci
puniKandidate();

// prikaz podataka za kandidata ciji su podaci menjani
cbKandidat.SelectedValue = id;
cbSmer.SelectedValue = idSmer;

MessageBox.Show("Podaci su uspesno promenjeni");
}




171

private void btnBrisi_Click(object sender, EventArgs e)
{
// provera da li je selektovan kandidat
if (cbKandidat.SelectedIndex == -1)
return;

// pamti se BrojPrijave selektovanog kandidata
int id = Convert.ToInt32(tbID.Text);

// pronalazi se red koji sadrzi podatke o selektovanom kandidatu
// preko njegovog primarnog kljuca
PrijemniDataSet.KandidatiRow vrsta = ds.Kandidati.FindByBrojPrijave(id);

try
{
vrsta.Delete(); // poziv metode za brisanje
kta.Update(vrsta); // poziv metode za update
}
catch (Exception)
{
MessageBox.Show("Greska zbog narusavanja referencijalnog integriteta");
return;
}

// novo punjenje cbKandidati sa podacima iz DataSet-a
// kako bi se izbrisao izbaceni kandidat
puniKandidate();

resetuj();
MessageBox.Show("Podaci su uspesno obrisani");
}


private void resetuj()
{
tbID.Clear();
tbIme.Clear();
tbPoeni.Clear();
cbKandidat.SelectedIndex = -1;
cbSmer.SelectedIndex = -1;
}


private void btnResetuj_Click(object sender, EventArgs e)
{
resetuj();
}


private void cbKandidat_SelectedIndexChanged(object sender, EventArgs e)
{
if (cbKandidat.SelectedIndex == -1)
{
return;
}

// kreiranje objekta koji sadrzi primarni kljuc selektovanog kandidata
DataRowView drv = (DataRowView)cbKandidat.SelectedItem;
int ID;
// konverzija u int
Int32.TryParse(drv[0].ToString(), out ID);

// pronalazi se red koji sadrzi podatke o selektovanom kandidatu
// preko njegovog primarnog kljuca
172

PrijemniDataSet.KandidatiRow vrsta = ds.Kandidati.FindByBrojPrijave(ID);

// popunjavanje TextBox polja podacima iz reda
// koji sadrzi podatke za selektovanog kandidata
tbID.Text = vrsta.BrojPrijave.ToString();
tbIme.Text = vrsta.PrezimeIme;
tbPoeni.Text = vrsta.BrojPoena.ToString();

// popunjavanje ComboBox polja za smer podacima iz reda
// koji sadrzi podatke za selektovanog kandidata
cbSmer.SelectedValue = vrsta.StudijskiProgram;
}
}
}

173

Zadatak 3.8. Manipulacija podacima (selecet, insert, update, delete) primenom
BindingSource kontrole
Kreirati WinForms aplikaciju pod nazivom BindingSource.
Kreirati bazu Automobili u VisualStudio. Postupak je sledei:
1. U Solution Explorer-u desni klik mia na naziv projekta pa Add New Item. S leve
strane prozora izabrati kategoriju Data, a u centralnom delu za tip item-a Service-
based Database (videti sliku 3.22). Nakon kreiranja baze nemojte kreirati tipizirani
DataSet.

Slika 3.22. Kreiranje lokalne baze u VisualStudio
2. Potom dupli klik na Automobili.mdf fajl u SolutionExplorer-u. Otvara se prozor u
kome se preko wizard-a kreira dizajn baze.
3. Biramo opciju kreiranja preko Server Explorer-a. Izabrati Tables i desni klik mia,
opcija Add New Table (kao na slici 3.23). Tabelu nazvati Auto.
Slika 3.23. Dodavanje tabela
4. Tabela se dizajnira na slian nain kao u Design View u MS SQL Managment Studio.
Na slici 3.24 i 3.25 je dat prikaz kako se neki atribut setuje kao primarni klju i
autoincrement.
174


Slika 3.24. Definisanje primarnog kljua

Slika 3.25. Definisanje atributa kao autoincrement
5. Krerirati tabelu kao na slici 3.26. Primetiti da se popunjavanjem tabele u dizajnu
automatski kreira odgovarajui SQL upit. Mogue je tabelu kreirati i direktnim
kucanjem SQL upita.

Slika 3.26. Tabela Auto
175

6. Klikom na strelicu Update (videti sliku 3.26) otvara se prozor kao na slici 3.27.
Klikom na dugme Update Database kreira se tabela u bazi na LocalDB\v11.0
database serveru (videti sliku 3.28).

Slika 3.27. Database Updates

Slika 3.28. Obavetenje da je baza kreirana
7. Potrebno je jo podesiti svojstva mdf fajla tj. baze. Klik na Automobili.mdf u Solution
Explorer-u, pa potom u Properties prozoru podesiti svojstvo Copy to Output Directory
na vrednost Copy if never (videti sliku 3.29).

Slika 3.29. Podeavanje svojstava baze

176

8. Za unos zapisa u tabelu potrebno je desnim klikom mia na tabelu Auto u Server
Explorer-u izabrati opciju Show Table data (videti sliku 3.30). Uneti zapise sa slike
3.31.

Slika 3.30. Otvaranje tabele za unos zapisa

Slika 3.31. Zapisi tabele Auto
9. Potrebno je dodati bazu Automobili.mdf kao Data Source u aplikaciju i kreirati
tipizirani DataSet. Znai, padajua lista Project opcija Add New dataSource.
Izabrati eljenu bazu i elemente baze koji se koriste (videti sliku 3.32). U Solution
Explorer-u je dodat AutomobiliDataSet.

Slika 3.32. Dodavanje baze kao DataSource i definisanje elemenata baze koji se koriste
177

10. Za AutoID podesiti svojstva AutoIncrementSeed i AutoIncrementStep na -1, ukoliko
je drugaije setovano (videti sliku 3.33).

Slika 3.33. Podeavanje svojstava atributa u DataSet-u
Kreirati formu kao na slici 3.34.

Slika 3.34. Design prozor za Zadatak 3.8
ListBox sa leve strane povezati sa BindingSource kontrolom (vidieti sliku 3.35).

Slika 3.35. Povezivanje ListBox kontrole sa BindingSource
178

TextBox polja sa desne strane forme (slika 3.34) se dobijaju prevlaenjem odgovarajuih
atributa iz DataSet-a (vidieti sliku 3.36).

Slika 3.36. Povezivanje TextBox kontrola sa DataSet-om
Dodati jo 5 button kontrola (btnDodaj, btnSacuvaj, btnOdustani, btnIzmeni, btnObrisi) i
aktivirati njihove Click dogaaje.

Zahtevane funkcionalnosti aplikacije:
Prilikom startovanja aplikacije TextBox polja podesiti da su nedostupna za upis, a
btnSacuvaj i btnOdustani su takoe nedostupni za korienje.
Klikom na dugme btnDodaj TextBox polja postaju dostupna za upis, kao i btnSacuvaj
i btnOdustani, dok ostala tri dugmeta postaju nedostupna za korienje. TextBox
polja su prazna.
Klikom na dugme btnSacuvaj auriraju se podaci u bazi. Dugmad btnSacuvaj i
btnOdustani postaju nedostupni za korienje, dok ostala tri dugmeta postaju
dostupna za korienje.
Klikom na dugme btnOdustani TextBox polja postaju nedostupna za upis, kao i
btnSacuvaj i btnOdustani, dok ostala tri dugmeta postaju dostupna za korienje.
Klikom na dugme btnIzmeni TextBox polja postaju dostupna za upis, kao i
btnSacuvaj i btnOdustani, dok ostala tri dugmeta postaju nedostupna za korienje.
Klikom na dugme btnObrisi prikazuje se odgovarajui MessageBox u kome se od
korisnika zahteva potvrda brisanja. Ukoliko korisnik potvrdi brisanje izbrisati auto iz
baze.


179

Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace BindingSource
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void dozvoliIzmenu(bool dozvoli)
{
proizvodjacTextBox.ReadOnly = !dozvoli;
modelTextBox.ReadOnly = !dozvoli;
godisteTextBox.ReadOnly = !dozvoli;

listBox1.Enabled = !dozvoli;

btnDodaj.Enabled = !dozvoli;
btnIzmeni.Enabled = !dozvoli;
btnObrisi.Enabled = !dozvoli;

btnSacuvaj.Enabled = dozvoli;
btnOdustani.Enabled = dozvoli;
}

private void autoBindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
this.Validate();
this.autoBindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.automobiliDataSet);
}

private void Form1_Load(object sender, EventArgs e)
{
// TODO: This line of code loads data into the 'automobiliDataSet.Auto'
// table.
// You can move, or remove it, as needed.
this.autoTableAdapter.Fill(this.automobiliDataSet.Auto);

dozvoliIzmenu(false);
}

// dodaje se novi red, ali samo u DataSet, ne i u bazu
private void btnDodaj_Click(object sender, EventArgs e)
{
dozvoliIzmenu(true);
this.autoBindingSource.AddNew();
}

private void btnSacuvaj_Click(object sender, EventArgs e)
{
dozvoliIzmenu(false);
180

this.autoBindingSource.EndEdit();
this.autoTableAdapter.Update(this.automobiliDataSet.Auto);
}

private void btnOdustani_Click(object sender, EventArgs e)
{
dozvoliIzmenu(false);
this.autoBindingSource.CancelEdit();
}

private void btnIzmeni_Click(object sender, EventArgs e)
{
dozvoliIzmenu(true);
}

private void btnObrisi_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Da li si siguran da zelis da obrises?", "Upozorenje",
MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
{
this.autoBindingSource.RemoveCurrent();
this.autoTableAdapter.Update(this.automobiliDataSet.Auto);
}
}
}
}


181

Zadatak 3.9. Prikaz podataka u DataGridView kontroli i BindingSource kontrola
Prethodni zadatak (Zadatak 3.8) reiti kreiranjem baze u MS SQL Management Studio.
Dodati DataGridView kontrolu za prikaz podataka iz baze.
Kreirati bazu podataka Vozni Park koja ima tabelu Automobili, ija je struktura prikazana
na slici 3.37. U tabelu Automobili uneti par proizvoljnih zapisa.

Slika 3.37. Tabela Automobili
Kreirati tipizirani DataSet koji sadri bazu Vozni park (VozniParkDataSet).
Kreirati WinForms aplikaciju pod nazivom DataGridView. Kreirati formu kao na slici 3.38.

Slika 3.38. Design prozor za Zadatak 3.9
182

Dodati jo 5 button kontrola (btnDodaj, btnSacuvaj, btnOdustani, btnIzmeni, btnBrisi) i
aktivirati njihove Click dogaaje.

Zahtevane funkcionalnosti aplikacije:
Prilikom startovanja aplikacije GroupBox pod nazivom Podaci o autu je nedostupan
za korienje.
Selekcijom nekog reda u DataGridView kontroli se TextBox polja u GroupBox-u
popunjavaju odgovarajuim podacima za selektovani auto.
Klikom na dugme btnDodaj GroupBox postaje dostupan za upis, dok btnDodaj,
btnIzmeni i btnBrisi postaju nedostupni za korienje. TextBox polja su prazna.
Dodaje se novi red u DataSet, ali ga ne upisuje u bazu.
Klikom na dugme btnSacuvaj auriraju se podaci u bazi. GroupBox postaje
nedostupan za upis, dok btnDodaj, btnIzmeni i btnBrisi postaju dostupni za
korienje.
Klikom na dugme btnOdustani GroupBox postaje nedostupan za upis, dok btnDodaj,
btnIzmeni i btnBrisi postaju dostupni za korienje.
Klikom na dugme btnIzmeni GroupBox postaje dostupan za upis, dok btnDodaj,
btnIzmeni i btnBrisi postaju nedostupni za korienje.
Klikom na dugme btnBrisi prikazuje se odgovarajui MessageBox u kome se od
korisnika zahteva potvrda brisanja. Ukoliko korisnik potvrdi brisanje izbrisati
selektovani auto iz baze.
Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DataGridView
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
// TODO: This line of code loads data into the 'vozniParkDataSet.Automobili'
// table.
// You can move, or remove it, as needed.
this.automobiliTableAdapter.Fill(this.vozniParkDataSet.Automobili);

183

dozvoliIzmenu(false);
}

private void dozvoliIzmenu(bool dozvoli)
{
groupBox1.Enabled = dozvoli;

btnDodaj.Enabled = !dozvoli;
btnIzmeni.Enabled = !dozvoli;
btnBrisi.Enabled = !dozvoli;
}

private void btnSacuvaj_Click(object sender, EventArgs e)
{
dozvoliIzmenu(false);
automobiliBindingSource.EndEdit();
automobiliTableAdapter.Update(vozniParkDataSet.Automobili);
}

private void btnDodaj_Click(object sender, EventArgs e)
{
dozvoliIzmenu(true);
automobiliBindingSource.AddNew();
}

private void btnOdustani_Click(object sender, EventArgs e)
{
dozvoliIzmenu(false);
automobiliBindingSource.CancelEdit();
}

private void btnIzmeni_Click(object sender, EventArgs e)
{
dozvoliIzmenu(true);
}

private void btnBrisi_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Da li ste sigurni da zelite da obrisete podatke o
izabranom autu", "Poruka", MessageBoxButtons.OKCancel)
== DialogResult.OK)
{
automobiliBindingSource.RemoveCurrent();
automobiliTableAdapter.Update(vozniParkDataSet.Automobili);
}
}
}
}


184

Zadatak 3.10. Prikaz podataka u DataGridView kontroli (preko koda)
Kreirati bazu podataka Prijemni koja ima dve povezane tabele, ija je struktura prikazana
na slici 3.4 (Zadatak 3.1). Tabelu StudijskiProgrami popuniti podacima sa slike 3.39.

Slika 3.39. Zapisi u tabeli StudijskiProgrami Slika 3.40. Design prozor za Zadatak 3.10
Kreirati WinForms aplikaciju pod nazivom Prikaz u DataGridView. Kreirati formu kao na
slici 3.40 i podesiti kontrole kao to je prikazano u tabeli 3.10.
Tabela 3.10. Svojstva i dogaaji kontrola za Zadatak 3.10
Kontrola/Svojstva Name Text Dodatna svojstva i dogaaji
Form Form1 Prikaz podataka Dogaaj Load
Label label1
Spisak studijskih
programa:

Label label2 UnesiID
TextBox tbID
DataGridView dataGridView1
Button btnPrvi Prikazi prvi red Dogaaj Click
Button btnNadji Nadji Dogaaj Click
Button btnFilter
Prikazi studijske
programe sa ID<3
Dogaaj Click
RichTextBox richTextBox1

Zahtevane funkcionalnosti aplikacije:
Prilikom startovanja aplikacije popuniti DataGridView sa podacima iz tabele
Studijski programi.
185

Klikom na dugme btnPrvi u richTextBox1 kontroli prikazati prvi zapis iz tabele
Studijski programi.
Klikom na dugme btnNadji u richTextBox1 kontroli prikazati podatke za studijski
program iji ID je korisnik uneo u TextBox kontrolu (tbID). Proveriti da li je korisnik
uneo int vrednost u tbID i ako nije obavestiti ga o tome. Ukoliko korisnik unese
nepostojei ID obavestiti ga odgovarajuim MessageBox-om.
Klikom na dugme btnFilter u richTextBox1 kontroli prikazati sve studijske programe
iji je ID<3.
Reenje:
// Konekcija.cs
class Konekcija
{
public static string konString = Properties.Settings.Default.PrijemniConnectionString;
}
// Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient; // dodato zbog rada sa bazom

namespace Prikaz_u_DataGridView
{
public partial class Form1 : Form
{
SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM StudijskiProgrami",
Konekcija.konString);
DataSet ds = new DataSet();

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
// da treba iz baze podataka da preuzme kljueve
da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
da.Fill(ds, "StudijskiProgrami");
DataTable dt = ds.Tables["StudijskiProgrami"];
dataGridView1.DataSource = dt;
}

private void btnPrvi_Click(object sender, EventArgs e)
{
// pristup DataTable objektu u okviru DataSet-a
DataTable tbl = ds.Tables["StudijskiProgrami"];

// procitaj prvu vrstu
DataRow vrsta = tbl.Rows[0];

186

StringBuilder sb = new StringBuilder();
foreach (DataColumn kolona in tbl.Columns)
{
sb.Append(kolona.ColumnName + ":\t" + vrsta[kolona].ToString());
sb.Append("\n");
}

richTextBox1.Text = sb.ToString();
}

private void btnNadji_Click(object sender, EventArgs e)
{
int idVrste;
if (!Int32.TryParse(tbID.Text, out idVrste))
{
MessageBox.Show("Morate uneti ceo broj", "Greska");
return;
}

// pristup DataTable objektu u okviru DataSet-a
DataTable tabela = ds.Tables["StudijskiProgrami"];

DataRow vrsta = tabela.Rows.Find(idVrste);

if (vrsta == null)
{
MessageBox.Show("Ne postoji red u tabeli za zadati ID", "Obavestenje");
tbID.Clear();
return;
}

StringBuilder sb = new StringBuilder();

foreach (DataColumn kolona in tabela.Columns)
{
sb.Append(kolona.ColumnName + ": " + vrsta[kolona].ToString() + "\n");
}

richTextBox1.Text = sb.ToString();
}

private void btnFilter_Click(object sender, EventArgs e)
{
DataTable tabela = ds.Tables["StudijskiProgrami"];

DataRow[] StudProgVrsta = tabela.Select("StudijskiProgramID < 3");

StringBuilder sb = new StringBuilder();

foreach (DataRow vrsta in StudProgVrsta)
{
foreach (DataColumn kolona in tabela.Columns)
{
sb.Append(kolona.ColumnName + ": " + vrsta[kolona].ToString() +
"\n");
}
}

richTextBox1.Text = sb.ToString();
}
}
}

187

Zadatak 3.11. Prikaz podataka iz baze u ListView kontroli
Kreirati WinForms aplikaciju pod nazivom ListViewIzBaze.
Kreirati bazu podataka Prijemni koja ima dve povezane tabele, ija je struktura prikazana
na slici 3.4 (Zadatak 3.1). Kreirati tipizirani DataSet pod nazivom PrijemniDataSet kao na
slici 3.41, tako to se doda novi Data Source (padajua lista Project/Add New Data Source).

Slika 3.41. PrijemniDataSet Slika 3.42. ToolBox
Iskompajlirati projekat i primetiti da su u Toolbox-u dodate nove kontrole (videti sliku
3.42).
Na formu dodati jednu ListView kontrolu i jedan button, kao i PrijemniDataSet i
KandidatiTableAdapter (videti sliku 3.43). Za ListView setovati svojstva View=Details i
MultiSelect=False.

Slika 3.43. Design prozor za Zadatak 3.11
188

Zahtevane funkcionalnosti aplikacije:
Prilikom klika na dugme prikazati podatke iz DataSet-a u ListView kontroli.
Prilikom selektovanja nekog kandidata u MessageBox-u prikazati njegove podatke.
Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ListViewIzBaze
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
kandidatiTableAdapter1.Fill(prijemniDataSet1.Kandidati);
}

private void button1_Click(object sender, EventArgs e)
{
listView1.Items.Clear();

listView1.Columns.Add("Broj prijave", 60, HorizontalAlignment.Left);
listView1.Columns.Add("Prezime i ime", 100, HorizontalAlignment.Center);

foreach (PrijemniDataSet.KandidatiRow vrsta in
prijemniDataSet1.Kandidati.Rows)
{
ListViewItem listItem = new ListViewItem(vrsta.BrojPrijave.ToString());
listItem.SubItems.Add(vrsta.PrezimeIme.ToString());
listView1.Items.Add(listItem);
}
}

private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
if (listView1.SelectedItems.Count > 0)
{
ListViewItem sel = listView1.SelectedItems[0];

string brojPrijave = sel.SubItems[0].Text;
string PrezimeIme = sel.SubItems[1].Text;

MessageBox.Show("Selektovali ste kandidata: " + brojPrijave + " " +
PrezimeIme);
}
}
}
}
189

Zadatak 3.12. ListView, ComboBox i DataSet kontrole (select, update, insert, delate)
Kreirati WinForms aplikaciju pod nazivom ListViewSlozeniIzBaze.
Kreirati bazu podataka Prijemni koja ima dve povezane tabele, ija je struktura prikazana
na slici 3.4 (Zadatak 3.1). Kreirati tipizirani DataSet pod nazivom PrijemniDataSet koji
sadri prikaz svih podataka iz tabele Kandidati i tabele StudijskiProgrami baze Prijemni.
Iskompajlirati projekat i primetiti da su u Toolbox-u dodate nove kontrole (sline kao i na i
slici 3.42 iz prethodnog zadatka).
Kreirati formu kao na slici 3.44. Kontrolu ListView setovati na svojstva View=Details i
MultiSelect=False. Definisati etiri kolone kao to se i vidi na slici. Dodati po jednu kontrolu
PrijemniDataSet, KandidatiTableAdapter i StudijskiProgramiTableAdapter.
Ostale kontrole podesiti kao to je prikazano u tabeli 3.11.

Slika 3.44. Design forme za Zadatak 3.12
Tabela 3.11. Svojstva i dogaaji kontrola za Zadatak 3.12
Kontrola/Svojstva Name Text Dodatna svojstva i dogaaji
Form
Form1
Manipulacija
podacima iz baze
Dogaaj Load
GroupBox groupBox1 Podaci o kandidatu
Label label1 Broj prijave:
Label label2 Prezime i ime:
Label label3 Broj poena:
Label label4 Studijski program:
TextBox tbBrPrijave
TextBox tbIme
190

TextBox tbBrojPoena
ComboBox cbSmer
Button btnUbaci Novi kandidat Dogaaj Click
Button btnIzmeni Izmeni podatke Dogaaj Click
Button btnBrisi Brisi Dogaaj Click
Button btnResetuj Resetuj Dogaaj Click

Zahtevane funkcionalnosti aplikacije:
Prilikom startovanja aplikacije ComboBox napuniti podacima iz tabele Studijski
programi (prikazati naziv, a pamtiti ID), a u ListView kontroli prikazati sve kandidate.
Prilikom klika na dugme btnUbaci insertovati novog kandidata u bazu na osnovu
popunjenih TextBox polja i izabranog studijskog programa. Aurirati i ListView.
Prilikom klika na dugme btnIzmeni izmeniti podatke o selektovanom kandidatu u bazi
na osnovu popunjenih TextBox polja i izabranog studijskog programa. Aurirati i
ListView. Obavestiti korisnika putem MessageBox-a.
Prilikom klika na dugme btnBrisi obrisati selektovanog kandidata iz baze. Aurirati i
ListView. Od korisnika putem MessageBox-a zahtevati potvrdu brisanja.
Prilikom klika na dugme btnResetuj isprazniti TextBox polja, a u ComboBox-u
selektovani tekst je prazan.

Reenje:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ListViewSlozeniIzBaze
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)
{
kandidatiTableAdapter1.Fill(prijemniDataSet1.Kandidati);
studijskiProgramiTableAdapter1.Fill(prijemniDataSet1.StudijskiProgrami);

puniSmer();
puniKandidate();
}

191

private void puniSmer()
{
cbSmer.DataSource = prijemniDataSet1.StudijskiProgrami;
cbSmer.DisplayMember = "Naziv";
cbSmer.ValueMember = "StudijskiProgramID";
}

private void puniKandidate()
{
listView1.Items.Clear();

// primena tipiziranog DataSet-a
foreach (PrijemniDataSet.KandidatiRow vrsta in
prijemniDataSet1.Kandidati.Rows)
{
// kreiranje item-a
ListViewItem item = new ListViewItem(vrsta.BrojPrijave.ToString());

// kreiranje subitem-a
item.SubItems.Add(vrsta.PrezimeIme);
item.SubItems.Add(vrsta.BrojPoena.ToString());
item.SubItems.Add(vrsta.StudijskiProgram.ToString());

// pamti se BrojPrijave u Tag svojstvu
// jer ce trebati prilikom provere koji kandidat je selektovan u ListView
item.Tag = vrsta.BrojPrijave;

// dodavanje kreiranog item-a u ListView
listView1.Items.Add(item);
}

}

private void btnUbaci_Click(object sender, EventArgs e)
{
// Provera da li je korisnik popunio sva TextBox polja
if (String.IsNullOrEmpty(tbBrPrijave.Text.Trim()) ||
String.IsNullOrEmpty(tbIme.Text.Trim()) ||
String.IsNullOrEmpty(tbPoeni.Text.Trim()))
{
MessageBox.Show("Sva polja su obavezna", "Obavestenje",
MessageBoxButtons.OK);
return;
}

// kreiranje novog reda primenom automatski generisane metode NewKandidatiRow
PrijemniDataSet.KandidatiRow noviRed =
prijemniDataSet1.Kandidati.NewKandidatiRow();
// upisivanje podataka iz polja u novi red
// koji ima identicne kolone kao i tabela u bazi
noviRed.BrojPrijave = int.Parse(tbBrPrijave.Text);
noviRed.PrezimeIme = tbIme.Text;
noviRed.BrojPoena = Convert.ToDouble(tbPoeni.Text);
noviRed.StudijskiProgram = Convert.ToInt32(cbSmer.SelectedValue);

// dodavanje novog reda u tabelu Kandidati u DataSet-u
// primenom automatski generisane metode AddKandidatiRow
prijemniDataSet1.Kandidati.AddKandidatiRow(noviRed);

try
{
// snimanje izmene u bazu
kandidatiTableAdapter1.Update(prijemniDataSet1);
}
192

catch (Exception ex)
{
MessageBox.Show(ex.Message, "Greka prilikom insertovanja novog
kandidata");
}

// kako bi se prikazao novi kandidat u ListView
puniKandidate();
}

private void btnIzmeni_Click(object sender, EventArgs e)
{
// Provera da li je korisnik popunio sva TextBox polja
if (String.IsNullOrEmpty(tbBrPrijave.Text.Trim()) ||
String.IsNullOrEmpty(tbIme.Text.Trim()) ||
String.IsNullOrEmpty(tbPoeni.Text.Trim()))
{
MessageBox.Show("Sva polja su obavezna", "Obavestenje",
MessageBoxButtons.OK);
return;
}

//Provera da li je korisnik selektovao nekog kandidata u ListView kontroli
if (listView1.SelectedItems.Count > 0)
{
// cita se primarni kljuc selektovanog kanidata u ListView
int bojPrijave = (int)listView1.SelectedItems[0].Tag;

// pronalazi se selektovani red po primarnom kljucu
// koji je zapamcen u Tag svojstvu prilikom popunjavanja ListView
// koristi se automatski generisana metoda FindByBrojPrijave
PrijemniDataSet.KandidatiRow red =
prijemniDataSet1.Kandidati.FindByBrojPrijave
((int)listView1.SelectedItems[0].Tag);

// popunjavaju se podaci za selektovanog kandidata iz polja na formi
red.BrojPrijave = int.Parse(tbBrPrijave.Text);
red.PrezimeIme = tbIme.Text;
red.BrojPoena = Convert.ToDouble(tbPoeni.Text);
red.StudijskiProgram = Convert.ToInt32(cbSmer.SelectedValue);

try
{
// snimanje izmene u bazu
kandidatiTableAdapter1.Update(prijemniDataSet1);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Greka prilikom azuriranja podataka");
}

// kako bi se prikazali azurirani podaci o kandidatu u ListView
puniKandidate();
}
else
{
MessageBox.Show("Selektujte kandidata za koga menjate podatke",
"Obavetenje", MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
}



193

private void btnBrisi_Click(object sender, EventArgs e)
{
//Provera da li je korisnik selektovao nekog kandidata u ListView kontroli
if (listView1.SelectedItems.Count > 0)
{
if (MessageBox.Show("Da li ste sigurni da zelite da brisete selektovanog
kandidata?", "Brisanje", MessageBoxButtons.YesNoCancel,
MessageBoxIcon.Warning) == DialogResult.Yes)
{
// cita se primarni kljuc selektovanog kanidata u ListView
int bojPrijave = (int)listView1.SelectedItems[0].Tag;

// pronalazi se selektovani red po primarnom kljucu
// koji je zapamcen u Tag svojstvu
// prilikom popunjavanja ListView
// koristi se automatski generisana metoda FindByBrojPrijave
PrijemniDataSet.KandidatiRow red =
prijemniDataSet1.Kandidati.FindByBrojPrijave
((int)listView1.SelectedItems[0].Tag);

try
{
// brisanje iz DataSet-a
red.Delete();

// brisanje iz baze
kandidatiTableAdapter1.Update(prijemniDataSet1);
}

catch (Exception ex)
{
MessageBox.Show(ex.Message, "Greka prilikom brisanja");
}

// kako bi se prikazali azurirani podaci o kandidatu u ListView
// odnosno, kako bi se izbacio izbrisani kandidat iz ListView
puniKandidate();

// resetuju se sva TextBox polja i ComboBox
resetuj();
}
}
else
{
MessageBox.Show("Selektujte kandidata koga brisete", "Obavetenje",
MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
}
}

private void resetuj()
{
tbBrPrijave.Clear();
tbIme.Clear();
tbPoeni.Clear();
cbSmer.SelectedIndex = -1;
}

private void btnResetuj_Click(object sender, EventArgs e)
{
resetuj();
}



194

private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
if (listView1.SelectedItems.Count > 0)
{
// pronalazi se selektovani red po primarnom kljucu
// koji je zapamcen u Tag svojstvu
// prilikom popunjavanja ListView
// koristi se automatski generisana metoda FindByBrojPrijave
PrijemniDataSet.KandidatiRow red =
prijemniDataSet1.Kandidati.FindByBrojPrijave
((int)listView1.SelectedItems[0].Tag);

// popunjavaju se polja na formi podacima za selektovanog kandidata
tbBrPrijave.Text = red.BrojPrijave.ToString();
tbIme.Text = red.PrezimeIme;
tbPoeni.Text = red.BrojPoena.ToString();
cbSmer.SelectedValue = red.StudijskiProgram;
}
}
}
}


195

Zadatak 3.13. ADO.NET wizard
Kreirati WinForms aplikaciju pod nazivom ADOWizard.
Kreirati bazu podataka Prijemni koja ima dve povezane tabele, ija je struktura prikazana
na slici 3.4 (Zadatak 3.1). Kreirati tipizirani DataSet pod nazivom PrijemniDataSet koji
sadri prikaz svih podataka iz tabele Kandidati i tabele StudijskiProgrami baze Prijemni.
Na formu frmSmer iz DataSource prozora (ako se ne vidi padajua lista View/Other
Windows/Data Sources) prevui tabelu StudijskiProgrami.
Dodati jo jednu formu frmKandidati na koju treba prevui tabelu Kandidati iz DataSource
prozora. Dodati jo dve Label kontrole i jedan TextBox (tbUkupno), kao na slici 3.45.

Slika 3.45. Design forme za Zadatak 3.13
Zahtevane funkcionalnosti aplikacije:
Prilikom startovanja aplikacije prikazuje se forma frmSmer koja prikazuje sve
studijske programe. Selekcijom nekog studijskog programa otvara se forma
frmKandidat koja prikazuje naziv izabranog studijskog programa, sve kandidate
prijavljene na taj studijski program (videti sliku 3.46), kao i ukupan broj kandidata
na njemu.
Na frmKandidati polja kolone StudijskiProgram prikazati kao ComboBox.

196


Slika 3.46. Izlazni prozor frmKandidat
Pomo: Na frmKandidati u DataGridView Tasks meniju (slika 3.47) izabrati opciju
EditColumns i za kolonu Studijski programi podesiti svojstva kao na slici 3.48.

Slika 3.47. DataGridView Task meni

Slika 3.48. Podeavanje kolone kao ComboBox
197

Kako bi se prikazali kandidati za izabrani studijski program potrebno je kreeirati
parametarski upit za tabelu Kandidati. Postupak je sledei. U PrijemniDatSet-u desni klik na
tabelu Kandidati izabrati opciju Add/Query, pa Use SQL statements, potom SELECT
which returns rows. Upit se moe direktno kucati ili koristiti Query Builder:
SELECT BrojPrijave, PrezimeIme, BrojPoena, StudijskiProgram
FROM dbo.Kandidati
WHERE StudijskiProgram=@smer

Upit zapamtiti pod nazivom FillBySmer, kao na slici 3.49.

Slika 3.49. Definisanje TableAdapter Query
Da bi se zapamtio ID selektovanog studijskog programa i njegov naziv, a koji e nam
trebati i na formi frmKandidati potrebno je definisati dva javna svojstva (property sa get i
set metodama). U ovom zadatku je to uraeno na samoj formi frmKandidati, to se vidi u
reenju koje sledi.

198

Reenje:
// frmSmer.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ADOWizard
{
public partial class frmSmer : Form
{
public frmSmer()
{
InitializeComponent();
}

private void frmSmer_Load(object sender, EventArgs e)
{
// TODO: This line of code loads data into the
// 'prijemniDataSet.StudijskiProgrami' table.
// You can move, or remove it, as needed.
this.studijskiProgramiTableAdapter.Fill(this.prijemniDataSet.StudijskiProgrami);
}

// automatski generisan dogadjaj
private void studijskiProgramiBindingNavigatorSaveItem_Click(object sender,
EventArgs e)
{
this.Validate();
this.studijskiProgramiBindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.prijemniDataSet);
}

private void studijskiProgramiDataGridView_SelectionChanged(object sender,
EventArgs e)
{
if (studijskiProgramiDataGridView.SelectedRows.Count != 0)
{
frmKandidati frm = new frmKandidati();

frm.BrPrijave =
Convert.ToInt32(studijskiProgramiDataGridView.SelectedRows[0].Cells[0].Value);

frm.Smer =
studijskiProgramiDataGridView.SelectedRows[0].Cells[1].Value.ToString();

frm.ShowDialog();
frm.Dispose();
}
}
}
}





199

// frmKandidati.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ADOWizard
{
public partial class frmKandidati : Form
{
public int BrPrijave { get; set; }
public string Smer { get; set; }

public frmKandidati()
{
InitializeComponent();
}

// automatski generisan dogadjaj
private void kandidatiBindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
this.Validate();
this.kandidatiBindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.prijemniDataSet);
}

private void frmKandidati_Load(object sender, EventArgs e)
{
// ovo je automatski dodato kada se za studijski program u DataGridView
// izabere ComboBox koji smo povezali na tabelu StudijskiProgrami
this.studijskiProgramiTableAdapter.Fill(this.prijemniDataSet.StudijskiProgrami);

// automatski dodata linija koda kada se prevuce tabela Kandidati iz
// DataSource na formu
this.kandidatiTableAdapter.FillBySmer(this.prijemniDataSet.Kandidati,
BrPrijave);

// ispis naziva studijskog programa preko svojstva Smer
label1.Text = "Studijski program: " + Smer;

// ukupan broj kandidata se moze dobiti prebrojavanjem redova u DataGridView
// -1 jer se u RowCount racuna i zaglavlje
tbUkupno.Text = (kandidatiDataGridView.RowCount - 1).ToString();
}
}
}


200

Zadatak 3.14. Sloeni zadatak (manipulacija sa podacima iz baze)
Kreirati WinForms aplikaciju pod nazivom Slozeni zadatak.
Kreirati bazu Studenti, koja sadri jednu tabelu Predmeti (PredmetID, Naziv, Profesor).
Uneti par proizvoljnih zapisa.
Napraviti formu pod nazivom frmPredmet kao na slici 3.50 i podesiti kontrole kao to je
prikazano u tabeli 3.12.

Slika 3.50. Forma frmPredmet za Zadatak 3.14
Tabela 3.12. Svojstva i dogaaji kontrola za Zadatak 3.14
Kontrola/Svojstva Name Text Dodatna svojstva i dogaaji
MenuStrip menuStrip1
ContextMenuStrip contextMenuStrip1
DataGridView dataGridView1
GroupBox groupBox1
Unos novog
predmeta

Label label1 PredmetID
Label label2 Naziv
Label label3 Profesor
TextBox tbPredmetID
TextBox tbNaziv
TextBox tbProfesor
GroupBox groupBox2 Prikazi po profesoru
Label label3 Profesor
Label label4 Predmeti:
ComboBox cbProfesori
RichTextBox rtbPredmeti
Button btnIzmeni Izmeni Dogaaj Click
Button btnUnos Unesi predmet Dogaaj Click

201

MenuStrip sadri dva menija:
Unos koji sadri dva podemenija: Novi predmet i Zatvori
Pronadji
ContextMenuStrip sadri meni Brisi.
Zahtevane funkcionalnosti aplikacije:
Prilikom uitavanja forme DataGridView kontrola prikazuje sve zapise iz tabele
Predmet baze Studenti.
Implementirati da se klikom na dugme Izmeni sauvaju sve uinjene promene u
DataGridView kontroli.
Implementirati meni Unos koji sadi dva podmenija: Novi predmet i Zatvori.
o Izborom opcije Novi predmet GroupBox pod nazivom Unos novog
predmeta postaje dostupan za upis, dok Group Box pod nazivom Prikazi po
profesoru postaje ne dostupan za upis.
o Klikom na dugme Unesi predmet proverava se da li su TextBox kontrole
(PredmetID, Naziv i Profesor) popunjene.
Ako jesu u tabelu Predmet u bazi Studenti se kreira novi zapis sa
unetim parametrima i korisniku se prikazuje MessageBox sa
odgovarajuom porukom i aurira podatke u GridView kontroli.
A ako nisu korisniku se prikazuje MessageBox sa odgovarajuom
porukom (Morate popuniti sva polja).
Klikom na dugme Zatvori zatvara se aplikacija.
Implementirati meni Pronadji, koji GroupBox pod nazivom Prikazi po profesoru
postaje dostupan, a GroupBox pod nazivom Unos novog predmeta postaje
nedostupan za upis.
o U ComboBox-u se prikazuju svi razliiti profesori (DISTINCT).
o Izborom nekog od njih prikazuje se lista predmeta koju izabrani profesor dri.
Implementirati konteksni meni Brisi koji iz baze brie selektovani red u GridView
kontroli i korisniku se prikazuje MessageBox sa odgovarajuom porukom.


202

Reenje:
// Konekcija.cs
class Konekcija
{
public static string konString = Properties.Settings.Default.PrijemniConnectionString;
}
// frmPredmet.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient; // dodato zbog rada sa bazom

namespace Slozeni_zadatak
{
public partial class frmPredmet : Form
{
SqlConnection kon = new SqlConnection(KonekcijaStudenti.konString);

public frmPredmet()
{
InitializeComponent();
}

private void zatvoriToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}

private void frmPredmet_Load(object sender, EventArgs e)
{
this.predmetTableAdapter.Fill(this.studentiDataSet.Predmet);
}

private void brisiToolStripMenuItem_Click(object sender, EventArgs e)
{
// brisanje selektovanog reda
// prvo se proverava da li postoji selektovani red
if (dataGridView1.SelectedRows.Count > 0)
{
// pamti se index selektovanog reda
int selectedIndex = dataGridView1.SelectedRows[0].Index;

// za selektovani red se citaju atributi: PredmetID, naziv i profesor
int predmetID = int.Parse(dataGridView1[0,
selectedIndex].Value.ToString());
string naziv = dataGridView1[1, selectedIndex].Value.ToString();
string profesor = dataGridView1[2, selectedIndex].Value.ToString();

try
{
// brisanje selektovanog reda iz baze
// otvaranje i zatvaranje konekcije nije neophodno
// jer se prilikom kreiranja objekta SqlDataAdapter-a automatski
// otvara i zatvara
predmetTableAdapter.Delete(predmetID,naziv,profesor);

203

// brisanje selektovanog reda iz dataGridView
dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[0].Index);

MessageBox.Show("Brisanje je uspesno obavljeno");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}

private void noviToolStripMenuItem1_Click(object sender, EventArgs e)
{
groupBox1.Enabled = true;
groupBox2.Enabled = false;
}

private void btnUnos_Click(object sender, EventArgs e)
{
if (tbPredmetID.Text != "" && tbNaziv.Text != "" && tbProfesor.Text != "")
{
try
{
// ubacivanje promene u bazu
// otvaranje i zatvaranje konekcije nije neophodno
// jer se prilikom kreiranja objekta SqlDataAdapter-a automatski
// otvara i zatvara
predmetTableAdapter.Insert(Convert.ToInt32(tbPredmetID.Text),
tbNaziv.Text, tbProfesor.Text);

MessageBox.Show("Unos novog predmeta je uspesno obavljen.");

// ubacivanje promene u DataGridView
// otvaranje i zatvaranje konekcije nije neophodno
// jer se prilikom kreiranja objekta SqlDataAdapter-a automatski
// otvara i zatvara
this.predmetTableAdapter.Fill(this.studentiDataSet.Predmet);

// brisanje sadrzaja iz TextBox kontrola
tbPredmetID.Clear();
tbNaziv.Clear();
tbProfesor.Clear();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
else
{
MessageBox.Show("Polja ne mogu biti prazna.");
}
}

private void pronadjiToolStripMenuItem_Click(object sender, EventArgs e)
{
groupBox1.Enabled = false;
groupBox2.Enabled = true;

try
{
// otvaranje i zatvaranje konekcije nije neophodno
// jer se prilikom kreiranja objekta SqlDataAdapter-a automatski otvara
204

SqlDataAdapter da = new SqlDataAdapter("select distinct Profesor from
Predmet", kon);

// kreiranje DataTable
DataTable dt = new DataTable();

// punjenje DataTable sa adapterom
da.Fill(dt);

// povezivanje ComboBox kontrole sa tabelom
cbProfesori.DataSource = dt;

// definisanje kolone koja ce se prikazati u ComboBox-u
cbProfesori.DisplayMember = "Profesor";
}

catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void cbProfesori_SelectedIndexChanged(object sender, EventArgs e)
{
// praznjenje sadrzaja RichTextBox-a
rtbPredmeti.Clear();

// otvaranje konekcije
kon.Open();

// kreiranje SQL parametarskog upita
using (SqlCommand command = new SqlCommand("SELECT Naziv FROM Predmet WHERE
Profesor = @Profesor", kon))
{
// definisanje parametra
command.Parameters.Add(new SqlParameter("Profesor", cbProfesori.Text));

// izvrsavanje SQL upita pomocu SqlDataReader-a
SqlDataReader reader = command.ExecuteReader();

// citanje sadrzaja SqlDataReader-a i upis u RichTextBox kontrolu
while (reader.Read())
{
rtbPredmeti.AppendText(reader.GetString(0));
rtbPredmeti.AppendText("\r\n");
}
}

// zatvaranje konekcije
kon.Close();
}

private void btnIzmeni_Click(object sender, EventArgs e)
{
DialogResult dr = MessageBox.Show("Da li zelite da sacuvate promene?",
"Poruka", MessageBoxButtons.YesNoCancel,
MessageBoxIcon.Question);
if (dr == DialogResult.Yes)
{
try
{
// ubacivanje promena u bazu
this.predmetTableAdapter.Update(studentiDataSet.Predmet);

205

// osvezavanje DataGridView
dataGridView1.Refresh();

MessageBox.Show("Izmene su sacuvane");
}
catch (Exception ex)
{
MessageBox.Show("Ne mozete promeniti sifru predmeta koji su studenti
vec polozili\n\n" + ex.Message);
}
}
}
}
}
206

IV Zadaci sa kolokvijuma i ispita
1. Zadaci sa I kolokvijuma kolske 2012/2013. godine
I grupa
A) (20 poena) Kreirati javnu klasu Gost sa privatnim atributima: prezime (string),
brClanova (od 1 do 5), obroci (string) (doruak, ruak, veera). Napraviti odgovarajue
propertije. U podrazumevanom konstruktoru postaviti polja prezime i obroci da imaju
vrednost praznog stringa, a broj lanova na 0. Napraviti parametarski konstruktor koji
kao ulazne parametre dobija prezime, broj lanova i obroke. Override-ovati metodu
ToString() tako da vraa podatke o gostu u obliku:
Porodica Maksimovic je rezervisala za 2 clan(ov)a. Obroci su: Dorucak Rucak
B) (5 poena) Napraviti formu pod nazivom frmHotel kao na slici 4.1.
(Kontrole: RichTextBox, Button)
C) (5 poena) Napraviti formu pod nazivom frmUnosGosta kao na slici 4.2.
(Kontrole su: TextBox, ComboBox, CheckBox, Button)



Slika 4.1. Foma frmHotel Slika 4.2. Forma frmUnosGosta
Izgled Solution Explorer-a nakon kreiranja klase i formi dat je na slici 4.3.

Slika 4.3. Solution Explorer
207

D) Obezbediti sledee funkcionalnosti za formu frmHotel:
1. (15 poena) Klik na dugme Unesi gosta otvara formu frmUnosGosta i ubacuje gosta
sa unetim podacima u generiku listu gostiju na poslednje mesto (List<Gost>) i
prikazuje listu u RichTextBox kontroli (Obavezno korienje klase Gost i
List<Gost> za prikaz podataka u RichTextBox-u).
Porodica Maksimovic je rezervisala za 2 clan(ov)a. Obroci su: Dorucak Rucak
Porodica Arsic je rezervisala za 5 clan(ov)a. Obroci su: Vecera
2. (12 poena) Klik na dugme Izbaci gosta izbacuje prvog gosta iz liste, prikazuje
MessageBox sa odgovarajuim obavetenjem i prikazuje auriranu listu u
RichTextBox kontroli.
3. (12 poena) Klik na dugme Exportuj u txt ubacuje listu gostiju u fajl
Spisak_gostiju.txt i prikazuje MessageBox sa odgovarajuim obavetenjem.
4. (2 poena) Klik na dugme Zatvori zatvara aplikaciju.

E) Obezbediti sledee funkcionalnosti za formu frmUnosGostiju:
1. (12 poena) Ako korisnik za broj lanova unese manje od 1 ili vie od 5 postaviti
ErrorProvider kontrolu na odgovarajue vrednosti i onemoguiti korisniku da
napusti kontrolu dok ne izabere vrednost od 1 do 5 (Obavezno korienje
dogaaja Validating).
2. (15 poena) Klik na dugme Ubaci proverava ispravnost unetih podataka (prezime
ne sme da bude prazno, a broj lanova mora biti od 1 do 5). Ako je sve OK onda
vratiti odgovarajui DialogResult ili u sluaju da korisnik nije uneo sve podatke,
obavestiti ga o tome i ekati da korisnik ispravi podatke.
3. (2 poena) Klik na dugme Odustani resetuje vrednosti kontrola na inicijalne
vrednosti i zatvara formu.

208

Reenje:
// Gost.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Prvi_kolokvijum
{
class Gost
{
private string prezime;
private int brClanova;
private string obroci;

public string Prezime
{
get { return this.prezime; }
set { this.prezime = value; }
}

public int BrClanova
{
get { return this.brClanova; }
set { this.brClanova = value; }
}

public string Obroci
{
get { return this.obroci; }
set { this.obroci = value; }
}

public Gost()
{
this.prezime = "";
this.brClanova = 0;
this.obroci = "";
}

public Gost(string pr, int clan, string ob)
{
this.prezime = pr;
this.brClanova = clan;
this.obroci = ob;
}

public override string ToString()
{
return "Porodica " + this.prezime + " je rezervisala za " + this.brClanova +
" clan(ov)a. Obroci su: " + this.obroci;
}
}
}


209

// frmHotel.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace Prvi_kolokvijum
{
public partial class frmHotel : Form
{
private Gost g;
private Stack<Gost> gosti;

public frmHotel()
{
InitializeComponent();
gosti = new Stack<Gost>();
}

private void stampaj()
{
foreach (Gost g in gosti)
{
rtbSpisak.AppendText(g.ToString());
rtbSpisak.AppendText("\n");
}
}

private void btnUnos_Click(object sender, EventArgs e)
{
frmUnosGosta frm = new frmUnosGosta();
if (frm.ShowDialog() == DialogResult.OK)
{
g = new Gost(frm.Prezime, frm.Clanovi, frm.Obroci);
gosti.Push(g);
rtbSpisak.Clear();
stampaj();
}
}

private void btnIzbaci_Click(object sender, EventArgs e)
{
if (gosti.Count == 0)
{
MessageBox.Show("Nema gostiju", "Obavestenje");
}
else
{
gosti.Pop();
MessageBox.Show("Gost je otisao", "Obavestenje");
rtbSpisak.Clear();
stampaj();
}
}

private void btnExport_Click(object sender, EventArgs e)
{
StreamWriter sw = new StreamWriter("Spisak_gostiju.txt");
sw.WriteLine("Spisak gostiju");
210

foreach (Gost g in gosti)
{
sw.WriteLine(g.ToString());
}
sw.Close();
MessageBox.Show("Fajl Spisak_gostiju.txt je uspeno snimljen", "Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}

private void btnZatvori_Click(object sender, EventArgs e)
{
this.Close();
}
}
}
// frmUnosGosta.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Prvi_kolokvijum
{
public partial class frmUnosGosta : Form
{
public string Prezime { get{return this.tbPrezime.Text;} }
public int Clanovi { get { return Convert.ToInt32(this.cbBrClanova.Text); } }
public string Obroci { get { return vratiObrok(); } }

public frmUnosGosta()
{
InitializeComponent();
}

private string vratiObrok()
{
string obroci = "";

if (cbDorucak.Checked) obroci += "Dorucak";
if (cbRucak.Checked) obroci += " Rucak";
if (cbVecera.Checked) obroci += " Vecera";
if (!cbDorucak.Checked && !cbRucak.Checked && !cbVecera.Checked)obroci = "-";

return obroci;
}

private void btnPotvrdi_Click(object sender, EventArgs e)
{
if (tbPrezime.Text == "" || Convert.ToInt32(cbBrClanova.Text) < 1 ||
Convert.ToInt32(cbBrClanova.Text) > 5)
{
MessageBox.Show("Uneti podaci nisu ispravni", "Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
this.DialogResult = DialogResult.OK;
}
}
211


private void btnOtkazi_Click(object sender, EventArgs e)
{
this.Close();
}

private void cbBrClanova_Validating(object sender, CancelEventArgs e)
{
if (Convert.ToInt32(cbBrClanova.Text) < 1 ||
Convert.ToInt32(cbBrClanova.Text) > 5)
{
errGreska.SetError(cbBrClanova, "Broj clanova mora biti od 1 do 5");
cbBrClanova.Focus();
}
else
errGreska.Clear();
}
}
}
212

II grupa
A) (20 poena) Kreirati javnu klasu Oglas sa privatnim atributima: radnoMesto (string), staz
(int), strucnaSprema (string). Napraviti odgovarajue propertije. U podrazumevanom
konstruktoru postaviti polja radno mesto i struna sprema da imaju vrednost praznog
stringa, a sta na 0. Napraviti parametarski konstruktor koji kao ulazne parametre
dobija naziv radnog mesta, duinu staa i strunu spremu. Override-ovati metodu
ToString() tako da vraa podatke o oglasu u obliku:
Radno mesto: Komercijalista Minimalno iskustvo: 3 god. Strucna sprema: Visa
B) (5 poena) Napraviti formu pod nazivom frmKonkursi kao na slici 4.4.
(Kontrole: ListBox, Button)
C) (5 poena) Napraviti formu pod nazivom frmUnosOglasa kao na slici 4.5.
(Kontrole: TextBox, RadioButton, NumericUpDown, Button)


Slika 4.4. Forma frmKonkursi Slika 4.5. Forma frmUnosOglasa
Izgled Solution Explorer-a nakon kreiranja klase i formi dat je na slici 4.6.

Slika 4.6. Solution Explorer
D) Obezbediti sledee funkcionalnosti za formu frmKonkursi:
1. (15 poena) Klik na dugme Novi oglas otvara formu frmUnosOglasa i ubacuje oglas
sa unetim podacima u ArrayList kolekciju (neophodno je ukljuiti
213

System.Collection namespace) i prikazuje listu u ListBox kontroli (Obavezno
korienje klase Oglas i ArrayList za prikaz podataka u ListBox-u).
Radno mesto: Komercijalista Minimalno iskustvo: 3 god. Strucna sprema: Visa
Radno mesto: Direktora Minimalno iskustvo: 10 god. Strucna sprema: Visoka
2. (12 poena) Klik na dugme Izbrisi oglas izbacuje oglas iz ArrayList kolekcije,
prikazuje MessageBox sa odgovarajuim obavetenjem i prikazuje auriranu listu
u ListBox kontroli.
3. (12 poena) Klik na dugme Eksportuj u txt ubacuje listu oglasa u fajl
VazeciOglasi.txt i prikazuje MessageBox sa odgovarajuim obavetenjem.
4. (2 poena) Klik na dugme Zatvori zatvara aplikaciju.

E) Obezbediti sledee funkcionalnosti za formu frmUnosOglasa:
1. (12 poena) Ako korisnik za godine staa unese vrednost veu od 40 postaviti
ErrorProvider kontrolu na odgovarajue vrednosti i onemoguiti korisniku da
napusti kontrolu dok ne unese vrednost manju od 40 (Obavezno korienje
dogaaja Validating).
2. (15 poena) Klik na dugme Potvrdi proverava ispravnost unetih podataka (radno
mesto ne sme da bude prazno, a sta mora biti manji od 40). Ako je sve OK onda
vratiti odgovarajui DialogResult ili u sluaju da korisnik nije uneo sve podatke,
obavestiti ga o tome i ekati da korisnik ispravi podatke.
3. (2 poena) Klik na dugme Otkazi resetuje vrednosti kontrola na inicijalne vrednosti
i zatvara formu.


Reenje:
// Oglas.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Prvi_kolkvijum
{
class Oglas
{
private string radnoMesto;
private int staz;
private string strucnaSprema;

public string RadnoMesto
{
get
{ return this.radnoMesto; }
set
{ this.radnoMesto = value; }
}
214


public int Staz
{
get
{ return this.staz; }
set
{ this.staz = value; }
}

public string StrucnaSprema
{
get
{ return this.strucnaSprema; }
set
{ this.strucnaSprema = value; }
}

public Oglas()
{
this.radnoMesto = "";
this.strucnaSprema = "";
this.staz = 0;
}

public Oglas(string r, int s, string ss)
{
this.radnoMesto = r;
this.staz = s;
this.strucnaSprema = ss;
}

public override string ToString()
{
return "Radno mesto: " + this.radnoMesto + " - Minimalno iskustvo: " +
this.staz + " - Strucna sprema: " + this.strucnaSprema;
}
}

// frmKonkursi.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Collections;
using System.IO;

namespace Prvi_kolokvijum
{
public partial class frmKonkursi : Form
{
public ArrayList Oglasi;
private Oglas o;

public frmKonkursi()
{
InitializeComponent();
Oglasi = new ArrayList();
}
215


public void Punilistu()
{
foreach (Oglas o in Oglasi)
{
lbOglasi.Items.Add(o);
}
}

private void btnNovi_Click(object sender, EventArgs e)
{
frmUnosOglasa frmk = new frmUnosOglasa();
{
if (DialogResult.OK == frmk.ShowDialog())
{
o = new Oglas(frmk.Radno, frmk.Staz, frmk.Sprema);
Oglasi.Add(o);
lbOglasi.Items.Clear();
Punilistu();
}
}

}

private void btnZatvori_Click(object sender, EventArgs e)
{
this.Close();
}

private void btnIzbrisi_Click(object sender, EventArgs e)
{
Oglasi.Remove(o);
lbOglasi.Items.Clear();
MessageBox.Show("Poslednji oglas je obrisan", "Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Information);
Punilistu();
}

private void btnEksport_Click(object sender, EventArgs e)
{
StreamWriter sw = new StreamWriter("VazeciOglasi.txt");
foreach (Oglas o in Oglasi)
{
sw.WriteLine(o);
}

MessageBox.Show("Podaci su snimljeni", "Obavestenje", MessageBoxButtons.OK,
MessageBoxIcon.Information);
sw.Close();
}
}
}



216

// frmUnosOglasa.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Prvi_kolokvijum
{
public partial class frmUnosOglasa : Form
{
public string Radno
{
get
{ return tbRad.Text; }
}

public int Staz
{
get
{ return Convert.ToInt32(nudGodStaza.Value); }
}

public string Sprema
{
get
{ return Vratispremu(); }
}

public string Vratispremu()
{
string strucnaSprema = "";

if (rbNiza.Checked == true)
{ strucnaSprema = "Niza"; }

if (rbVisa.Checked == true)
{ strucnaSprema = "Visa"; }

if (rbVisoka.Checked == true)
{ strucnaSprema = "Visoka"; }

return strucnaSprema;
}

public frmUnosOglasa()
{
InitializeComponent();
}

private void btnPotvrdi_Click(object sender, EventArgs e)
{
if (tbRad.Text != "" && nudGodStaza.Value <= 40)
{
DialogResult = DialogResult.OK;
}
else
{ MessageBox.Show("Podaci nisu uneti pravilno", "Obavestenje"); }
}

217

private void btnZatvori_Click(object sender, EventArgs e)
{
tbRad.Text = "";
nudGodStaza.Value = 0;
rbNiza.Checked = true;
this.Close();
}

private void nudGodStaza_Validating(object sender, CancelEventArgs e)
{
if (nudGodStaza.Value > 40)
{
errGreska.SetError(nudGodStaza, "Pravilno unesite godine staza");
nudGodStaza.Focus();
}
else
{
errGreska.Clear();
}
}
}
}

218

III grupa
A) (20 poena) Kreirati javnu klasu Rezervacija sa privatnim atributima: naziv (string),
smestaj (privatni, hotelski, kamp), brOsoba (int). Napraviti odgovarajue propertije. U
podrazumevanom konstruktoru postaviti polje naziv grada i tip smetaja na vrednost
praznog stringa, a broj osoba na 1. Napraviti parametarski konstruktor koji kao ulazne
parametre dobija naziv grada, tip smetaja i broj osoba. Override-ovati metodu
ToString() tako da vraa podatke o rezervaciji u obliku:
Izvrsili ste hotelski smestaj za 3 osobe u gradu Budva.
B) (5 poena) Napraviti formu pod nazivom frmLetovanje kao na slici 4.7.
(Kontrole: ListBox, Button)
C) (5 poena) Napraviti formu pod nazivom frmUnosGrada kao na slici 4.8.
(Kontrole su: TextBox, ComboBox, NumericUpDown, Button)


Slika 4.7. Forma frmLetovanje Slika 4.8. Forma frmUnosGrada
Izgled Solution Explorer-a nakon kreiranja klase i formi dat je na slici 4.9.

Slika 4.9. Solution Explorer
D) Obezbediti sledee funkcionalnosti za formu frmLetovanje:
1. (15 poena) Klik na dugme Izaberi grad otvara formu frmUnosGrada i ubacuje
destinaciju sa unetim podacima u ArrayList (neophodno je ukljuiti namespace
System.Collection) i prikazuje listu u ListBox kontroli (Obavezno korienje klase
Rezervacija i ArrayList za prikaz podataka u ListBox-u).
219

Izvrsili ste hotelski smestaj za 3 osobe u gradu Budva.
Izvrsili ste kamp smestaj za 2 osobe u gradu Bar.
2. (12 poena) Klik na dugme Izbaci grad izbacuje grad iz liste, prikazuje MessageBox
sa odgovarajuim obavetenjem i prikazuje auriranu listu u ListBox kontroli.
3. (12 poena) Klik na dugme Eksportuj u txt ubacuje listu rezervacija u fajl
Letovanje.txt i prikazuje MessageBox sa odgovarajuim obavetenjem.
4. (2 poena) Klik na dugme Zatvori zatvara aplikaciju.

E) Obezbediti sledee funkcionalnosti za formu frmUnosGrada:
1. (12 poena) Ako korisnik za broj osoba unese 0 postaviti ErrorProvider kontrolu na
odgovarajue vrednosti i onemoguiti korisniku da napusti kontrolu dok ne unese
vrednost veu od 0 (Obavezno korienje dogaaja Validating).
2. (15 poena) Klik na dugme Izaberi proverava ispravnost unetih podataka (naziv
grada i tip smetaja ne sme da bude prazan, a broj osoba mora biti vee od 0).
Ako je sve OK onda vratiti odgovarajui DialogResult ili u sluaju da korisnik nije
uneo sve podatke, obavestiti ga o tome i eka da korisnik ispravi podatke.
3. (2 poena) Klik na dugme Odustani resetuje vrednosti kontrola na inicijalne
vrednosti i zatvara formu.


Reenje:
// Rezervacija.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Prvi_kolokvijum
{
class Rezervacija
{
private string naziv;
private string smestaj;
private int brOsoba;

public string Naziv { get { return naziv; } set { naziv = value; } }
public string Smestaj { get { return smestaj; } set { smestaj=value;} }
public int BrOsoba { get{return brOsoba;} set {brOsoba=value;} }

public Rezervacija()
{
naziv = "";
smestaj = "";
brOsoba = 1;
}

public Rezervacija(string n, string sm, int brO)
{
220

naziv = n;
sm = smestaj;
brO = brOsoba;
}

public override string ToString()
{
return "Izvrsli ste " + Smestaj + " smestaj za " + BrOsoba + " osobe u gradu
" + Naziv + ".";
}
}
}

// frmLetovanje.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace Prvi_kolokvijum
{
public partial class frmLetovanje : Form
{
ArrayList arl;

public frmLetovanje()
{
InitializeComponent();
arl = new ArrayList();
}

private void prikaziListu()
{
foreach (string r in arl)
{
listBox1.Items.Add(r.ToString());
}
}

private void izGr_Click(object sender, EventArgs e)
{
frmUnosGrada ug = new frmUnosGrada();
if (DialogResult.OK == ug.ShowDialog())
{
Rezervacija rez = new Rezervacija(ug.Grad,ug.Smestaj,ug.BrojOsb);
arl.Add(rez.ToString());
listBox1.Items.Clear();
prikaziListu();
}
}


private void izbGr_Click(object sender, EventArgs e)
{
arl.RemoveAt(0);
221

listBox1.Items.Clear();
MessageBox.Show("Prva destinacija je izbrisana");
prikaziListu();
}

private void zatvori_Click(object sender, EventArgs e)
{
Close();
}

private void eksp_Click(object sender, EventArgs e)
{
StreamWriter sw = new StreamWriter("Letovanje.txt");
foreach (string s in arl)
{
sw.WriteLine(s.ToString());
}
sw.Close();
MessageBox.Show("Fajl je sacuvan");
}
}
}

// UnosGrada.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Prvi_kolokvijum
{
public partial class frmUnosGrada : Form
{
public string Grad { get {return nazGrada.Text ;} }
public string Smestaj { get {return smst.Text ;} }
public int BrojOsb { get { return Convert.ToInt32(brOsb.Value); } }

public frmUnosGrada()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
if (nazGrada.Text != "" && smst.Text != "" && brOsb.Value > 0)
{
DialogResult = DialogResult.OK;
}
else
{
MessageBox.Show("Niste ispravno popunili formular", "Obavestenje",
MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}

private void brOsb_Validating(object sender, CancelEventArgs e)
{
if (brOsb.Value == 0)
222

{
errorProvider1.SetError(brOsb,"Broj osoba mora biti veci od nule");
}
else
{
errorProvider1.Clear();
}
}

private void button2_Click(object sender, EventArgs e)
{
nazGrada.Clear();
smst.Text = "";
brOsb.Value = 1;
}
}
}



223

IV grupa
A) (20 poena) Kreirati javnu klasu Film sa privatnim atributima: naziv (string), godina
(int), zanr (string). Napraviti odgovarajue propertije. U podrazumevanom konstruktoru
postaviti polje naziv albuma i anr na vrednost praznog stringa, a godinu na 1900.
Napraviti parametarski konstruktor koji kao ulazne parametre dobija naziv, godinu i
anr. Override-ovati metodu ToString() tako da vraa podatke o filmu u obliku:
Film Troja je istorijski premjerno prikazan 2004. godine.
B) (5 poena) Napraviti formu pod nazivom frmFilmskiMaraton kao na slici 4.10.
(Kontrole: RichTextBox, Button)
C) (5 poena) Napraviti formu pod nazivom frmUnosFilma kao na slici 4.11.
(Kontrole su: TextBox, MaskedTextBox Mask je 0000, RadioButton, Button)


Slika 4.10. Forma frmFilmskiMaraton Slika 4.11. Forma frmUnosFilma
Izgled Solution Explorer-a nakon kreiranja klase i form dat je na slici 4.12.

Slika 4.12. SolutionExplorer
D) Obezbediti sledee funkcionalnosti za formu frmFilmskiMaraton:
1. (15 poena) Klik na dugme Unesi film otvara formu frmUnosFilma i ubacuje film sa
unetim podacima u generiki red (Queue<Film>) i prikazuje red u RichTextBox
kontroli (Obavezno korienje klase Film i Queue<Film> za prikaz podataka u
RichTexBox-u).
224

Film Troja je istorijski premjerno prikazan 2004. godine.
Film Mr. Bean je komedija premjerno prikazan 1990. godine.
2. (12 poena) Klik na dugme Izbaci film izbacuje film iz reda, prikazuje MessageBox
sa odgovarajuim obavetenjem i prikazuje aurirani red u RichTextBox kontroli.
3. (12 poena) Klik na dugme Eksportuj u txt ubacuje red filmova u fajl Maraton.txt i
prikazuje MessageBox sa odgovarajuim obavetenjem.
4. (2 poena) Klik na dugme Zatvori zatvara aplikaciju.

E) Obezbediti sledee funkcionalnosti za formu frmUnosFilma:
1. (12 poena) Ako korisnik za godinu unese broj manji od 1900 postaviti
ErrorProvider kontrolu na odgovarajue vrednosti i onemoguiti korisniku da
napusti kontrolu dok ne unese sve etiri (Obavezno korienje dogaaja
Validating).
2. (15 poena) Klik na dugme Ubaci proverava ispravnost unetih podataka (naziv
filma ne sme da bude prazno, a godina mora biti vei od 1900). Ako je sve OK
onda vratiti odgovarajui DialogResult ili u sluaju da korisnik nije uneo sve
podatke, obavestiti ga o tome i eka da korisnik ispravi podatke.
3. (2 poena) Klik na dugme Otkazi resetuje vrednosti kontrola na inicijalne vrednosti
i zatvara formu.


Reenje:
// Film.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Prvi_kolokvijum
{
class Film
{
private string naziv;
private int godina;
private string zanr;

public string Naziv
{
get{return this.naziv;}
set {this.naziv=value;}
}

public int Godina
{
get { return this.godina; }
set { this.godina = value; }
}

225

public string Zanr
{
get { return this.zanr; }
set { this.zanr = value; }
}

public Film()
{
this.naziv = "";
this.godina = 1900;
this.zanr = "";
}

public Film(string n, int g, string z)
{
this.naziv = n;
this.godina = g;
this.zanr = z;
}

public override string ToString()
{
return "Film " + this.naziv + " je " + this.zanr + " premijerno prikazan " +
this.godina + ". godine.";
}
}
}

// frmFilmskiMaraton.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace Prvi_Kolokvijum
{
public partial class frmFilmskiMaraton : Form
{
Film f;
Queue<Film> filmovi;

public frmFilmskiMaraton()
{
InitializeComponent();
filmovi = new Queue<Film>();
}

private void btnZatvori_Click(object sender, EventArgs e)
{ this.Close(); }

void napuni()
{
foreach (Film f in filmovi)
{
rtbSpisak.AppendText(f.ToString());
rtbSpisak.AppendText("\r\n");
}
}
226

private void btnUnesi_Click(object sender, EventArgs e)
{
frmUnosFilma frm = new frmUnosFilma();
if (frm.ShowDialog() == DialogResult.OK)
{
f = new Film(frm.Naziv, frm.Godina, frm.Zanr);
filmovi.Enqueue(f);
rtbSpisak.Clear();
napuni();
}
}

private void btnIzbaci_Click(object sender, EventArgs e)
{
filmovi.Dequeue();
rtbSpisak.Clear();
MessageBox.Show("Film je izbacen", "Obavestenje", MessageBoxButtons.OK,
MessageBoxIcon.Information);
napuni();
}

private void btnExport_Click(object sender, EventArgs e)
{
StreamWriter sw = new StreamWriter("Maraton.txt");
foreach (Film f in filmovi)
{
sw.WriteLine(f);
}
sw.Close();
MessageBox.Show("Fajl Maraton.txt je uspesno sacuvan", "Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}

// frmUnosFilma.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Prvi_kolokvijum
{
public partial class frmUnosFilma : Form
{
public string Naziv { get { return this.tbNaziv.Text; } }
public int Godina { get { return Convert.ToInt32(this.mtbGodina.Text); } }
public string Zanr{get {return vratiZanr();}}

public string vratiZanr()
{
string zanr="";
if (rbIstorijski.Checked) zanr = "istorijski";
if (rbKomedija.Checked) zanr = "komedija";
if (rbDrama.Checked) zanr="drama";
return zanr;
}


227

public frmUnosFilma()
{
InitializeComponent();
}

private void btnOtkazi_Click(object sender, EventArgs e)
{
this.tbNaziv.Text = "";
this.mtbGodina.Text = "1900";
this.rbDrama.Checked = false;
this.rbIstorijski.Checked = false;
this.rbKomedija.Checked = false;

this.Close();
}

private void mtbGodina_Validating(object sender, CancelEventArgs e)
{
if (Convert.ToInt32(mtbGodina.Text) < 1900)
{
errGreska.SetError(mtbGodina, "Godina mora biti veca od 1900");
mtbGodina.Focus();
}
else
{
errGreska.Clear();
}
}

private void btnUbaci_Click(object sender, EventArgs e)
{
if (tbNaziv.Text != "" && Convert.ToInt32(mtbGodina.Text) >= 1900)
{
this.DialogResult = DialogResult.OK;
}
else
{
MessageBox.Show("Niste uneli ispravne podatke", "Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}


228

V grupa
A) (20 poena) Kreirati javnu klasu Proizvod sa privatnim atributima: naziv (string), popust
(double), staraCena (int), novaCena (double). Napraviti odgovarajue propertije. U
podrazumevanom konstruktoru postaviti polje naziv artikla na vrednost praznog
stringa, a popust, staru i novu cenu na 0. Napraviti parametarski konstruktor koji kao
ulazne parametre dobija naziv, popust i staru cenu, a novu cenu izraunava po formuli:
staraCena*(1-popust/100). Override-ovati metodu ToString() tako da vraa podatke o
proizvodu u obliku:
Odobren je popust od 15.50% na mleko, pa je nova cena 64.15 dinara.
B) (5 poena) Napraviti formu pod nazivom frmProizvod kao na slici 4.13.
(Kontrole: ListBox, Button)
C) (5 poena) Napraviti formu pod nazivom frmUnosPopusta kao na slici 4.14.
(Kontrole su: TextBox, RadioButton, Button)

Slika 4.13. Forma frmProizvod Slika 4.14. Froma frmUnosPopusta
Izgled Solution Explorer-a nakon kreiranja klase i formi dat je na slici 4.15.

Slika 4.15. Solution Explorer
D) Obezbediti sledee funkcionalnosti za formu frmProizvod:
1. (15 poena) Klik na dugme Odobri popust otvara formu frmUnosPopusta i ubacuje
popust sa unetim podacima u generiku listu (List<Proizvod>) na prvo mesto u
listi i prikazuje listu u ListBox kontroli (Obavezno korienje klase Proizvod i
List<Proizvod> za prikaz podataka u ListBox-u).
229

Odobren je popust od 15.50% na mleko, pa je nova cena 64.15 dinara.
Odobren je popust od 25.00% na hleb, pa je nova cena 37.50 dinara.
2. (12 poena) Klik na dugme Ukini popust izbacuje poslednje uneti popust iz liste,
prikazuje MessageBox sa odgovarajuim obavetenjem i prikazuje auriranu listu
u ListBox kontroli.
3. (12 poena) Klik na dugme Eksportuj u txt ubacuje listu popusta u fajl Popusti.txt i
prikazuje MessageBox sa odgovarajuim obavetenjem.
4. (2 poena) Klik na dugme Zatvori zatvara aplikaciju.

E) Obezbediti sledee funkcionalnosti za formu frmUnosPopusta:
1. (12 poena) Ako korisnik za staru cenu unese vrednost manju ili jednaku 1
postaviti ErrorProvider kontrolu na odgovarajue vrednosti i onemoguiti korisniku
da napusti kontrolu dok ne unese vrednost veu od 1 (Obavezno korienje
dogaaja Validating).
2. (15 poena) Klik na dugme Potvrdi proverava ispravnost unetih podataka (naziv
proizvoda ne sme da bude prazan, a stara cena mora biti vee od 1). Ako je sve
OK onda vratiti odgovarajui DialogResult ili u sluaju da korisnik nije uneo sve
podatke, obavestiti ga o tome i eka da korisnik ispravi podatke.
3. (2 poena) Klik na dugme Otkazi resetuje vrednosti kontrola na inicijalne vrednosti
i zatvara formu.

Reenje:
// Proizvod.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Prvi_kolokvijum
{
class Proizvod
{
private string naziv;
private double popust;
private int staraCena;
private double novaCena;

public string Naziv
{
get { return this.naziv; }
set { this.naziv = value; }
}

public double Popust
{
get { return this.popust; }
set { this.popust = value; }
}

public int StarCena
230

{
get { return this.staraCena; }
set { this.staraCena = value; }
}
public double NovaCrna
{
get { return this.novaCena; }
set { this.novaCena = value; }
}

//podrazumevani konstruktor
public Proizvod()
{
this.naziv = "";
this.popust = 0;
this.staraCena = 0;
this.novaCena = 0;
}

//parametarski konstruktor
public Proizvod(string ime, double popust, int staraCena)
{
this.naziv = ime;
this.popust = popust;
this.staraCena = staraCena;
this.novaCena = staraCena*(1-popust/100);
}

public override string ToString()
{
return "Odobren je popust od "+popust+"% na "+naziv+" pa je nova cena
"+novaCena+" dinara.";
}
}
}

// frmProizvod.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace Prvi_kolokvijum
{
public partial class frmProizvod : Form
{
List<Proizvod> lista;

public frmProizvod()
{
InitializeComponent();
lista = new List<Proizvod>();
}

private void popuniListu()
{
foreach (Proizvod p in lista)
{
231

listBox.Items.Add(p.ToString());
}
}

private void btnOdobriPopust_Click(object sender, EventArgs e)
{
frmUnosPopusta unosPopusta = new frmUnosPopusta();
if (unosPopusta.ShowDialog() == DialogResult.OK)
{
Proizvod proizvod = new Proizvod(unosPopusta.NazivArtikla,
unosPopusta.Popust, unosPopusta.StaraCena);
lista.Insert(0, proizvod);
listBox.Items.Clear();
popuniListu();
}
}

private void btnExport_Click(object sender, EventArgs e)
{
StreamWriter sw = new StreamWriter("Proizvod.txt");
foreach (Proizvod p in lista)
{
sw.WriteLine(p.ToString());
}
MessageBox.Show("Uspesno ste exportovali listu.");
sw.Close();
}

private void btnIzdji_Click(object sender, EventArgs e)
{
Application.Exit();
}

private void btnUkiniPopust_Click(object sender, EventArgs e)
{
lista.RemoveAt(lista.Count-1);
MessageBox.Show("Uspesno ste obrisali poslednji proizvod");
listBox.Items.Clear();
popuniListu();
}
}
}

// frmUnosPopusta.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Prvi_kolokvijum
{
public partial class frmUnosPopusta : Form
{
public string NazivArtikla { get { return textBoxNaziv.Text;} }
public double Popust { get { return vratiPopust(); } }
public int StaraCena { get { return Convert.ToInt32(textBoxStaraCena.Text); } }

public frmUnosPopusta()
{
232

InitializeComponent();
}

private void btnOtkazi_Click(object sender, EventArgs e)
{
textBoxNaziv.Clear();
textBoxStaraCena.Clear();
popust1.Checked = true;
this.Close();
}

private double vratiPopust()
{
double p=0;
if (popust1.Checked) p = 15.50;
if (popust2.Checked) p = 25.00;
if (popust3.Checked) p = 59.80;
return p;
}

private void btnPotvrdi_Click(object sender, EventArgs e)
{
if (textBoxNaziv.Text!="" && Convert.ToInt32(textBoxStaraCena.Text)>1)
{
DialogResult = DialogResult.OK;
}
else
{
MessageBox.Show("Uneti podaci nisu ispravni", "Obavestenje",
MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}

private void textBoxStaraCena_Validating(object sender, CancelEventArgs e)
{
if (Convert.ToInt32(textBoxStaraCena.Text) <= 1)
{
errorProvider1.SetError(textBoxStaraCena, "Cena mora biti veca od 1");
textBoxStaraCena.Focus();
}
else
{
errorProvider1.Clear();
}
}
}
}

233

VI grupa
A) (20 poena) Kreirati javnu klasu Odeljenje sa privatnim atributima: naziv (string), sifra
(string), brRadnika (int). Napraviti odgovarajue propertije. U podrazumevanom
konstruktoru postaviti polje ime i ifra da imaju vrednost praznog stringa, a broj
radnika na 0. Napraviti parametarski konstruktor koji kao ulazne parametre dobija ime,
ifru i broj radnika. Override-ovati metodu ToString() tako da vraa podatke o odeljenju
u obliku:
Odeljenje: Komercijala / Sirfa: 111 / Ukupno radnika: 25
B) (5 poena) Napraviti formu pod nazivom frmFirma kao na slici 4.16.
(Kontrole: RichTextBox, Button)
C) (5 poena) Napraviti formu pod nazivom frmUnosOdeljenja kao na slici 4.17.
(Kontrole su: TextBox, MaskedTextBox Mask je 000, NumericUpDown, Button)


Slika 4.16. Froma frmFrima Slika 4.17. Forma frm.UnosOdeljenja
Izgled Solution Explorer-a nakon kreiranja klase i formi dat je na slici 4.18.

Slika 4.18. Solution Explorer
D) Obezbediti sledee funkcionalnosti za formu frmFirma:
1. (15 poena) Klik na dugme Formiraj odeljenje otvara formu frmUnosOdeljenja i
ubacuje odeljenje sa unetim podacima u generiki stek (Stack<Odeljenje>) i
prikazuje listu u RichTextBox kontroli (Obavezno korienje klase Odeljenje i
Stack<Odeljenje> za prikaz podataka u RichTextBox-u).
234

Odeljenje: Komercijala / Sirfa: 111 / Ukupno radnika: 25
Odeljenje: Prodaja / Sirfa: 222 / Ukupno radnika: 60
2. (12 poena) Klik na dugme Ukini odeljenje izbacuje odeljenje iz steka, prikazuje
MessageBox sa odgovarajuim obavetenjem i prikazuje aurirani stek u
RichTextBox kontroli.
3. (12 poena) Klik na dugme Eksportuj u txt ubacuje stek odeljenja u fajl
Spisak_odeljenja.txt i prikazuje MessageBox sa odgovarajuim obavetenjem.
4. (2 poena) Klik na dugme Zatvori zatvara aplikaciju.

E) Obezbediti sledee funkcionalnosti za formu frmUnosOdeljenja:
1. (12 poena) Ako korisnik za broj zaposlenih unese vrednost manju od 0 ili veu od
90 postaviti ErrorProvider kontrolu na odgovarajue vrednosti i onemoguiti
korisniku da napusti kontrolu dok ne unese vrednost izmeu 1 i 89 (Obavezno
korienje dogaaja Validating).
2. (15 poena) Klik na dugme Prihvati proverava ispravnost unetih podataka (naziv ne
sme da bude prazan, a broj zaposlenih mora biti vei od 0 i manji od 90). Ako je
sve OK onda vratiti odgovarajui DialogResult ili u sluaju da korisnik nije uneo
sve podatke, obavestiti ga o tome i ekati da korisnik ispravi podatke.
3. (2 poena) Klik na dugme Odustani resetuje vrednosti kontrola na inicijalne
vrednosti i zatvara formu.

Reenje:
// Odeljenje.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Prvi_kolokvijum
{
public class Odeljenje
{
private string naziv;
private string sifra;
private int brRadnika;

public string Naziv
{
get { return this.naziv; }
set { this.naziv = value; }
}

public string Sifra
{
get { return this.sifra; }
set { this.sifra = value; }
}


235

public int BrRadnika
{
get { return this.brRadnika; }
set { this.brRadnika = value; }
}

public Odeljenje()
{
this.naziv = "";
this.sifra = "";
this.brRadnika = 0;
}

public Odeljenje(string n, string s, int brad)
{
this.naziv = n;
this.sifra = s;
this.brRadnika = brad;
}

public override string ToString()
{
return "Odeljenje:" + this.naziv + " / Sifra:" + this.sifra + " / Ukupno
radnika:" + this.brRadnika.ToString();
}
}
}

// frmFirma.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace Prvi_kolokvijum
{
public partial class frmFirma : Form
{
private Stack<Odeljenje> red;
private Odeljenje a;

public frmFirma()
{
InitializeComponent();
red = new Stack<Odeljenje>();
}

private void UbaciOdeljenje()
{
foreach (Odeljenje a in red)
{
richTextBoxFirma.AppendText(a.ToString());
richTextBoxFirma.AppendText("\r\n");
}
}


236

private void buttonFormirajOdeljenje_Click(object sender, EventArgs e)
{
frmUnosOdeljenja frm = new frmUnosOdeljenja();
if (DialogResult.OK == frm.ShowDialog())
{
a = new Odeljenje(frm.Naziv, frm.Sifra, frm.BrRadnika);
red.Push(a);
richTextBoxFirma.Clear();
UbaciOdeljenje();
}
}

private void buttonZatvori_Click(object sender, EventArgs e)
{
this.Close();
}

private void buttonUkiniOdeljenje_Click(object sender, EventArgs e)
{
red.Pop();
MessageBox.Show("Poslednje odeljenje je ukinuto", "Obavestenje");
richTextBoxFirma.Clear();
}

private void buttonExport_Click(object sender, EventArgs e)
{
StreamWriter sw = new StreamWriter("Spisak_odeljenja.txt");
foreach (Odeljenje a in red)
{
sw.WriteLine(a.ToString());
}
MessageBox.Show("Uspesno ste snimili fajl Spisak_odeljenja.txt",
"Obavestenje");
sw.Close();
}
}
}

// frmUnosOdeljenja.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Prvi_kolokvijum
{
public partial class frmUnosOdeljenja : Form
{
public frmUnosOdeljenja()
{
InitializeComponent();
}
public string Naziv { get { return this.textBoxNazivOdeljenja.Text; } }
public string Sifra { get { return this.maskedTextBoxSifraOdeljenja.Text; } }
public int BrRadnika
{
get { return Convert.ToInt32(this.numericUpDownZaposleni.Value); }
}
237

private void buttonPrihvati_Click(object sender, EventArgs e)
{
if (textBoxNazivOdeljenja.Text != "" && maskedTextBoxSifraOdeljenja.Text !=
"" && numericUpDownZaposleni.Value > 0 && numericUpDownZaposleni.Value <
90)
{
DialogResult = DialogResult.OK;
}
else
{
MessageBox.Show("Niste uneli sve podatke", "Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}

private void numericUpDownZaposleni_Validating(object sender, CancelEventArgs e)
{
if (numericUpDownZaposleni.Value <= 0)
{
errorProvider1.SetError(numericUpDownZaposleni, "Broj zaposlenih mora
biti veci od 0");
numericUpDownZaposleni.Focus();

}
else if (numericUpDownZaposleni.Value > 90)
{
errorProvider1.SetError(numericUpDownZaposleni, "Broj zaposlenih mora
biti manji od 90");
numericUpDownZaposleni.Focus();
}

else
{
errorProvider1.Clear();
}
}

private void buttonOdustani_Click(object sender, EventArgs e)
{
this.textBoxNazivOdeljenja.Text = "";
this.maskedTextBoxSifraOdeljenja.Text = "";
this.numericUpDownZaposleni.Value = 1;
this.Close();
}
}
}



238

VII grupa
A) (20 poena) Kreirati javnu klasu Polazak sa privatnim atributima: grad (string),
prevoznik (string), vremePolaska (string). Napraviti odgovarajue propertije. U
podrazumevanom konstruktoru postaviti polja za grad i prevoznik na vrednost praznog
stringa, a vreme polaska na 0. Napraviti parametarski konstruktor koji kao ulazne
parametre dobija grad, prevoznik i vreme polaska. Override-ovati metodu ToString()
tako da vraa podatke o proizvodu u obliku:
Grad: Beograd * Prevoznik: Lasta * Vreme prvog polaska: 12:30.
B) (5 poena) Napraviti formu pod nazivom frmRedVoznje kao na slici 4.19.
(Kontrole: ListBox, Button)
C) (5 poena) Napraviti formu pod nazivom frmUnosPolaska kao na slici 4.20.
(Kontrole su: TextBox, CheckBox, MaskedTextBox mask je 00:00, Button)


Slika 4.19. Forma frmRedVoznje Slika 4.20. Forma frmRedPolaska
Izgled Solution Explorer-a nakon kreiranja klase i formi datoj na slici 4.21.

Slika 4.21. Solution Explorer
D) Obezbediti sledee funkcionalnosti za formu frmRedVoznje:
1. (15 poena) Klik na dugme Unesi polazak otvara formu frmUnosPolaska i ubacuje
polazak sa unetim podacima u generiki red (Queue<Polazak>) i prikazuje red u
ListBox kontroli (Obavezno korienje klase Polazak i Queue<Polazak> za prikaz
podataka u ListBox-u).
239

Grad: Beograd * Prevoznik: Lasta Timas * Vreme prvog polaska: 12:30.
Grad: Nis * Prevoznik: NisExpress * Vreme prvog polaska: 16:00.

2. (12 poena) Klik na dugme Ukini polazak izbacuje polazak iz reda, prikazuje
MessageBox sa odgovarajuim obavetenjem i prikazuje aurirani red u ListBox
kontroli.
3. (12 poena) Klik na dugme Eksportuj u txt ubacuje generiki red polazaka u fajl
RedVoznje.txt i prikazuje MessageBox sa odgovarajuim obavetenjem.
4. (2 poena) Klik na dugme Zatvori zatvara aplikaciju.

E) Obezbediti sledee funkcionalnosti za formu frmUnosPolaska:
1. (12 poena) Ako korisnik ne unese naziv grada postaviti ErrorProvider kontrolu na
odgovarajue vrednosti i onemoguiti korisniku da napusti kontrolu dok ne unese
naziv grada (Obavezno korienje dogaaja Validating).
2. (15 poena) Klik na dugme Prihvati proverava ispravnost unetih podataka (grad ne
sme da bude prazan i mora biti izabran bar jedan prevoznik). Ako je sve OK onda
vratiti odgovarajui DialogResult ili u sluaju da korisnik nije uneo sve podatke,
obavestiti ga o tome i eka da korisnik ispravi podatke.
3. (2 poena) Klik na dugme Odustani resetuje vrednosti kontrola na inicijalne
vrednosti i zatvara formu.

Reenje:
// Polazak.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Prvi_kolokvijum
{
class Polazak
{
private string grad;
private string prevoznik;
private string vremePolaska;

public string Grad
{
get { return this.grad; }
set { this.grad = value; }
}

public string Prevoznik
{
get { return this.prevoznik; }
set { this.prevoznik = value; }
}



240

public string VremePolaska
{
get { return this.vremePolaska; }
set { this.vremePolaska = value; }
}

public Polazak()
{
this.grad = "";
this.prevoznik = "";
this.vremePolaska = "0";
}

public Polazak(string s, string p, string v)
{
this.grad = s;
this.prevoznik = p;
this.vremePolaska = v;
}

public override string ToString()
{
return "Grad: " + this.grad + " * Prevoznik: " + this.prevoznik + " * Vreme
prvog polaska: " + this.vremePolaska;
}
}
}

// frmRedVoznje.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace Prvi_kolokvijum
{
public partial class frmRedVoznje : Form
{
private Queue<Polazak> redvoznje;
private Polazak r;

public frmRedVoznje()
{
InitializeComponent();
redvoznje = new Queue<Polazak>();

}
private void prikaziRedvoznje()
{
foreach (Polazak s in redvoznje)
{
listBox1.Items.Add(r.ToString());
}
}


241

private void buttonUnesiPolazak_Click(object sender, EventArgs e)
{
frmUnosPolaska unos = new frmUnosPolaska();

if (DialogResult.OK == unos.ShowDialog())
{
r = new Polazak(unos.Grad, unos.Prevoznik, unos.Vreme);
redvoznje.Enqueue(r);
listBox1.Items.Clear();
prikaziRedvoznje();
}
}

private void buttonUkiniPolazak_Click(object sender, EventArgs e)
{
if (redvoznje.Count != 0)
{
redvoznje.Dequeue();
listBox1.Items.Clear();
MessageBox.Show("Polazak je izbacen", "Obavesetnje");
prikaziRedvoznje();
}
else
{
MessageBox.Show("Trenutno nema polazaka", "Obavestenje");
}
}

private void buttonEksport_Click(object sender, EventArgs e)
{
StreamWriter sw = new StreamWriter("RedVoznje.txt");
foreach (Polazak r in redvoznje)
{
sw.WriteLine(r.ToString());
}
sw.Close();
MessageBox.Show("Fajl RedVoznje.txt je uspeno snimljen", "Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}

private void buttonZatvori_Click(object sender, EventArgs e)
{
this.Close();
}
}
}

// frmUnosPolaska.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Prvi_kolokvijum
{
public partial class frmUnosPolaska : Form
{
public string Grad { get { return this.tbGrad.Text; } }
242

public string Prevoznik { get { return vratiPrevoznika(); } }
public string Vreme { get { return this.mtbVreme.Text; } }

public frmUnosPolaska()
{
InitializeComponent();
}

private void resetuj()
{
cbLasta.Checked = true;
cbNis.Checked = true;
cbTimas.Checked = true;
}

private string vratiPrevoznika()
{
string s = "";
if (cbLasta.Checked) s += " Lasta";
if (cbNis.Checked) s += " NisExpress";
if (cbTimas.Checked) s += " Timas";
return s;
}

private void buttonOdustani_Click(object sender, EventArgs e)
{
tbGrad.Text = "";
resetuj();
mtbVreme.Text = "";
this.Close();
}

private void tbGrad_Validating(object sender, EventArgs e)
{
if (tbGrad.Text == "")
{
errGreska.SetError(tbGrad, "Morate uneti naziv garda");
tbGrad.Focus();
}
else
{
errGreska.Clear();
}
}

private void btnPrihvati_Click(object sender, EventArgs e)
{
if (tbGrad.Text != "" && (cbLasta.Checked != false || cbNis.Checked != false
|| cbTimas.Checked != false))
{
DialogResult = DialogResult.OK;
}
else
{
MessageBox.Show("Podaci nisu uneti", "Obavestenje", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
}
}


243

VIII grupa
A) (20 poena) Kreirati javnu klasu Tim sa privatnim atributima: naziv (string), grad
(Beograd, Pancevo, Zemun), sport (string). Napraviti odgovarajue propertije. U
podrazumevanom konstruktoru postaviti polje naziv, ime grada i vrstu sporta da imaju
vrednost praznog stringa. Napraviti parametarski konstruktor koji kao ulazne parametre
dobija naziv, ime grada i vrstu sporta. Override-ovati metodu ToString() tako da vraa
podatke o odeljenju u obliku:
Za fudbalsko prvenstvo prijavio se tim Lion iz grada Beograd.
B) (5 poena) Napraviti formu pod nazivom frmTakmicenje kao na slici 4.22.
(Kontrole: RichTextBox, Button)
C) (5 poena) Napraviti formu pod nazivom frmUnosTima kao na slici 4.23.
(Kontrole su: TextBox, ComboBox, RadioButton, Button)


Slika 4.22. Forma frmTakmicenja Slika 4.23. Forma frmUnosTima
Izgled Solution Explorer-a nakon kreiranja klase i formi dat je na slici 4.24.

Slika 4.24. Solution Explorer
D) Obezbediti sledee funkcionalnosti za formu frmTakmicenje:
1. (15 poena) Klik na dugme Unos tima otvara formu frmUnosTima i ubacuje tim sa
unetim podacima u ArrayList kolekciju (obavezno ukljuiti namespace
System.Collection) i prikazuje listu u RichTextBox kontroli (Obavezno korienje
klase Tim i ArrayList za prikaz podataka u RichTextBox-u).
244

Za fudbalsko prvenstvo prijavio se tim Lion iz grada Beograd.
Za rukometno prvenstvo prijavio se tim Naftagas iz grada Pancevo.
2. (12 poena) Klik na dugme Brisanje tima izbacuje tim iz ArrayList kolekcije,
prikazuje MessageBox sa odgovarajuim obavetenjem i prikazuje auriranu listu
u RichTextBox kontroli.
3. (12 poena) Klik na dugme Eksportuj u txt ubacuje ArrayList kolekciju timova u fajl
Takmicenje.txt i prikazuje MessageBox sa odgovarajuim obavetenjem.
4. (2 poena) Klik na dugme Zatvori zatvara aplikaciju.

E) Obezbediti sledee funkcionalnosti za formu frmUnosTima:
1. (12 poena) Ako korisnik ne izabere grad postaviti ErrorProvider kontrolu na
odgovarajue vrednosti i onemoguiti korisniku da napusti kontrolu dok ne izabere
grad iz ComboBox kontrole (Obavezno korienje dogaaja Validating).
2. (15 poena) Klik na dugme Potvrdi proverava ispravnost unetih podataka (naziv
tima i grada ne sme da bude prazan). Ako je sve OK onda vratiti odgovarajui
DialogResult ili u sluaju da korisnik nije uneo sve podatke, obavestiti ga o tome i
ekati da korisnik ispravi podatke.
3. (2 poena) Klik na dugme Otkazi resetuje vrednosti kontrola na inicijalne vrednosti
i zatvara formu.

Reenje:
// Tim.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Prvi_kolokvijum
{
class Tim
{
private string naziv;
private string grad;
private string sport;

public string Naziv { get { return this.naziv; } set { this.naziv = value; } }
public string Grad { get { return this.grad; } set { this.grad = value; } }
public string Sport { get { return this.sport; } set { this.sport = value; } }

public Tim()
{
this.naziv = "";
this.grad = "";
this.sport = "";
}

public Tim(string naziv, string grad, string sport)
{
this.naziv = naziv;
245

this.grad = grad;
this.sport = sport;
}

public override string ToString()
{
return "Za " + this.sport + " prvenstvo prijavio se tim " + this.naziv + "
iz grada " + this.grad;
}
}
}

// frmTakmicenje.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Collections;

namespace Prvi_kolokvijum
{
public partial class frmTakmicenje : Form
{
ArrayList lista;
Tim t;

public frmTakmicenje()
{
InitializeComponent();
lista=new ArrayList();
}

void napuniListu()
{
richTextBox1.Clear();
foreach (Tim t in lista)
{
richTextBox1.AppendText(t.ToString());
richTextBox1.AppendText("\r\n");
}
}

private void btnUnos_Click(object sender, EventArgs e)
{
Unos_tima uns = new Unos_tima();
if (uns.ShowDialog() == DialogResult.OK)
{
t = new Tim(uns.Naziv, uns.Grad, uns.Sport);
lista.Add(t);
napuniListu();
}
}

void obrisiListu()
{
richTextBox1.Clear();
}
246

private void btnZatvori_Click(object sender, EventArgs e)
{
Application.Exit();
}

private void btnBrisanje_Click(object sender, EventArgs e)
{
if (DialogResult.Yes == MessageBox.Show("Da li ste sigurni", "?",
MessageBoxButtons.YesNo, MessageBoxIcon.Question))
{
lista.Remove(t);
napuniListu();
}
MessageBox.Show("Poslednji tim je obrisan", "Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}

private void btnExport_Click(object sender, EventArgs e)
{
StreamWriter sw = new StreamWriter("Takmicenje.txt");
foreach (Tim t in lista)
sw.WriteLine(t.ToString());
sw.Close();
MessageBox.Show("Fajl studenti.txt je uspeno snimljen", "Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}

// frmUnosTima.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Prvi_kolokvijum
{
public partial class Unos_tima : Form
{
public string Naziv { get { return this.textBox1.Text; } }
public string Grad { get { return cmbBox.SelectedItem.ToString(); } }
public string Sport { get { return vratiPrvenstvo(); } }

public Unos_tima()
{
InitializeComponent();
}

private string vratiPrvenstvo()
{
string prvenstvo = "";

if (rbtFudbal.Checked == true)
{
prvenstvo = "fudbalsko";
}

247

if(rbtOdbojka.Checked==true)
{
prvenstvo = "odbojkasko";
}

if (rbtRukomet.Checked == true)
{
prvenstvo = "rukometno";
}

return prvenstvo;
}

private void btnOtkazi_Click(object sender, EventArgs e)
{
textBox1.Text = "";
rbtFudbal.Checked = true;
cmbBox.Text = "";
this.Close();
}

private void btnPotvrdi_Click(object sender, EventArgs e)
{
if (textBox1.Text != "" && !String.IsNullOrEmpty(cmbBox.Text))
DialogResult = DialogResult.OK;
else
MessageBox.Show("Molim vas da ispunite sva polja");
}

private void cmbBox_Validating(object sender, CancelEventArgs e)
{
if (String.IsNullOrEmpty(cmbBox.Text))
{
errorProvider1.SetError(cmbBox, "Morate izabrati grad");
cmbBox.Focus();
}
else
errorProvider1.Clear();
}
}
}


248

2. Zadaci sa II kolokvijuma kolske 2012/2013. godine
I grupa
A) (10 poena) Kreirati klasu Konekcija koja sadri statiko string polje, koje sadri
konekcioni string na bazu iji skript je dat u okviru Hotel.sql.
B) (6 poena) Napraviti formu pod nazivom frmRezervacija kao na slici 4.25.

Slika 4.25. Forma frmRezervacija

C) (10 poena) Prilikom uitavanja forme DataGridView kontrola prikazuje sve zapise iz
tabele Rezervacija baze Hotel.
D) (15 poena) Implementirati da se klikom na dugme Obrisi rezervaciju brie selektovani
red u DataGridView kontroli i korisniku se prikazuje MessageBox sa odgovarajuom
porukom.
E) Implementirati meni Rezervacija koji sadri dva podmenija: Unos nove rezervacije i
Pretraga.
1. (2 poena) Izborom opcije Unos nove rezervacije GroupBox pod nazivom Unos
rezervacije postaje dostupan za upis, dok GroupBox pod nazivom Prikazi po
tipu usluge postaje ne dostupan za upis.
2. (15 poena) Klikom na dugme Rezervisi proverava se da li su RezervacijaID,
Prezime, Broj clanova i Tip usluge popunjeni.
i. Ako jesu u tabeli Rezervacija u bazi Hotel se kreira novi zapis sa unetim
parametrima i korisniku se prikazuje MessageBox sa odgovarajuom
porukom i auriraju podaci u DataGridView kontroli.
249

ii. A ako nisu korisniku se prikazuje MessageBox sa odgovarajuom
porukom.
3. (2 poena) Klikom na dugme Odustani prazne se sve kontrole u okviru Unos
nove rezervacije GroupBox-a.
4. Implementirati meni Pretraga, koji GroupBox pod nazivom Prikazi po tipu
usluge ini dostupnim za upis, a GroupBox pod nazivom Unos rezervacije
postaje nedostupan.
i. (10 poena) U ComboBox-u se prikazuju svi razliiti tipovi usluga za koje
postoji rezervacija.
ii. (15 poena) Izborom nekog od njih prikazuje se lista prezimena koja su
izabrala taj tip rezervacije.
F) (15 poena) Implementirati konteksni meni Izmeni rezervaciju koji omoguava uvanje
uinjenih promena u DataGridView kontroli, uz prikaz MessageBox-a u kome treba
potvrditi uvanje promene, u suprotnom vratiti DataGridView na staru verziju.

Skript baze Hotel:
USE [Hotel]
GO
/****** Object: Table [dbo].[Rezervacija] Script Date: 01/28/2013 19:07:35 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Rezervacija]')
AND type in (N'U'))
DROP TABLE [dbo].[Rezervacija]
GO
/****** Object: Table [dbo].[Rezervacija] Script Date: 01/28/2013 19:07:35 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id =
OBJECT_ID(N'[dbo].[Rezervacija]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Rezervacija](
[Rezervacija_ID] [int] NOT NULL,
[Prezime] [nvarchar](20) NOT NULL,
[Broj_clanova] [int] NOT NULL,
[Tip_usluge] [nvarchar](15) NOT NULL,
CONSTRAINT [PK_Rezervacija] PRIMARY KEY CLUSTERED
(
[Rezervacija_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
INSERT [dbo].[Rezervacija] ([Rezervacija_ID], [Prezime], [Broj_clanova], [Tip_usuge])
VALUES (222, N'Ristic', 1, N'All inclusive')
INSERT [dbo].[Rezervacija] ([Rezervacija_ID], [Prezime], [Broj_clanova], [Tip_usuge])
VALUES (333, N'Maric', 3, N'Polupansion')
INSERT [dbo].[Rezervacija] ([Rezervacija_ID], [Prezime], [Broj_clanova], [Tip_usuge])
VALUES (444, N'Janjic', 3, N'Polupansion')


250

Reenje:
// Konekcija.cs
class Konekcija
{
public static string cnn = Properties.Settings.Default.HotelConnectionString;
}
// frmRezervacija.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace Drugi_kolokvijum
{
public partial class frmRezervacija : Form
{
SqlConnection konekcija = new SqlConnection(Konekcija.cnn);

public frmRezervacija()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
this.rezervacijaTableAdapter.Fill(this.hotelDataSet.Rezervacija);

this.rezervacijaTableAdapter.Fill(this.hotelDataSet.Rezervacija);

groupBox1.Enabled = false;
groupBox2.Enabled = false;
groupBox3.Enabled = false;
}

private string vratiUslugu()
{
string tipUsluge = "";
if (rbNajamApartmana.Checked == true)
{
tipUsluge = "Najam apartmana";
}
else if (rbPolupansion.Checked == true)
{
tipUsluge = "Polupansion";
}
else if (rbPunPansion.Checked == true)
{
tipUsluge = "Pun pansion";
}
else { tipUsluge = "All inclusive"; }
return tipUsluge;
}




251

private void resetuj()
{
tbRezID.Clear();
tbPrezime.Clear();
tbBrClan.Clear();
}

private void btnObrisi_Click(object sender, EventArgs e)
{
if (dataGridView1.SelectedRows.Count > 0)
{

int selectedIndex = dataGridView1.SelectedRows[0].Index;

int rezID = int.Parse(dataGridView1[0, selectedIndex].Value.ToString());
string prez = dataGridView1[1, selectedIndex].Value.ToString();
int brClan = int.Parse(dataGridView1[2, selectedIndex].Value.ToString());
string tipUsl = dataGridView1[3, selectedIndex].Value.ToString();

try
{
rezervacijaTableAdapter.Delete(rezID,prez,brClan,tipUsl);
rezervacijaTableAdapter.Fill(hotelDataSet.Rezervacija);
MessageBox.Show("Uspesno obrisana rezervacija!","Poruka");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}

private void unosNoveRezervacijeToolStripMenuItem_Click(object sender, EventArgs e)
{
groupBox1.Enabled = true;
groupBox2.Enabled = true;
}

private void btnRezervisi_Click(object sender, EventArgs e)
{
if (tbRezID.Text == "" && tbPrezime.Text == "" && tbBrClan.Text == "")
{
MessageBox.Show("Morate popuniti sva polja!", "Obavestenje");
}
else
{
try
{
RezervacijaTableAdapter.Insert(Convert.ToInt32(tbRezID.Text),
tbPrezime.Text, Convert.ToInt32(tbBrClan.Text),
vratiUslugu());
MessageBox.Show("Uspesno uneta rezervacija!","Poruka");
rezervacijaTableAdapter.Fill(hotelDataSet.Rezervacija);

resetuj();
}
catch (Exception ex)
{
MessageBox.Show("Ne mozete menjati ID rezervacije" + ex.Message);
}
}
}


252

private void btnOdustani_Click(object sender, EventArgs e)
{
resetuj();
}

private void cmbTipUsluge_SelectedIndexChanged(object sender, EventArgs e)
{
rtbPrezime.Clear();
konekcija.Open();
SqlCommand command = new SqlCommand("SELECT Prezime FROM Rezervacija WHERE
Tip_usluge = @Tip_usluge", konekcija);

SqlParameter parametar = new SqlParameter("Tip_usluge", cmbTipUsluge.Text);
command.Parameters.Add(parametar);
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
rtbPrezime.AppendText(reader.GetString(0));
rtbPrezime.AppendText("\r\n");
}
konekcija.Close();
}

private void pretragaToolStripMenuItem_Click(object sender, EventArgs e)
{
groupBox3.Enabled = true;

SqlDataAdapter da = new SqlDataAdapter("select Tip_usluge from Rezervacija",
konekcija);
DataTable dt = new DataTable();
da.Fill(dt);

cmbTipUsluge.DataSource = dt;
cmbTipUsluge.DisplayMember = "Tip_usluge";

}

private void izmeniRezervacijuToolStripMenuItem_Click(object sender, EventArgs e)
{
DialogResult dr = MessageBox.Show("Da li zaista zelite da izmenite
podatke?","Obavestenje",
MessageBoxButtons.YesNoCancel,
MessageBoxIcon.Question);
if (dr == DialogResult.Yes)
{
try
{
rezervacijaTableAdapter.Update(hotelDataSet.Rezervacija);
dataGridView1.Refresh();
MessageBox.Show("Uspesno izmenjeni podaci!", "Obavestenje");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
}



253

II grupa
A) (10 poena) Kreirati klasu Konekcija koja sadri statiko string polje, koje sadri
konekcioni string na bazu iji skript je dat u okviru Konkursi.sql.
B) (6 poena) Napraviti formu pod nazivom frmOglasi kao na slici 4.26.

Slika 4.26. Forma frmOglasi

C) (10 poena) Prilikom uitavanja forme DataGridView kontrola prikazuje sve zapise iz
tabele Oglasi baze Konkursi.
D) Implementirati meni Oglasi koji sadri dva podmenija: Unos i Obrisi.
1. (2 poena) Izborom opcije Unos GroupBox pod nazivom Unos oglasa postaje
dostupan za upis, dok GroupBox pod nazivom Prikazi po strucnoj spremi
postaje ne dostupan za upis.
2. (15 poena) Klikom na dugme Unesi proverava se da li su OglasID, Radno mesto,
Godine staa i Struna sprema popunjeni.
i. Ako jesu u tabeli Oglasi u bazi Konkursi se kreira novi zapis sa unetim
parametrima i korisniku se prikazuje MessageBox sa odgovarajuom
porukom i auriraju podaci u DataGridView kontroli.
ii. A ako nisu korisniku se prikazuje MessageBox sa odgovarajuom
porukom.
3. (2 poena) Klikom na dugme Otkazi prazne se sve kontrole u okviru Unos
oglasa GroupBox-a.
4. (15 poena) Izborom opcije Obrisi brie se selektovani red u DataGridView
kontroli i korisniku se prikazuje MessageBox sa odgovarajuom porukom.
254

E) Implementirati dugme Pretraga, koji GroupBox pod nazivom Prikazi po strucnoj
spremi ini dostupnim za upis, a GroupBox pod nazivom Unos oglasa postaje
nedostupan.
1. (10 poena) U ComboBox-u se prikazuju sve razliite strune spreme za koje
postoje oglasi.
2. (15 poena) Izborom nekog od njih prikazuje se lista radnih mesta za koja je
potrebna izabrana struna sprema.
F) (15 poena) Implementirati konteksni meni Izmeni oglas koji omoguava uvanje
uinjenih promena u DataGridView kontroli, uz prikaz MessageBox-a u kome treba
potvrditi uvanje promene, u suprotnom vratiti DataGridView na staru verziju.

Skript baze Konkursi:
USE [Konkursi]
GO
/****** Object: Table [dbo].[Oglasi] Script Date: 01/22/2013 01:28:06 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Oglasi]') AND
type in (N'U'))
DROP TABLE [dbo].[Oglasi]
GO
/****** Object: Table [dbo].[Oglasi] Script Date: 01/22/2013 01:28:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Oglasi]')
AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Oglasi](
[OglasID] [int] NOT NULL,
[Radno_mesto] [nvarchar](50) NOT NULL,
[Godine_staza] [int] NOT NULL,
[Strucna_sprema] [nvarchar](15) NOT NULL,
CONSTRAINT [PK_Oglasi] PRIMARY KEY CLUSTERED
(
[OglasID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
INSERT [dbo].[Oglasi] ([OglasID], [Radno_mesto], [Godine_staza], [Strucna_sprema]) VALUES
(123, N'Programer', 3, N'Visa')
INSERT [dbo].[Oglasi] ([OglasID], [Radno_mesto], [Godine_staza], [Strucna_sprema]) VALUES
(147, N'Saradnik', 1, N'Visoka')
INSERT [dbo].[Oglasi] ([OglasID], [Radno_mesto], [Godine_staza], [Strucna_sprema]) VALUES
(258, N'Ekonomista', 8, N'Visa')
INSERT [dbo].[Oglasi] ([OglasID], [Radno_mesto], [Godine_staza], [Strucna_sprema]) VALUES
(456, N'Sekretarica', 5, N'Srednja')
INSERT [dbo].[Oglasi] ([OglasID], [Radno_mesto], [Godine_staza], [Strucna_sprema]) VALUES
(789, N'Nastavnik', 0, N'Visoka')




255

Reenje:
// Konekcija.cs
class Konekcija
{
public static string konString=Properties.Settings.Default.KonkursiConnectionString;
}
// frmOglasi.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Drugi_kolokvijum
{
public partial class frmOglasi : Form
{
SqlConnection kon = new SqlConnection(Konekcija.konString);

private string rbCheck()
{
string vracaj = "";

if (rbNiza.Checked)
{
vracaj = "Niza";
}
else
{
if (rbVisa.Checked)
{
vracaj = "Visa";
}
else
{
vracaj = "Visoka";
}
}
return vracaj;
}

public frmRezervacija()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
this.oglasiTableAdapter.Fill(this.konkursiDataSet.Oglasi);

}

private void unosToolStripMenuItem_Click(object sender, EventArgs e)
{
groupBox1.Enabled = true;
groupBox3.Enabled = false;

}
256

private void btnUnesi_Click(object sender, EventArgs e)
{
string rbSprema = rbCheck();

if (txtOglasiID.Text != "" && txtRadnoMesto.Text != "" && txtGodineStaza.Text
!= "" && rbSprema != "")
{

try
{
oglasiTableAdapter.Insert(Convert.ToInt32(txtOglasiID.Text),
txtRadnoMesto.Text,
Convert.ToInt32(txtGodineStaza.Text), rbSprema);

MessageBox.Show("Unos novog predmeta uspesan!");

this.oglasiTableAdapter.Fill(this.konkursiDataSet.Oglasi);

//Brisanje textBox-ova
txtOglasiID.Clear();
txtRadnoMesto.Clear();
txtGodineStaza.Clear();

groupBox1.Enabled = false;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
else
{
MessageBox.Show("Morate popuniti sva polja.", "Poruka",
MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
}

private void btnOtkazi_Click(object sender, EventArgs e)
{
txtOglasiID.Clear();
txtRadnoMesto.Clear();
txtGodineStaza.Clear();

rbNiza.Checked = false;
rbVisa.Checked = false;
rbVisoka.Checked = false;
}

private void brisiToolStripMenuItem_Click(object sender, EventArgs e)
{
//Provera dal postoji selektovani red
if (dataGridView1.SelectedRows.Count > 0)
{
//Izvlacimo index za selektovani red
int selectedIndex = dataGridView1.SelectedRows[0].Index;

//Za selektovani red se citaju atributi
int OglasiID = int.Parse(dataGridView1[0, selectedIndex].Value.ToString());
string RadnoMesto = dataGridView1[1, selectedIndex].Value.ToString();
int GodineStaza = int.Parse(dataGridView1[2, selectedIndex].Value.ToString());
string StrucnaSprema = dataGridView1[3, selectedIndex].Value.ToString();



257

try
{
//Brisanje selektovanog reda iz baze
oglasiTableAdapter.Delete(OglasiID, RadnoMesto, GodineStaza,
StrucnaSprema);

//Brisanje selektovanog reda iz dataGridView
dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[0].Index);

MessageBox.Show("Uspesno ste obrisali selektovani red");
}
catch (Exception ex)
{

MessageBox.Show(ex.Message);
}
}
}

private void btnPretraga_Click(object sender, EventArgs e)
{
groupBox1.Enabled = false;
groupBox3.Enabled = true;

try
{
SqlDataAdapter da = new SqlDataAdapter("SELECT DISTINCT Strucna_sprema
FROM Oglasi", kon);
//Kreiranje nove dataTable
DataTable dt = new DataTable();

//Punjenje dataTable
da.Fill(dt);

//Punjenje cb-a
comboBox1.DataSource = dt;

//Definisanje kontorole koja ce biti prikazana u cb-u
comboBox1.DisplayMember = "Strucna_sprema";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
richTextBox1.Clear();

kon.Open();

//Kreiramo SQL parametarski upit
using (SqlCommand command = new SqlCommand("SELECT Radno_mesto FROM Oglasi
WHERE Strucna_sprema =
@Strucna_sprema", kon))
{
//Definisanje parametra
command.Parameters.Add(new SqlParameter("Strucna_sprema",
comboBox1.Text));

//Izvrsavanje SQL upita
SqlDataReader reader = command.ExecuteReader();

258

//Ispis u richtextBox
while (reader.Read())
{
richTextBox1.AppendText(reader.GetString(0));
richTextBox1.AppendText("\r\n");
}
}
kon.Close();
}

private void izmeniOglasToolStripMenuItem_Click(object sender, EventArgs e)
{
DialogResult dr = MessageBox.Show("Da li ste siguni da zelite da sacuvate
izmene?", "Poruka", MessageBoxButtons.YesNoCancel,
MessageBoxIcon.Question);

if (dr == DialogResult.Yes)
{
try
{
this.oglasiTableAdapter.Update(konkursiDataSet.Oglasi);

dataGridView1.Refresh();

MessageBox.Show("Izmene su sacuvane","Poruka", MessageBoxButtons.OK,
MessageBoxIcon.Asterisk);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

}
}
}



259

III grupa
A) (10 poena) Kreirati klasu Konekcija koja sadri statiko string polje, koje sadri
konekcioni string na bazu iji skript je dat u okviru Bioskop.sql.
B) (6 poena) Napraviti formu pod nazivom frmRepertoar kao na slici:

Slika 4.27. Forma frmRepertoar

C) (10 poena) Prilikom uitavanja forme DataGridView kontrola prikazuje sve zapise iz
tabele Filmovi baze Bioskop.
D) (15 poena) Implementirati da se klikom na dugme Obrisi film brie selektovani red u
DataGridView kontroli i korisniku se prikazuje MessageBox sa odgovarajuom porukom.
E) Implementirati meni Repertoar koji sadri dva podmenija: Unos novog filma i
Pretraga filmova.
1. (2 poena) Izborom opcije Unos novog filma GroupBox pod nazivom Unos filma
postaje dostupan za upis, dok GroupBox pod nazivom Prikazi po zanru postaje
ne dostupan za upis.
2. (15 poena) Klikom na dugme Ubaci proverava se da li su FilmID, Naziv, Godina i
anr popunjeni.
i. Ako jesu u tabeli Filmovi u bazi Bioskop se kreira novi zapis sa unetim
parametrima i korisniku se prikazuje MessageBox sa odgovarajuom
porukom i auriraju podaci u DataGridView kontroli.
ii. A ako nisu korisniku se prikazuje MessageBox sa odgovarajuom
porukom.
3. (2 poena) Klikom na dugme Resetuj prazne se sve kontrole u okviru Unos
filma GroupBox-a.
260

4. Implementirati meni Pretraga filmova, koji GroupBox pod nazivom Prikazi po
zanru ini dostupnim za upis, a GroupBox pod nazivom Unos filma postaje
nedostupan.
i. (10 poena) U ComboBox-u se prikazuju svi razliiti anrovi za koje postoje
filmovi u bazi.
ii. (15 poena) Izborom nekog od njih prikazuje se lista sa nazivom filmova
koji su izabranog anra.
F) (15 poena) Implementirati konteksni meni Izmeni film koji omoguava uvanje
uinjenih promena u DataGridView kontroli, uz prikaz MessageBox-a u kome treba
potvrditi uvanje promene, u suprotnom vratiti DataGridView na staru verziju.

Skript baze Bioskop:
USE [Bioskop]
GO
/****** Object: Table [dbo].[Filmovi] Script Date: 01/22/2013 01:29:18 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Filmovi]') AND
type in (N'U'))
DROP TABLE [dbo].[Filmovi]
GO
/****** Object: Table [dbo].[Filmovi] Script Date: 01/22/2013 01:29:18 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Filmovi]')
AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Filmovi](
[FilmID] [int] NOT NULL,
[Naziv] [nvarchar](50) NOT NULL,
[Godina] [int] NOT NULL,
[Zanr] [nvarchar](15) NOT NULL,
CONSTRAINT [PK_Filmovi] PRIMARY KEY CLUSTERED
(
[FilmID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
INSERT [dbo].[Filmovi] ([FilmID], [Naziv], [Godina], [Zanr]) VALUES (111, N'Troja', 2003,
N'istorijski')
INSERT [dbo].[Filmovi] ([FilmID], [Naziv], [Godina], [Zanr]) VALUES (222, N'Mr. Bean',
2000, N'komedija')
INSERT [dbo].[Filmovi] ([FilmID], [Naziv], [Godina], [Zanr]) VALUES (333, N'Rambo 2',
1991, N'akcija')
INSERT [dbo].[Filmovi] ([FilmID], [Naziv], [Godina], [Zanr]) VALUES (444, N'Aleksandar
Veliki', 2005, N'istorijski')





Reenje:
261

// Konekcija.cs
class Konekcija
{
public static string kon = Properties.Settings.Default.BioskopConnectionString;
}
// frmRepertoar.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace Drugi_kolokvijum
{
public partial class frmRepertoar : Form
{
SqlConnection konekcija = new SqlConnection(Konekcija.kon);

public frmRepertoar1()
{
InitializeComponent();
groupBox1.Enabled = false;
groupBox2.Enabled = false;
groupBox3.Enabled = false;
}

private void Form1_Load(object sender, EventArgs e)
{
this.filmoviTableAdapter.Fill(this.bioskopDataSet.Filmovi);
}

private void button3_Click(object sender, EventArgs e)
{
if (dataGridView1.SelectedRows.Count > 0)
{
try
{
int index = dataGridView1.SelectedRows[0].Index;
int filmId = int.Parse(dataGridView1[0, index].Value.ToString());
string naziv = dataGridView1[1, index].Value.ToString();
int god = int.Parse(dataGridView1[2, index].Value.ToString());
string zanr = dataGridView1[3, index].Value.ToString();
filmoviTableAdapter.Delete(filmId, naziv, god, zanr);
dataGridView1.Rows.RemoveAt(index);
MessageBox.Show("uspesno obrisano");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
else
{
MessageBox.Show("niste uspeli da obrisete");
}
}

private void unosNovogFilmaToolStripMenuItem_Click(object sender, EventArgs e)
{
262

groupBox1.Enabled = true;
groupBox2.Enabled = true;
groupBox3.Enabled = false;
}

private void button1_Click(object sender, EventArgs e)
{
string s = "";
if (textBox1.Text != "" && textBox2.Text != "" && textBox3.Text != "")
{
if (radioButton1.Checked == true)
{
s = "Akcija";
}
if (radioButton2.Checked == true)
{
s = "Istorijski";
}
if (radioButton3.Checked == true)
{
s = "Drama";
}
if (radioButton4.Checked == true)
{
s = "Komedija";
}
filmoviTableAdapter.Insert(Convert.ToInt32(textBox1.Text), textBox2.Text,
Convert.ToInt32(textBox3.Text), s);
this.filmoviTableAdapter.Fill(this.bioskopDataSet.Filmovi);
}
else
{
MessageBox.Show("morate uneti sva polja");
}
}

private void button2_Click(object sender, EventArgs e)
{
textBox1.Text = textBox2.Text = textBox3.Text = "";
radioButton1.Checked = radioButton2.Checked = radioButton3.Checked =
radioButton4.Checked = false;
}

private void pretragaFilmovaToolStripMenuItem_Click(object sender, EventArgs e)
{
groupBox1.Enabled = false;
groupBox2.Enabled = false;
groupBox3.Enabled = true;

SqlDataAdapter dt = new SqlDataAdapter("select distinct zanr from filmovi",
konekcija);
DataTable td = new DataTable();
dt.Fill(td);
comboBox1.DataSource = td;
comboBox1.DisplayMember = "zanr";
}

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
richTextBox1.Clear();
konekcija.Open();

try
{
263

using (SqlCommand koman = new SqlCommand("select naziv from filmovi where
zanr=@zanr", konekcija))
{
koman.Parameters.Add(new SqlParameter("zanr", comboBox1.Text));
SqlDataReader rid = koman.ExecuteReader();
while (rid.Read())
{
richTextBox1.AppendText(rid.GetString(0));
richTextBox1.AppendText("\r\n");
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
} konekcija.Close();
}

private void izmeniFilmToolStripMenuItem_Click(object sender, EventArgs e)
{
DialogResult prom = MessageBox.Show("da li si siguran da zelis promenu",
"pitanje", MessageBoxButtons.YesNoCancel,
MessageBoxIcon.Question);
if (prom == DialogResult.Yes)
{
filmoviTableAdapter.Update(bioskopDataSet.Filmovi);
dataGridView1.Refresh();
}
else
{
filmoviTableAdapter.Fill(bioskopDataSet.Filmovi);
dataGridView1.Refresh();
}
}
}
}



264

IV grupa
A) (10 poena) Kreirati klasu Konekcija koja sadri statiko string polje, koje sadri
konekcioni string na bazu iji skript je dat u okviru Prodavnica.sql.
B) (6 poena) Napraviti formu pod nazivom frmSnizenje kao na slici 4.28.

Slika 4.28. Forma frmSnizenje

C) (10 poena) Prilikom uitavanja forme DataGridView kontrola prikazuje sve zapise iz
tabele Snizenje baze Prodavnica.
D) Implementirati meni Popusti koji sadri dva podmenija: Unos i Obrisi.
1. (2 poena) Izborom opcije Unos GroupBox pod nazivom Unos popusta postaje
dostupan za upis, dok GroupBox pod nazivom Prikazi po popustu postaje ne
dostupan za upis.
2. (15 poena) Klikom na dugme Unesi proverava se da li su ArtikalID, Naziv artikla,
Stara cena i Popust popunjeni.
i. Ako jesu u tabeli Snizenje u bazi Prodavnica se kreira novi zapis sa unetim
parametrima i korisniku se prikazuje MessageBox sa odgovarajuom porukom
i auriraju podaci u DataGridView kontroli.
ii. A ako nisu korisniku se prikazuje MessageBox sa odgovarajuom porukom.
3. (2 poena) Klikom na dugme Otkazi prazne se sve kontrole u okviru Unos
popusta GroupBox-a.
4. (15 poena) Izborom opcije Obrisi brie se selektovani red u DataGridView
kontroli i korisniku se prikazuje MessageBox sa odgovarajuom porukom.
E) Implementirati dugme Pretraga, koji GroupBox pod nazivom Prikazi po popustu ini
dostupnim za upis, a GroupBox pod nazivom Unos popusta postaje nedostupan.
265

1. (10 poena) U ComboBox-u se prikazuju sve razliite visine popusta za koje
postoje artikli u bazi.
2. (15 poena) Izborom nekog od njih prikazuju se nazivi artikla za koje je odobren
izabrani popust.
F) (15 poena) Implementirati konteksni meni Izmeni popust koji omoguava uvanje
uinjenih promena u DataGridView kontroli, uz prikaz MessageBox-a u kome treba
potvrditi uvanje promene, u suprotnom vratiti DataGridView na staru verziju.

Skript baze Prodavnica:
USE [Prodavnica]
GO
/****** Object: Table [dbo].[Snizenje] Script Date: 01/22/2013 01:30:18 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Snizenje]')
AND type in (N'U'))
DROP TABLE [dbo].[Snizenje]
GO
/****** Object: Table [dbo].[Snizenje] Script Date: 01/22/2013 01:30:18 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Snizenje]')
AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Snizenje](
[ArtikalID] [int] NOT NULL,
[Naziv] [nvarchar](50) NOT NULL,
[Stara_cena] [float] NOT NULL,
[Popust] [int] NOT NULL,
CONSTRAINT [PK_Snizenje] PRIMARY KEY CLUSTERED
(
[ArtikalID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
INSERT [dbo].[Snizenje] ([ArtikalID], [Naziv], [Stara_cena], [Popust]) VALUES (123,
N'Majica', 1000, 25)
INSERT [dbo].[Snizenje] ([ArtikalID], [Naziv], [Stara_cena], [Popust]) VALUES (147,
N'Bluza', 2000, 10)
INSERT [dbo].[Snizenje] ([ArtikalID], [Naziv], [Stara_cena], [Popust]) VALUES (258,
N'Haljina', 5000, 10)
INSERT [dbo].[Snizenje] ([ArtikalID], [Naziv], [Stara_cena], [Popust]) VALUES (456,
N'Suknja', 1500, 15)
INSERT [dbo].[Snizenje] ([ArtikalID], [Naziv], [Stara_cena], [Popust]) VALUES (789,
N'Carape', 500, 15)







266

Reenje:
// Konekcija.cs
class Konekcija
{
public static string konString=Properties.Settings.Default.ProdavnicaConnectionString;
}
// frmSnizenje.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Drugi_kolokvijum
{
public partial class frmSnizenje : Form
{
public frmSnizenje()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
this.snizenjeTableAdapter.Fill(this.prodavnicaDataSet.Snizenje);
}

private void unosToolStripMenuItem_Click(object sender, EventArgs e)
{
groupBox1.Enabled = true;
groupBox3.Enabled = false;
}

private void btnUnesi_Click(object sender, EventArgs e)
{
if (tbArtikalId.Text != "" && tbNazivArtikla.Text != "" && tbStaraCena.Text
!= "")
{
try
{
if (radioButton1.Checked != false)
{
snizenjeTableAdapter.Insert(Convert.ToInt32(tbArtikalId.Text),
tbNazivArtikla.Text,
Convert.ToDouble(tbStaraCena.Text), 15);

}
else if (radioButton2.Checked != false)
{
snizenjeTableAdapter.Insert(Convert.ToInt32(tbArtikalId.Text),
tbNazivArtikla.Text,
Convert.ToDouble(tbStaraCena.Text), 20);
}
else if (radioButton3.Checked != false)
{
267

snizenjeTableAdapter.Insert(Convert.ToInt32(tbArtikalId.Text),
tbNazivArtikla.Text,
Convert.ToDouble(tbStaraCena.Text), 25);
}
else
{
MessageBox.Show("Odaberite popust");
}

MessageBox.Show("Novi red je uspesno dodat");
snizenjeTableAdapter.Fill(prodavnicaDataSet.Snizenje);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
else
{
MessageBox.Show("Popunite sva polja");
}
}

private void btnOtkazi_Click(object sender, EventArgs e)
{
tbArtikalId.Text = "";
tbNazivArtikla.Text = "";
tbStaraCena.Text = "";
radioButton1.Checked = false;
radioButton2.Checked = false;
radioButton3.Checked = false;
}

private void obrisiToolStripMenuItem_Click(object sender, EventArgs e)
{
if (dataGridView1.SelectedRows.Count > 0)
{
int selIndex = dataGridView1.SelectedRows[0].Index;

try
{
int id = Convert.ToInt32(dataGridView1[0,selIndex].Value.ToString());
string naziv = dataGridView1[1, selIndex].Value.ToString();
double stara_cena = Convert.ToDouble(dataGridView1[2,
selIndex].Value.ToString());
int popust = Convert.ToInt32(dataGridView1[3,
selIndex].Value.ToString());
snizenjeTableAdapter.Delete(id,naziv,stara_cena,popust);
dataGridView1.Rows.RemoveAt(selIndex);
MessageBox.Show("Uspesno obrisano");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}

private void btnPretraga_Click(object sender, EventArgs e)
{
groupBox1.Enabled = false;
groupBox3.Enabled = true;


268

try
{
SqlDataAdapter da = new SqlDataAdapter("Select distinct popust from
snizenje", Konekcija.konString);
DataTable dt = new DataTable();
da.Fill(dt);
cbPopust.DataSource = dt;
cbPopust.DisplayMember = "Popust";
}

catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void cbPopust_SelectedIndexChanged(object sender, EventArgs e)
{
SqlConnection kon = new SqlConnection(Konekcija.konString);
SqlDataReader dr;
listBox1.Items.Clear();
kon.Open();
using (SqlCommand komanda = new SqlCommand("select naziv from snizenje where
popust=@Popust",kon))
{
SqlParameter par=new SqlParameter("Popust",
Convert.ToInt32(cbPopust.Text));
komanda.Parameters.Add(par);
dr=komanda.ExecuteReader();
while (dr.Read())
{
listBox1.Items.Add(dr[0].ToString());
}
}
kon.Close();
}

private void izmeniToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
DialogResult dr = MessageBox.Show("Da li ste sigurnio da zelite da
izvrsite izmene", "Izmena",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question);
if (dr == DialogResult.Yes)
{
snizenjeTableAdapter.Update(prodavnicaDataSet.Snizenje);
MessageBox.Show("Izmena uspesna");
dataGridView1.Refresh();
}
}
catch (Exception ex)
{

MessageBox.Show(ex.Message);
}
}
}
}


269

V grupa
A) (10 poena) Kreirati klasu Konekcija koja sadri statiko string polje, koje sadri
konekcioni string na bazu iji skript je dat u okviru Porez.sql.
B) (6 poena) Napraviti formu pod nazivom frmPoreskiObveznici kao na slici 4.29.

Slika 4.29. Froma frmPoreskiObveznici

C) (10 poena) Prilikom uitavanja forme DataGridView kontrola prikazuje sve zapise iz
tabele Obveznici baze Porez.
D) (15 poena) Implementirati da se klikom na dugme Obrisi firmu brie selektovani red u
DataGridView kontroli i korisniku se prikazuje MessageBox sa odgovarajuom porukom.
E) Implementirati meni Pravna lica koji sadri dva podmenija: Unos nove firme i
Pretraga firmi.
1. (2 poena) Izborom opcije Unos nove firme GroupBox pod nazivom Unos firmi
postaje dostupan za upis, dok GroupBox pod nazivom Prikazi po delatnosti
postaje ne dostupan za upis.
2. (15 poena) Klikom na dugme Ubaci proverava se da li su PIB, Naziv, Godina
osnivanja i Delatnost popunjeni.
i. Ako jesu u tabeli Obveznici u bazi Porez se kreira novi zapis sa unetim
parametrima i korisniku se prikazuje MessageBox sa odgovarajuom
porukom i auriraju podaci u DataGridView kontroli.
ii. A ako nisu korisniku se prikazuje MessageBox sa odgovarajuom porukom.
3. (2 poena) Klikom na dugme Resetuj prazne se sve kontrole u okviru Unos firmi
GroupBox-a.
270

4. Implementirati meni Pretraga firmi, koji GroupBox pod nazivom Prikazi po
delatnosti ini dostupnim za upis, a GroupBox pod nazivom Unos firmi postaje
nedostupan.
i. (10 poena) U ComboBox-u se prikazuju sve razliite delatnosti za koje
postoje firme u bazi.
ii. (15 poena) Izborom neke od njih prikazuje se lista sa nazivom firmi koje
se bave izabranom delatnou.
F) (15 poena) Implementirati konteksni meni Izmeni podatke koji omoguava uvanje
uinjenih promena u DataGridView kontroli, uz prikaz MessageBox-a u kome treba
potvrditi uvanje promene, u suprotnom vratiti DataGridView na staru verziju.

Skript baze Porez:
USE [Porez]
GO
/****** Object: Table [dbo].[Obveznici] Script Date: 01/22/2013 01:31:18 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Obveznici]')
AND type in (N'U'))
DROP TABLE [dbo].[Obveznici]
GO
/****** Object: Table [dbo].[Obveznici] Script Date: 01/22/2013 01:31:18 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id =
OBJECT_ID(N'[dbo].[Obveznici]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Obveznici](
[PIB] [int] NOT NULL,
[Naziv] [nvarchar](50) NOT NULL,
[Godina_osnivanja] [int] NOT NULL,
[Delatnost] [nvarchar](15) NOT NULL,
CONSTRAINT [PK_Obveznici] PRIMARY KEY CLUSTERED
(
[PIB] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
INSERT [dbo].[Obveznici] ([PIB], [Naziv], [Godina_osnivanja], [Delatnost]) VALUES (159,
N'ITHS', 2011, N'Obrazovna')
INSERT [dbo].[Obveznici] ([PIB], [Naziv], [Godina_osnivanja], [Delatnost]) VALUES (321,
N'ITS', 2008, N'Obrazovna')
INSERT [dbo].[Obveznici] ([PIB], [Naziv], [Godina_osnivanja], [Delatnost]) VALUES (654,
N'Maja', 2012, N'STR')
INSERT [dbo].[Obveznici] ([PIB], [Naziv], [Godina_osnivanja], [Delatnost]) VALUES (987,
N'ABC', 2010, N'SZR')





Reenje:
271

// Konekcija.cs
class Konekcija
{
public static string konString=Properties.Settings.Default.PorezConnectionString;
}
// frmPoreskiObveznici.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace Drugi_kolokvijum
{
public partial class frmPoreskiObveznici : Form
{
SqlConnection conn = new SqlConnection(Konekcija.konString);

public frmPoreskiObveznici()
{
InitializeComponent();
groupBoxUnosFirmi.Enabled = false;
groupBoxPrikaziPoDelatnosti.Enabled = false;
}

private void frmPoreskiObveznici_Load(object sender, EventArgs e)
{
this.obvezniciTableAdapter.Fill(this.porezDataSet.Obveznici);
}

private void buttonObrisiFirmu_Click(object sender, EventArgs e)
{
if (dataGridView1.SelectedRows.Count > 0)
{
int red = (dataGridView1.SelectedRows[0].Index);
int pib = int.Parse(dataGridView1[0, red].Value.ToString());
string naziv = dataGridView1[1, red].Value.ToString();
int godina = int.Parse(dataGridView1[2, red].Value.ToString());
string delatnost = dataGridView1[3, red].Value.ToString();
try
{
this.obvezniciTableAdapter.Delete(pib, naziv, godina, delatnost);
this.dataGridView1.Rows.RemoveAt(red);
MessageBox.Show("Red je obrisan");
}
catch (Exception ex)
{ MessageBox.Show(ex.ToString()); }
}
}

private void unosNoveFirmeToolStripMenuItem_Click(object sender, EventArgs e)
{
this.groupBoxUnosFirmi.Enabled = true;
this.groupBoxPrikaziPoDelatnosti.Enabled = false;
}

private void buttonUbaci_Click(object sender, EventArgs e)
{
272

if (textBoxPIB.Text != "" && textBoxNaziv.Text != "" &&
textBoxGodOsnivanja.Text != "")
{
string delatnost = "";
if (radioButtonSzr.Checked)
{
delatnost = "SZR";
}
else if (radioButtonStr.Checked)
{
delatnost = "STR";
}
else if (radioButtonProizvodnja.Checked)
{
delatnost = "Proizvodnja";
}
else if (radioButtonObrazovna.Checked)
{
delatnost = "Obrazovna";
}
try
{
this.obvezniciTableAdapter.Insert(Convert.ToInt32(textBoxPIB.Text),
textBoxNaziv.Text,
Convert.ToInt32(textBoxGodOsnivanja.Text), delatnost);
this.obvezniciTableAdapter.Fill(this.porezDataSet.Obveznici);
MessageBox.Show("Uspesno ste ubacili novu firmu");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
else
{
MessageBox.Show("Niste popunili sva polja");
}
}

private void buttonResetuj_Click(object sender, EventArgs e)
{
textBoxPIB.Clear();
textBoxNaziv.Clear();
textBoxGodOsnivanja.Clear();
radioButtonSzr.Checked = false;
radioButtonStr.Checked = false;
radioButtonProizvodnja.Checked = false;
radioButtonObrazovna.Checked = false;
}

private void pretragaPoFirmiToolStripMenuItem_Click(object sender, EventArgs e)
{
groupBoxUnosFirmi.Enabled = false;
groupBoxPrikaziPoDelatnosti.Enabled = true;
SqlDataAdapter da = new SqlDataAdapter("select distinct delatnost from
obveznici", conn);
DataTable dt = new DataTable();
da.Fill(dt);
comboBoxDelatnost.DataSource = dt;
comboBoxDelatnost.DisplayMember = "Delatnost";
}

private void comboBoxDelatnost_SelectedIndexChanged(object sender, EventArgs e)
{
273

this.richTextBox1.Clear();

try
{
conn.Open();
SqlCommand komanda = new SqlCommand("select Naziv from Obveznici where
Delatnost = @Delatnost", conn);
komanda.Parameters.Add(new SqlParameter("Delatnost",
comboBoxDelatnost.Text));
//MessageBox.Show(comboBoxDelatnost.Text);
SqlDataReader citaj = komanda.ExecuteReader();
while (citaj.Read())
{
richTextBox1.AppendText(citaj.GetString(0));
richTextBox1.AppendText("\r\n");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
conn.Close();
}
}

private void izmeniPodatkeToolStripMenuItem_Click(object sender, EventArgs e)
{
DialogResult dr = MessageBox.Show("Da li ste sigurni da zelite da
izmenite","Poruka",
MessageBoxButtons.OKCancel,
MessageBoxIcon.Question);
if (dr == DialogResult.OK)
try
{
{
this.obvezniciTableAdapter.Update(this.porezDataSet.Obveznici);
this.dataGridView1.Refresh();
MessageBox.Show("Izmene su sacuvane");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
else
{
dataGridView1.Refresh();
}
}

}
}


274

VI grupa
A) (10 poena) Kreirati klasu Konekcija koja sadri statiko string polje, koje sadri
konekcioni string na bazu iji skript je dat u okviru Takmicenje.sql.
B) (6 poena) Napraviti formu pod nazivom frmTakmicenje kao na slici 4.30.

Slika 4.30. Forma frmTakmicenje

C) (10 poena) Prilikom uitavanja forme DataGridView kontrola prikazuje sve zapise iz
tabele Timovi baze Takmicenje.
D) Implementirati meni Prijava timova koji sadri dva podmenija: Unos i Obrisi.
1. (2 poena) Izborom opcije Unos GroupBox pod nazivom Prijava tima postaje
dostupan za upis, dok GroupBox pod nazivom Prikazi po sportu postaje ne
dostupan za upis.
2. (15 poena) Klikom na dugme Unesi proverava se da li su TimID, Naziv, Grad i
Sport popunjeni.
i. Ako jesu u tabeli Timovi u bazi Takmicenje se kreira novi zapis sa unetim
parametrima i korisniku se prikazuje MessageBox sa odgovarajuom
porukom i auriraju podaci u DataGridView kontroli.
ii. A ako nisu korisniku se prikazuje MessageBox sa odgovarajuom porukom.
3. (2 poena) Klikom na dugme Otkazi prazne se sve kontrole u okviru Prijava
tima GroupBox-a.
4. (15 poena) Izborom opcije Obrisi brie se selektovani red u DataGridView
kontroli i korisniku se prikazuje MessageBox sa odgovarajuom porukom.
275

E) Implementirati dugme Pretraga, koji GroupBox pod nazivom Prikazi po sportu ini
dostupnim za upis, a GroupBox pod nazivom Prijava tima postaje nedostupan.
1. (10 poena) U ComboBox-u se prikazuju sve razliite vrste sporta za koje postoje
timovi u bazi.
2. (15 poena) Izborom nekog od njih prikazuju se nazivi timova koji se takmie u
izabranom sportu.
F) (15 poena) Implementirati konteksni meni Izmeni podatke o timu koji omoguava
uvanje uinjenih promena u DataGridView kontroli, uz prikaz MessageBox-a u kome
treba potvrditi uvanje promene, u suprotnom vratiti DataGridView na staru verziju.

Skript baze Takmicenje:
USE [Takmicenje]
GO
/****** Object: Table [dbo].[Timovi] Script Date: 01/22/2013 01:32:16 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Timovi]') AND
type in (N'U'))
DROP TABLE [dbo].[Timovi]
GO
/****** Object: Table [dbo].[Timovi] Script Date: 01/22/2013 01:32:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Timovi]')
AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Timovi](
[TimID] [int] NOT NULL,
[Naziv] [nvarchar](50) NOT NULL,
[Grad] [nvarchar](25) NOT NULL,
[Sport] [nvarchar](15) NOT NULL,
CONSTRAINT [PK_Timovi] PRIMARY KEY CLUSTERED
(
[TimID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
INSERT [dbo].[Timovi] ([TimID], [Naziv], [Grad], [Sport]) VALUES (111, N'Panter',
N'Beograd', N'fudbal')
INSERT [dbo].[Timovi] ([TimID], [Naziv], [Grad], [Sport]) VALUES (222, N'Lion',
N'Beograd', N'fudbal')
INSERT [dbo].[Timovi] ([TimID], [Naziv], [Grad], [Sport]) VALUES (333, N'Luk', N'Sabac',
N'rukomet')
INSERT [dbo].[Timovi] ([TimID], [Naziv], [Grad], [Sport]) VALUES (444, N'Munja',
N'Valjevo', N'odbojka')







276

Reenje:
// Konekcija.cs
class Konekcija
{
public static string cnn = Properties.Settings.Default.TakmicenjeConnectionString;
}
// frmTakmicenje.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace Takmicenje
{
public partial class Form1 : Form
{
SqlConnection konekcija = new SqlConnection(Konekcija.cnn);

public Form1()
{
InitializeComponent();
}

private void izmeniPodateOTimuToolStripMenuItem_Click(object sender, EventArgs e)
{
DialogResult dr = MessageBox.Show("Da li ste sigurni da zelite promene?",
"Poruka", MessageBoxButtons.YesNoCancel,
MessageBoxIcon.Question);
if (dr == DialogResult.Yes)
{
try
{
this.timoviTableAdapter.Update(this.takmicenjeDataSet.Timovi);

dataGridView1.Refresh();

MessageBox.Show("Uspesno ste izmenili");
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
}

private void Form1_Load(object sender, EventArgs e)
{
this.timoviTableAdapter.Fill(this.takmicenjeDataSet.Timovi);
}

private void unosToolStripMenuItem_Click(object sender, EventArgs e)
{
groupBox1.Enabled = true;
groupBox2.Enabled = false;
}


277

private RadioButton vratiIzabraniSport()
{
RadioButton rb = null;

if (rbFudbal.Checked)
rb = rbFudbal;
if (rbOdbojka.Checked)
rb = rbOdbojka;
if (rbRukomet.Checked)
rb = rbRukomet;
return rb;
}

private void buttonUnesi_Click(object sender, EventArgs e)
{
if (tbTimID.Text != "" && tbNaziv.Text != "" && tbGrad.Text != "" &&
vratiIzabraniSport() != null)
{
try
{
this.timoviTableAdapter.Insert(Convert.ToInt32(tbTimID.Text),
tbNaziv.Text, tbGrad.Text,
vratiIzabraniSport().Text);

MessageBox.Show("Uspesno ste uneli podatke");

this.timoviTableAdapter.Fill(this.takmicenjeDataSet.Timovi);
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
else
{
MessageBox.Show("Morate poputini sva polja");
}
}

private void buttonOtkazi_Click(object sender, EventArgs e)
{
tbTimID.Clear();
tbNaziv.Clear();
tbGrad.Clear();
}

private void buttonPretraga_Click(object sender, EventArgs e)
{
groupBox1.Enabled = false;
groupBox2.Enabled = true;

try
{
SqlDataAdapter da = new SqlDataAdapter("Select distinct Sport from
Timovi", Konekcija.cnn);

DataTable dt = new DataTable();

da.Fill(dt);

cmbSport.DataSource = dt;
cmbSport.DisplayMember = "Sport";
}

278

catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}

private void cmbSport_SelectedIndexChanged(object sender, EventArgs e)
{
lbTim.Items.Clear();

konekcija.Open();

using (SqlCommand komnada = new SqlCommand("Select Naziv from Timovi where
Sport=@Sport", konekcija))
{
komnada.Parameters.Add(new SqlParameter("Sport", cmbSport.Text));

SqlDataReader sdr = komnada.ExecuteReader();

while (sdr.Read())
{
lbTim.Items.Add(sdr.GetString(0));
lbTim.Items.Add("\r\n");
}
}
konekcija.Close();
}

private void obrisiToolStripMenuItem_Click(object sender, EventArgs e)
{
if (dataGridView1.SelectedRows.Count > 0)
{
int selekotvaniRed = dataGridView1.SelectedRows[0].Index;

int timID = int.Parse(dataGridView1[0, selekotvaniRed].Value.ToString());
string naziv = dataGridView1[1, selekotvaniRed].Value.ToString();
string grad = dataGridView1[2, selekotvaniRed].Value.ToString();

try
{
this.timoviTableAdapter.Delete(timID, naziv, grad, "");

dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[0].Index);

MessageBox.Show("Uspesno ste izbrisali");
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
}
}
}



279

3. Zadaci sa I kolokvijuma kolske 2013/2014. godine
I grupa
A) (25 poena) Kreirati klasu Korpa sa privatnim atributima: naziv (string), jedCena
(double), kolicina (int), cena (double), ukupno (static double). Propertije polja kreirati
po potrebi. Kreirati parametarski konstruktor koji kao ulazne parametre dobija naziv,
jedininu cenu i koliinu, setuje odgovarajue atribute na te vrednosti, izraunava cenu
(cena=jedCena*kolicina) i uveava ukupnu vrednost svih artikala (ukupno+=cena).
Kreirati javnu static metodu Storniraj koja umanjuje vrednost ukupno za cenu objekta
koji dobija kao parameter (void Storniraj(Korpa k)). Override-ovati metodu ToString()
tako da vraa podatke o artiklu u obliku:
Naziv: Mleko Jed. cena: 76 Kolicina: 3 Cena: 228

B) (2 poena) Napraviti formu pod nazivom frmKasa kao na slici 4.31.
(Kontrole: TextBox, ComboBox, Button)
C) (2 poena) Napraviti formu pod nazivom frmRacun kao na slici 4.32.
(Kontrole su: RichTextBox, Button)

Slika 4.31 Froma frmKasa Slika 4.32. Forma frmRacun


D) Obezbediti sledee funkcionalnosti za formu frmKasa:
1. (20 poena) Klik na dugme Naruci, proverava da li su
sva polja popunjena i ako jesu ubacuje artikal sa
unetim podacima u generiki stek artikala i
prikazuje odgovarajui MessageBox sa porukom o
uspehu i resetuje sve kontrole na formi. Ukoliko
nisu sva polja popunjeno prikazuje errorProvider
kontrolu uz dugme Naruci uz odgvarajuu poruku.
Koristiti try catch blok.
2. (2 poena) Klik na dugme Odbaci resetuje sve kontrole na formi.
3. Klik na dugme Prikazi racun otvara SaveFile dijalog, gde korisnik bira naziv i
lokaciju smetanja txt fajla.
280

i. (20 poena) Puni fajl sa podacima iz generikog steka i otvara formu
frmRacun u kojoj se prikazuje spisak svih naruenih artikala i njihovu
ukupnu cenu (pogledati primer na slici 4.32). Koristiti try catch blok.
(Pomo: Koristiti Load dogaaj za formu frmRacun u kojoj se puni lista iz
fajla.)
ii. (10 poena) Obezbediti da se SaveFile dijalog otvara samo jednom.
Odnosno, kada korisnik jednom izabere lokaciju i naziv fajla svaki sledei
put klikom na dugme Prikazi racun nee se otvarati SaveFile dijalog, ve
direktno forma frmRacun, na kojem se prikazuje aurirana lista. (Pomo:
Kreirati static klasu u kojoj e se uvati naziv fajla. U formi frmKasa uvesti
pomonu promenljivu koja e oznaavati da li je raun ve kreiran ili ne.)
E) Obezbediti sledee funkcionalnosti za formu frmRacun:
1. (15 poena) Klik na dugme Storniraj poslednji
brie poslednji artikal sa spiska, prikazuje
odgovarajui MessageBox sa porukom o
uspehu i zatvara formu.



2. (4 poena) Klik na dugme Zatvori prikazuje odgovarajui MessageBox sa porukom
(kao na slici pored). Ukoliko korisnik izabere
No zatvoriti aplikaciju, a ukoliko izabere Yes
zatvoriti formu.


Reenje:
// Korpa.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Kupovina
{
class Korpa
{
private string naziv;
private double jedCena;
private int kolicina;
private double cena;
private static double ukupno = 0;

public double Cena
{
get { return this.cena; }
}

public static double Ukupno
{
get { return ukupno; }
281

}

public static void Storniraj(Korpa k)
{
ukupno -= k.cena;
}

public Korpa ()
{
this.naziv = "";
this.jedCena = 0;
this.kolicina = 0;
this.cena = 0;
}

public Korpa(string n, double jc, int k)
{
this.naziv = n;
this.jedCena = jc;
this.kolicina = k;
this.cena = this.jedCena * this.kolicina;
ukupno += this.cena;
}

public override string ToString()
{
return "Naziv: " + this.naziv + "\t Jed. cena: " + this.jedCena + "\t
Kolicina: " + this.kolicina + "\t Cena: " + this.cena + "\n";
}
}
}

// Racun.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Kupovina
{
static class Racun
{
private static string nazivFajla="";

public static string NazivFajla
{
get;
set;
}
}
}


282

// frmKasa.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO; // dodato

namespace Kupovina
{
public partial class frmKasa : Form
{
private Korpa artikal;
private Stack<Korpa> roba;
private bool postojiRacun = false;

public frmKasa()
{
InitializeComponent();
roba = new Stack<Korpa>();
}

private void resetuj()
{
tbNaziv.Text = "";
tbCena.Text = "";
cbKolicina.Text = "";
}

private void btnOdbaci_Click(object sender, EventArgs e)
{
resetuj();
}

private void btnNaruci_Click(object sender, EventArgs e)
{
double cena;
int kol = 0;
try
{
if ((double.TryParse(tbCena.Text, out cena)) &&
(int.TryParse(cbKolicina.Text, out kol)) && (tbNaziv.Text != ""))
{
errGreska.Clear();
artikal = new Korpa(tbNaziv.Text, cena, kol);
roba.Push(artikal);
MessageBox.Show("Artikal je uspesno narucen", "Info",
MessageBoxButtons.OK, MessageBoxIcon.Information);
resetuj();
}
else
{
errGreska.SetError(btnNaruci, "Sva polja su obavezna");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
283

private void btnPrikaziRacun_Click(object sender, EventArgs e)
{
frmRacun frm = new frmRacun();
try
{
if (!postojiRacun)
{
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
Racun.NazivFajla = saveFileDialog1.FileName;
postojiRacun = true;
}
}

StreamWriter sw = new StreamWriter(Racun.NazivFajla);
sw.WriteLine("Spisak artikala");
sw.WriteLine();
foreach (Korpa k in roba)
{
sw.WriteLine(k.ToString());
sw.WriteLine();
}
sw.WriteLine("UKUPNO: " + Korpa.Ukupno.ToString());
sw.Close();
if (DialogResult.OK == frm.ShowDialog())
{
artikal = roba.First();
Korpa.Storniraj(artikal);
roba.Pop();
MessageBox.Show("Poslednji artikal uspesno storniran", "Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}

// frmRacun.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO; // dodato

namespace Kupovina
{
public partial class frmRacun : Form
{
public frmRacun()
{
InitializeComponent();
rtbRacun.Clear();
}

284

private void frmRacun_Load(object sender, EventArgs e)
{
StreamReader sr = new StreamReader(Racun.NazivFajla);

string linija = "";

while ((linija = sr.ReadLine()) != null)
{
rtbRacun.AppendText(linija);
rtbRacun.AppendText("\n");
}

sr.Close();
}

private void btnZatvori_Click(object sender, EventArgs e)
{
if (DialogResult.No == MessageBox.Show("Da li zelis da nastavis sa
kupovinom", "Nastavak kupovine", MessageBoxButtons.YesNo,
MessageBoxIcon.Question))
{
Application.Exit();
}
else
{
this.Close();
}
}
}
}


285

II grupa
A) (25 poena) Kreirati klasu Ucesnik sa privatnim atributima: ime (string), status (string
moe biti: student i nije student), kotizacija (double), ukupno (static double). Propertije
polja kreirati po potrebi. Kreirati parametarski konstruktor koji kao ulazne parametre
dobija ime i status, setuje odgovarajue atribute na te vrednosti, izraunava kotizaciju
(kotizacija je 0 za student, a za sve ostale 1000,00 din ) i uveava ukupnu vrednost
svih kotizacija (ukupno+=kotizacija). Kreirati javnu metodu Izbaci koja umanjuje
vrednost ukupno za kotizaciju objekta koji poziva datu metodu (void Izbaci()).
Override-ovati metodu ToString() tako da vraa podatke o artiklu u obliku:
Ime i prezime: Marija Kostic | Status: student | Kotizacija: 0 dinara.
B) (2 poena) Napraviti formu pod nazivom frmPrijava kao na slici 4.33.
(Kontrole: TextBox, RadioButton, Button)
C) (2 poena) Napraviti formu pod nazivom frmSpisak kao na slici 4.34.
(Kontrole su: ListBox, Button)





Slika 4.33. Forma frmPrijava Slika 4.34. Forma frmSpisak


D) Obezbediti sledee funkcionalnosti za formu frmPrijava:
1. (20 poena) Klik na dugme Potvrdi, proverava da li
je polje za ime popunjeno i ako jeste ubacuje
uesnika sa unetim podacima u generiki red
uesnika i prikazuje odgovarajui MessageBox sa
porukom o uspehu i resetuje sve kontrole na
formi. Ukoliko ime nije popunjeno setuje
errorProvider kontrolu na odgvarajuu vrednost.
Koristiti try catch blok.
2. (2 poena) Klik na dugme Odustani resetuje sve kontrole na formi.
3. Klik na dugme Prikazi spisak otvara SaveFile dijalog, gde korisnik bira naziv i
lokaciju smetanja txt fajla.
i. (20 poena) Puni fajl sa podacima iz generikog reda i otvara formu
frmSpisak u kojoj se prikazuje spisak svih prijavljenih uesnika i njihova
286

ukupna kotizacija (pogledati primer na slici 4.34). Koristiti try catch blok.
(Pomo: Koristiti Load dogaaj za formu frmSpisak u kojoj se puni lista iz
fajla.)
ii. (10 poena) Obezbediti da se SaveFile dijalog otvara samo jednom.
Odnosno, kada korisnik jednom izabere lokaciju i naziv fajla svaki sledei
put klikom na dugme Prikazi spisak nee se otvarati SaveFile dijalog, ve
direktno forma frmSpisak, na kojem se prikazuje aurirana lista. (Pomo:
Kreirati static klasu u kojoj e se uvati naziv fajla. U formi frmPrijava
uvesti pomonu promenljivu koja e oznaavati da li je spisak ve kreiran
ili ne.)
E) Obezbediti sledee funkcionalnosti za formu frmSpisak:
1. (15 poena) Klik na dugme Izbaci prvog brie prvog
uesnika sa spiska, prikazuje odgovarajui
MessageBox sa porukom o uspehu i zatvara formu.



2. (4 poena) Klik na dugme Zatvori prikazuje odgovarajui MessageBox sa porukom
(kao na slici pored). Ukoliko korisnik
izabere No zatvoriti aplikaciju, a ukoliko
izabere Yes zatvoriti formu.



Reenje:
// Ucesnik.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Kongres
{
class Ucesnik
{
private string ime;
private string status;
private double kotizacija;
private static double ukupno;

public static double Ukupno
{
get { return ukupno; }
}

public double Kotizacija
{
get { return this.kotizacija; }
}
287

private string vratiStatus()
{
string pom;

if (status == "DA")
pom = "student";
else
pom = "nije student";

return pom;
}

public Ucesnik()
{
this.ime = "";
this.status = "";
this.kotizacija = 0;

ukupno += this.kotizacija;
}

public Ucesnik(string i, string s)
{
this.ime = i;
this.status = s;

if (this.status == "DA")
this.kotizacija = 0;
else this.kotizacija = 1000;

ukupno += this.kotizacija;
}

public void Izbaci()
{
ukupno -= this.kotizacija;
}

public override string ToString()
{
return "Ime i prezime: " + this.ime + " | Status: " + vratiStatus() + " |
Kotizacija: " + this.kotizacija + " dinara.\n";
}
}
}
// Fajl.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Kongres
{
class Fajl
{
private static string nazivFajla;
public static string NazivFajla
{ get; set; }
}
}

288

// frmPrijava.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace Kongres
{
public partial class frmPrijava : Form
{
Ucesnik ucesnik;
Stack<Ucesnik> ucesnici;
private bool postojiSpisak = false;

public frmPrijava()
{
InitializeComponent();
ucesnici = new Stack<Ucesnik>();
}

private void resetuj()
{
tbIme.Clear();
tbKotizacija.Text = "0,00";
rbDa.Checked = true;
}

private void btnOdustani_Click(object sender, EventArgs e)
{
resetuj();
}

private string vratiStatus()
{
string status;
if (rbDa.Checked)
status = "DA";
else status = "NE";
return status;
}

private void racunajKotizaciju()
{
if (vratiStatus() == "NE")
tbKotizacija.Text = "1000,00";
else tbKotizacija.Text = "0,00";
}

private void btnPotvrdi_Click(object sender, EventArgs e)
{
try
{
if (tbIme.Text != "")
{
errGreska.Clear();
ucesnik = new Ucesnik(tbIme.Text, vratiStatus());
ucesnici.Push(ucesnik);
289

MessageBox.Show("Podaci su uspesno uneti", "Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Information);
resetuj();
}
else
{
MessageBox.Show("Niste popunili ime i prezime", "Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Information);
errGreska.SetError(tbIme, "Unesite ime");
tbIme.Focus();
}
}
catch (Exception ex)
{
MessageBox.Show("Doslo je do greske: " + ex.Message, "Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

private void rbNe_CheckedChanged(object sender, EventArgs e)
{ racunajKotizaciju(); }

private void rbDa_CheckedChanged(object sender, EventArgs e)
{ racunajKotizaciju(); }

private void btnPrikaziSpisak_Click(object sender, EventArgs e)
{
try
{
if (!postojiSpisak)
{
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
Fajl.NazivFajla = saveFileDialog1.FileName;
postojiSpisak = true;
}
}
StreamWriter sw = new StreamWriter(Fajl.NazivFajla);
foreach (Ucesnik u in ucesnici)
sw.WriteLine(u.ToString());
sw.WriteLine("Ukupna kotizacija: " + Ucesnik.Ukupno + "\r\n");
sw.Close();

frmSpisak frm = new frmSpisak();
if (frm.ShowDialog() == DialogResult.OK)
{
Ucesnik u = new Ucesnik();
u = ucesnici.Pop();
u.Izbaci();
MessageBox.Show("Prvi ucesnik izbrisan!", "Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (Exception ex)
{
MessageBox.Show("Doslo je do greske: " + ex.Message, "Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}


290

// frmSpisak.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace Kongres
{
public partial class frmSpisak : Form
{
public frmSpisak()
{
InitializeComponent();
lstSpisak.Items.Clear();
napuniListu();
}

private void napuniListu()
{
StreamReader sr = new StreamReader(Fajl.NazivFajla);

string linija = "";

while ((linija = sr.ReadLine()) != null)
{
lstSpisak.Items.Add(linija);
}

sr.Close();
}

private void btnZatvori_Click(object sender, EventArgs e)
{
if (DialogResult.No == MessageBox.Show("Da li zelis da nastavis sa unosom
novih ucesnika", "Nastavak unosa",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question))
{
Application.Exit();
}
else
{
this.Close();
}
}
}
}



291

III grupa
A) (25 poena) Kreirati klasu Student sa privatnim atributima: rb (int), ime (string), index
(string), predmet (string), ukupanBroj (static int). Propertije polja kreirati po potrebi.
Kreirati parametarski konstruktor koji kao ulazne parametre dobija ime, index i
predmete i setuje odgovarajue atribute na te vrednosti, uveava ukupan broj
studenata za 1 i setuje polje rb na njega. Kreirati javnu static metodu Izbaci koja
umanjuje vrednost ukupnog broja studenata za 1 i umanjuje redne brojeve studenata
za 1 za sve objekte u listi koju dobija kao parametar (void Izbaci(List<Student>)).
Override-ovati metodu ToString() tako da vraa podatke o studentu u obliku:
1. Ime i prezime: Strahinja Vidic Index: 78/12 Predmeti: Bezbednost e-poslovanja;
Racunarske mreze;
B) (2 poena) Napraviti formu pod nazivom frmIzborni kao na slici 4.35.
(Kontrole: TextBox, CheckBox ili CheckedListBox, Button)
C) (2 poena) Napraviti formu pod nazivom frmPrijavljeni kao na slici 4.36.
(Kontrole su: RichTextBox, Button)

Slika 4.35. Forma frmIzborni Slika 4.36. Forma frmPrijavljeni

D) Obezbediti sledee funkcionalnosti za formu frmIzborni:
1. (20 poena) Klik na dugme Prijavi, proverava da li su
sva polja popunjena (obavezna su 2 izborna
predmeta) i ako jeste ubacuje studenta sa unetim
podacima u generiku listu na poslednju poziciju i
prikazuje odgovarajui MessageBox sa porukom o
uspehu i resetuje sve kontrole na formi. Ukoliko nije
sve popunjeno vezuje errorProvider kontrolu za
dugme prijavi uz odgovarajuu poruku. Koristiti try
catch blok.
2. (2 poena) Klik na dugme Resetuj resetuje sve kontrole na formi.




292

3. Klik na dugme Stampaj otvara MessageBox (slika pored).
i. (20 poena) Ukoliko je fajl ve kreiran otvara
OpenFile dijalog sa nazivom fajla koji je korisnik
uneo prilikom kreiranja spiska. Puni fajl sa
podacima iz generike liste i otvara formu
frmSpisak u kojoj se prikazuje spisak svih
prijavljenih studenata (pogledati primer na slici
4.36). Koristiti try catch blok. (Pomo: Koristiti
Load dogaaj za formu frmPrijavljeni u kome se
puni RichTextBox kontrola iz fajla.)
ii. (10 poena) Ukoliko fajl nije kreiran otvara se SaveFile dijalog. Kada korisnik
jednom izabere lokaciju i naziv fajla to se pamti i prikazuje u OpenFile
dijalogu u FileName polju. (Pomo: Kreirati static klasu u kojoj e se uvati
naziv fajla. U formi frmIzborni uvesti pomonu promenljivu koja e oznaavati
da li je fajl ve kreiran ili ne.)
E) Obezbediti sledee funkcionalnosti za formu frmPrijavljeni:
1. (15 poena) Klik na dugme Izbaci prvog studenta
brie prvog studenta sa spiska, prikazuje
odgovarajui MessageBox sa porukom o uspehu i
zatvara formu.


2. (4 poena) Klik na dugme Izadji prikazuje odgovarajui MessageBox sa porukom
(kao na slici pored). Ukoliko korisnik izabere No zatvoriti aplikaciju, a ukoliko
izabere Yes zatvoriti formu.



Reenje:
// Student.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Izborni_predmeti
{
class Student
{
private string ime;
private string index;
private string predmeti;
private int rb;
private static int ukupanBroj = 0;

293

public static int RedniBroj
{ get; set; }

public Student()
{
this.ime = "";
this.index = "";
this.predmeti = "";
this.rb = 0;
}

public Student(string ime, string i, string pr)
{
this.ime = ime;
this.index = i;
this.predmeti = pr;
ukupanBroj++;
this.rb = ukupanBroj;
}

public static void Izbaci(List<Student> listaStudenata)
{
ukupanBroj--;
foreach (Student stud in listaStudenata)
stud.rb--;
}

public override string ToString()
{
return this.rb + ". Ime i prezime: " + this.ime + "\tIndex: " + this.index
+ "\tPredmeti: " + this.predmeti + "\r\n";
}
}
}

// Fajl.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Izborni_predmeti
{
class Fajl
{
private static string imeFajla;
public static string ImeFajla
{
get;
set;
}
}
}






294

// frmIzborni.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace Izborni_predmeti
{
public partial class frmIzborni : Form
{
Student s;
List<Student> listaPrijava;

public frmIzborni()
{
InitializeComponent();
listaPrijava = new List<Student>();
}

void isprazniPredmete()
{
cbAnaliza.Checked = false;
cbBaze.Checked = false;
cbBezbednost.Checked = false;
cbMreze.Checked = false;
}

private void resetuj()
{
tbIme.Text = "";
tbIndex.Text = "";
isprazniPredmete();
}

private int brojPredmeta()
{
int broj = 0;
if (cbAnaliza.Checked) broj++;
if (cbBaze.Checked) broj++;
if (cbBezbednost.Checked) broj++;
if (cbMreze.Checked) broj++;
return broj;
}

private string vratiPredmete()
{
string pom = "";
if (cbAnaliza.Checked) pom += cbAnaliza.Text + "; ";
if (cbBaze.Checked) pom += cbBaze.Text + "; ";
if (cbBezbednost.Checked) pom += cbBezbednost.Text + "; ";
if (cbMreze.Checked) pom += cbMreze.Text + ";";
return pom;
}

private void btnResetuj_Click(object sender, EventArgs e)
{
resetuj();
}
295

private void btnPrijavi_Click(object sender, EventArgs e)
{
try
{
if (tbIme.Text != "" && tbIndex.Text != "" && brojPredmeta() == 2)
{
errGreska.Clear();
s = new Student(tbIme.Text, tbIndex.Text, vratiPredmete());
listaPrijava.Add(s);
MessageBox.Show("Uspesna prijava", "Info", MessageBoxButtons.OK,
MessageBoxIcon.Information);
resetuj();
}
else
{
errGreska.SetError(btnPrijavi, "Sva polja su obavezna uz 2 izabrana
predmeta");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void napuni()
{
frmPrijavljeni frm = new frmPrijavljeni();
try
{
StreamWriter sw = new StreamWriter(Fajl.ImeFajla);
foreach (Student s in listaPrijava)
{
sw.WriteLine(s.ToString());
}
sw.Close();
if (DialogResult.OK == frm.ShowDialog())
{
listaPrijava.RemoveAt(0);
Student.Izbaci(listaPrijava);
MessageBox.Show("Prvi student je uspesno izbrisan", "Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void btnStampaj_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Da li je spisak vec kreiran", "Provera",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) ==
DialogResult.Yes)
{
openFileDialog1.FileName = Fajl.ImeFajla;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
napuni();
}
}


296

else
{
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
Fajl.ImeFajla = saveFileDialog1.FileName;
napuni();
}
}
}
}
}

// frmPrijavljeni.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace Izborni_predmeti
{
public partial class frmPrijavljeni : Form
{
public frmPrijavljeni()
{
InitializeComponent();
}

private void frmPrijavljeni_Load(object sender, EventArgs e)
{
rtbSpisak.Clear();

StreamReader sr = new StreamReader(Fajl.ImeFajla);

string linija = "";

while ((linija = sr.ReadLine()) != null)
{
rtbSpisak.AppendText(linija);
rtbSpisak.AppendText("\r\n");
}

sr.Close();
}

private void btnIzadji_Click(object sender, EventArgs e)
{
DialogResult rez = MessageBox.Show("Da li zelis da nastavis sa unosom
izbornih predmeta", "Jos unosa", MessageBoxButtons.YesNo,
MessageBoxIcon.Asterisk);
switch (rez)
{
case DialogResult.Yes: this.Close(); break;
case DialogResult.No: Application.Exit(); break;
}
}
}
}
297

IV grupa
A) (25 poena) Kreirati klasu Artikli sa privatnim atributima: sifra (int), naziv (string),
vrednost (double), popust (int), novaVrednost (double). Propertije polja kreirati po
potrebi. Kreirati parametarski konstruktor koji kao ulazne parametre dobija ifru, naziv,
vrednost i popust, setuje odgovarajue atribute na te vrednosti i izraunava novu
vrednost umanjujui vrednost artikla za popust (novaVrednost=(100-p)*vrednost/100).
Kreirati javnu static metodu Ukupno koja izraunava i vraa ukupnu vrednost svih
artikala na popustu za sve objekte u listi koju dobija kao parametar (double
Ukupno(List<Artikli>)). Override-ovati metodu ToString() tako da vraa podatke o
artiklu u obliku:
Sifra: 5678 Naziv: Koka kola Vrednost: 109Popust: 15% Nova vrednost: 92,65
B) (2 poena) Napraviti formu pod nazivom frmUnos kao na slici 4.37.
(Kontrole: MaskedTextBox za ifru (Mask=9999), NumericUpDown za popust koji moe
biti 10, 15 ili 20%, TextBox, Button)
C) (2 poena) Napraviti formu pod nazivom frmPrikaz kao na slici 4.38.
(Kontrole su: ListBox, Button)

Slika 4.37. Forma frmUnos Slika 4.38. Forma frmPrikaz

D) Obezbediti sledee funkcionalnosti za formu frmUnos:
1. (20 poena) Klik na dugme Upisi, proverava da li su
sva polja popunjena i ako jesu ubacuje artikal sa
unetim podacima u generiku listu na prvu poziciju i
prikazuje odgovarajui MessageBox sa porukom o
uspehu i resetuje sve kontrole na formi. Ukoliko nije
sve popunjeno vezuje errorProvider kontrolu za
dugme prijavi uz odgovarajuu poruku. Koristiti try
catch blok. Za MaskedTextBox koristiti dogaaj
MaskInputRejected koji prikazuje odgovarajui
MessageBox u sluaju unosa bilo kog znaka sem
cifre.

2. (2 poena) Klik na dugme Obrisi resetuje sve kontrole na formi.

298

3. Klik na dugme Pregled otvara MessageBox (slika pored).
i. (20 poena) Ukoliko je fajl ve kreiran otvara OpenFile dijalog sa nazivom
fajla koji je korisnik uneo prilikom kreiranja
spiska. Puni fajl sa podacima iz generike liste i
otvara formu frmPrikaz u kojoj se prikazuje
spisak svih artikala na popustu (pogledati primer
na slici 4.38). Koristiti try catch blok. (Pomo:
Koristiti Load dogaaj za formu frmPrikaz u
kome se puni ListBox kontrola iz fajla.)
ii. (10 poena) Ukoliko fajl nije kreiran otvara se SaveFile dijalog. Kada
korisnik jednom izabere lokaciju i naziv fajla to se pamti i prikazuje u
OpenFile dijalogu u FileName polju. (Pomo: Kreirati static klasu u kojoj e
se uvati naziv fajla. U formi frmUnos uvesti pomonu promenljivu koja e
oznaavati da li je fajl ve kreiran ili ne.)
E) Obezbediti sledee funkcionalnosti za formu frmPrikaz:
1. (15 poena) Klik na dugme Izbaci poslednji brie
poslednji artikal sa spiska, prikazuje odgovarajui
MessageBox sa porukom o uspehu i zatvara formu.


2. (4 poena) Klik na dugme Kraj prikazuje odgovarajui MessageBox sa porukom
(kao na slici pored). Ukoliko korisnik izabere No
zatvoriti aplikaciju, a ukoliko izabere Yes zatvoriti
formu.


Reenje:
// Artikli.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Popusti
{
class Artikli
{
private int sifra;
private string naziv;
private double vrednost;
private int popust;
private double novaVrednost;

public static double Ukupno(List<Artikli> lista)
{
double pom = 0;
299

foreach (Artikli a in lista)
pom += a.novaVrednost;
return pom;
}

public Artikli()
{
this.sifra = 0;
this.naziv = "";
this.vrednost = 0;
this.popust = 0;
this.novaVrednost = 0;
}

public Artikli(int s, string n, double v, int p)
{
this.sifra = s;
this.naziv = n;
this.vrednost = v;
this.popust = p;
this.novaVrednost = (100 - p) * v / 100;
}

public override string ToString()
{
return "Sifra: " + this.sifra + "\tNaziv: " + this.naziv + "\tVrednost: " +
this.vrednost + "\tPopust: " + this.popust + "%\tNova vrednost: " +
this.novaVrednost + "\r\n";
}
}
}
// Snizenje.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Popusti
{
class Snizenje
{
private static string fajl;
public static string Fajl
{ get; set; }
}
}
// frmUnos.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace Popusti
{
public partial class frmUnos : Form
300

{
Artikli artikal;
List<Artikli> lista;

public frmUnos()
{
InitializeComponent();
lista = new List<Artikli>();
}

void resetuj()
{
tbNaziv.Text = "";
mtbSifra.Text = "";
tbVrednost.Text = "";
nudPopust.Value = 10;
}

private void btnObrisi_Click(object sender, EventArgs e)
{
resetuj();
}

private void mtbSifra_MaskInputRejected(object sender, MaskInputRejectedEventArgs e)
{
MessageBox.Show("Sifra se sastoji od 4 cifre!", "Napomena",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
}

private void btnUpisi_Click(object sender, EventArgs e)
{
try
{
if (mtbSifra.Text != "" && tbNaziv.Text != "" && tbVrednost.Text != "")
{
errGreska.Clear();
artikal = new Artikli(Convert.ToInt32(mtbSifra.Text), tbNaziv.Text,
Convert.ToDouble(tbVrednost.Text),
Convert.ToInt32(nudPopust.Value));
lista.Insert(0, artikal);
MessageBox.Show("Artikal je uspesno unet", "Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Information);
resetuj();
}
else
{
errGreska.SetError(btnUpisi, "Sva polja moraju biti popunjena");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void napuni()
{
StreamWriter sw = new StreamWriter(Snizenje.Fajl);
sw.WriteLine("Spisak artikala na popustu:\r\n");
foreach (Artikli a in lista)
sw.WriteLine(a.ToString());
sw.WriteLine("Ukupna vrednost svih artikala na popustu je " +
Artikli.Ukupno(lista).ToString());
sw.Close();
301


frmPrikaz frm = new frmPrikaz();
if (frm.ShowDialog() == DialogResult.OK)
{
lista.RemoveAt(lista.Count - 1);
MessageBox.Show("Izbacen je poslednji artikal", "Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}

private void btnPregled_Click(object sender, EventArgs e)
{
try
{
if (MessageBox.Show("Da li je spisak vec kreiran", "Info",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) ==
DialogResult.Yes)
{
openFileDialog1.FileName = Snizenje.Fajl;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
napuni();
}
}
else
{
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
Snizenje.Fajl = saveFileDialog1.FileName;
napuni();
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}

// frmPrikaz.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace Popusti
{
public partial class frmPrikaz : Form
{
public frmPrikaz()
{
InitializeComponent();
}

302

private void frmPrikaz_Load(object sender, EventArgs e)
{
listBox1.Items.Clear();
StreamReader sr = new StreamReader(Snizenje.Fajl);
string linija;
while ((linija=sr.ReadLine())!=null)
listBox1.Items.Add(linija);
sr.Close();
}

private void btnKraj_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Da li zelis da nastavis sa unosom", "Nastavak unosa",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) ==
DialogResult.Yes)
{
this.Close();
}
else
{
Application.Exit();
}
}
}
}




303

4. Zadaci sa II kolokvijuma kolske 2013/2014. godine
I grupa
A) (10 poena) Kreirati bazu Letovanje koja sadri dve povezane tabele (Rezervacija i
Usluga) iji su opisi dati. Popuniti sa par proizvoljnih zapisa obe tabele.


B) (5 poena) Napraviti formu kao na slici 4.39.

Slika 4.39. Izlazni ekran forme

C) (10 poena) Prilikom uitavanja forme DataGridView kontrola prikazuje sve zapise iz
tabele Rezervacija baze Letovanje. Kolonu Tip_usluge prikazati kao ComboBox, u
kome se prikazuje opis usluge. Ispisuje se i ukupan broj rezervacija u odgovarajuoj
TextBox kontroli na formi.
D) (10 poena) Prilikom uitavanja forme ispisuje se i ukupan broj razliitih tipova usluga
koje postoje u bazi (tabela Usluga baza Letovanje), u TextBox-u u okviru GropuBox-
a Nova usluga.
E) (15 poena) Selektovanjem nekog reda iz DataGridView kontrole u ListBox-u se prikazuje
sadraj tog reda (detalji rezervacije). Videti sliku.
F) (10 poena) Implementirati da klikom na dugme Snimi GroupBox pod nazivom Nova
usluga postaje nedostupan za upis i snimaju se sve promene (izmena i dodavanje
novog zapisa) nainjene u DataGridView kontroli, aurira baza i korisniku se prikazuje
MessageBox sa odgovarajuom porukom. Aurira se ukupan broj rezervacija.
304

G) (15 poena) Implementirati meni Usluga koji sadri podmeni Unos nove usluge
Izborom opcije Unos nove usluge GroupBox pod nazivom Nova usluga postaje
dostupan za upis. TextBox kontrole ne smeju biti prevuene iz tipiziranog DataSet-a.
Klikom na dugme Ubaci proverava se da li su polja za UslugaID i Opis usluge
popunjeni.
1. Ako jesu u tabeli Usluga u bazi Letovanje se kreira novi zapis sa unetim
parametrima i korisniku se prikazuje MessageBox sa odgovarajuom porukom i
auriraju podaci u DataGridView kontroli. Aurira se i ukupan broj tipova
usluga.
2. A ako nisu korisniku se prikazuje MessageBox sa odgovarajuom porukom.
H) (25 poena) Implementirati konteksni meni Brisi koji omoguava brisanje reda
DataGridView kontrole u kome se trenutno nalazimo (red ne mora biti selektovan), uz
prikaz odgovarajueg MessageBox-a u kome treba potvrditi brisanje. Dogaaj kodirati
bez upotrebe tipiziranog DataSet-a. Aurirati i ukupan broj rezervacija.

Napomena: Za sve manipulacije sa bazom obavezna je upotreba try-catch bloka.

Reenje:
Skript baze Letovanje:
USE [Letovanje]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Rezervacija](
[RezervacijaID] [int] NOT NULL,
[Prezime] [nvarchar](25) NOT NULL,
[Tip_usluge] [int] NOT NULL,
CONSTRAINT [PK_Rezervacija] PRIMARY KEY CLUSTERED
(
[RezervacijaID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Usluga](
[UslugaID] [int] NOT NULL,
[Opis] [nvarchar](25) NOT NULL,
CONSTRAINT [PK_Usluga] PRIMARY KEY CLUSTERED
(
[UslugaID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
305

INSERT [dbo].[Rezervacija] ([RezervacijaID], [Prezime], [Tip_usluge]) VALUES (111,
N'Mari', 3)
INSERT [dbo].[Rezervacija] ([RezervacijaID], [Prezime], [Tip_usluge]) VALUES (222,
N'Markovi', 1)
INSERT [dbo].[Rezervacija] ([RezervacijaID], [Prezime], [Tip_usluge]) VALUES (333,
N'Vuji', 3)
INSERT [dbo].[Usluga] ([UslugaID], [Opis]) VALUES (1, N'Najam apartmana')
INSERT [dbo].[Usluga] ([UslugaID], [Opis]) VALUES (2, N'Prenoite')
INSERT [dbo].[Usluga] ([UslugaID], [Opis]) VALUES (3, N'Polupansion')
INSERT [dbo].[Usluga] ([UslugaID], [Opis]) VALUES (4, N'Pun pansion')
ALTER TABLE [dbo].[Rezervacija] WITH CHECK ADD CONSTRAINT [FK_Rezervacija_Usluga]
FOREIGN KEY([Tip_usluge])
REFERENCES [dbo].[Usluga] ([UslugaID])
GO
ALTER TABLE [dbo].[Rezervacija] CHECK CONSTRAINT [FK_Rezervacija_Usluga]
GO
USE [master]
GO
ALTER DATABASE [Letovanje] SET READ_WRITE
GO


// Konekcija.cs
class Konekcija
{
public static string konLeto = Properties.Settings.Default.LetovanjeConnectionString;
}


// I_grupa.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace II_kolokvijum
{
public partial class I_grupa : Form
{
SqlConnection kon = new SqlConnection(Konekcija.konLeto);

public I_grupa()
{
InitializeComponent();
}

private void izracunajBroj()
{
tbUkupno.Text = (dataGridView1.Rows.Count-1).ToString();
}

private void brojUsluga()
{
try
{
kon.Open();
306

using (SqlCommand komanda = new SqlCommand(("select count(*) from
Usluga"), kon))
{
tbBrojUsluga.Text = (komanda.ExecuteScalar()).ToString();
}

}
catch (Exception ex)
{
MessageBox.Show("Greska: " + ex.Message);
}
finally
{
kon.Close();
}
}

private void I_grupa_Load(object sender, EventArgs e)
{
this.uslugaTableAdapter.Fill(this.letovanjeDataSet.Usluga);
this.rezervacijaTableAdapter.Fill(this.letovanjeDataSet.Rezervacija);

izracunajBroj();
brojUsluga();
}

private void button1_Click(object sender, EventArgs e)
{
groupBox1.Enabled = false;
try
{
this.rezervacijaTableAdapter.Update(letovanjeDataSet.Rezervacija);
MessageBox.Show("Uspenso unete izmene");
izracunajBroj();
}
catch (Exception ex)
{
MessageBox.Show("Greska: " + ex.Message);
}
}

private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
listBox1.Items.Clear();
if (dataGridView1.SelectedRows.Count != 0)
{
foreach (DataGridViewColumn kolona in dataGridView1.Columns)
{

listBox1.Items.Add(dataGridView1.SelectedRows[0].Cells[kolona.Name].Value);
}
}
}

private void btnUbaci_Click(object sender, EventArgs e)
{
if (!String.IsNullOrEmpty(tbUslugaID.Text) &&
!String.IsNullOrEmpty(tbOpis.Text))
{
try
{
uslugaTableAdapter.Insert(int.Parse(tbUslugaID.Text), tbOpis.Text);
MessageBox.Show("Uspenso dodata nova usluga");
uslugaTableAdapter.Fill(letovanjeDataSet.Usluga);
307

tbUslugaID.Clear();
tbOpis.Clear();
brojUsluga();
}
catch (Exception ex)
{
MessageBox.Show("Greska: " + ex.Message);
}
}
else
{
MessageBox.Show("Sva polja su obavezna");
}
}

private void brisiToolStripMenuItem_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Da li zelite da izbrisete izabrani red?", "Potvrda",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) ==
DialogResult.Yes)
{
try
{
kon.Open();
int indexReda = dataGridView1.CurrentRow.Index;

using (SqlCommand komanda = new SqlCommand(("delete from Rezervacija
where RezervacijaID=@tip"), kon))
{
komanda.Parameters.Add(new SqlParameter("tip",
int.Parse(dataGridView1[0, indexReda].Value.ToString())));
komanda.ExecuteNonQuery();
}
dataGridView1.Rows.RemoveAt(indexReda);
MessageBox.Show("Brisanje je uspesno obavljeno");
izracunajBroj();
}
catch (Exception ex)
{
MessageBox.Show("Greska: " + ex.Message);
}
finally
{
kon.Close();
}
}
}

private void unosNoveUslugeToolStripMenuItem_Click(object sender, EventArgs e)
{
groupBox1.Enabled = true;
}
}
}


308

II grupa
A) (10 poena) Kreirati bazu Firma koja sadri dve povezane tabele (Radnik i
Odeljenje) iji su opisi dati. Popuniti sa par proizvoljnih zapisa obe tabele.

B) (5 poena) Napraviti formu kao na slici 4.40.

Slika 4.40. Izlazni ekran

C) (10 poena) Prilikom uitavanja forme DataGridView kontrola prikazuje sve zapise iz
tabele Radnik baze Firma. Kolonu Odeljenje prikazati kao ComboBox, pri emu se
ispisuje naziv odeljenja.
D) (20 poena) Klikom na neku eliju u DataGridView kontroli u RichTextBox-u se prikazuje
sadraj tog reda (detalji o radniku). Videti sliku.
E) (10 poena) Implementirati da se klikom na dugme Zapamti promene snimaju sve
promene (izmena i dodavanje novog zapisa) nainjene u DataGridView kontroli, aurira
baza i korisniku se prikazuje MessageBox sa odgovarajuom porukom.
F) (23 poena) Implementirati meni Manipulacija koji sadri podmeni Brisi radnika, ijim
izborom se proverava da li je TextBox polje ID radnika za otkaz popunjeno.
1. Ako jeste prikazuje se odgovarajui MessageBox u kome treba potvrditi
brisanje. Izbrisati navedenog radnika iz baze i aurirati podatke u
DataGridView kontroli. Dogaaj kodirati bez upotrebe tipiziranog DataSet-a.
2. A ako nije korisniku se prikazuje MessageBox sa odgovarajuom porukom.
G) (22 poena) Implementirati konteksni meni Racunaj statistiku koji GroupBox
Statistika ini dostupnim za upotrebu. ComboBox se puni nazivima odeljenja iz tabele
309

Odeljenje baze Firma. Izborom nekog odeljenja izraunava se prosena plata i broj
radnika u tom odeljenju i popunjavaju se odgovarajue TextBox kontrole.
Napomena: Za sve manipulacije sa bazom obavezna je upotreba try-catch bloka.
Reenje:
Skript baze Firma:
USE [Firma]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Odeljenje](
[OdeljenjeID] [int] NOT NULL,
[Naziv] [nvarchar](15) NOT NULL,
CONSTRAINT [PK_Odeljenje] PRIMARY KEY CLUSTERED
(
[OdeljenjeID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Radnik](
[RadnikID] [int] NOT NULL,
[PrezimeIme] [nvarchar](50) NOT NULL,
[Plata] [float] NOT NULL,
[Odeljenje] [int] NOT NULL,
CONSTRAINT [PK_Radnik] PRIMARY KEY CLUSTERED
(
[RadnikID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
INSERT [dbo].[Odeljenje] ([OdeljenjeID], [Naziv]) VALUES (1, N'Marketing')
INSERT [dbo].[Odeljenje] ([OdeljenjeID], [Naziv]) VALUES (2, N'Prodaja')
INSERT [dbo].[Odeljenje] ([OdeljenjeID], [Naziv]) VALUES (3, N'Komercijala')
INSERT [dbo].[Radnik] ([RadnikID], [PrezimeIme], [Plata], [Odeljenje]) VALUES (1,
N'Petar', 1000, 1)
INSERT [dbo].[Radnik] ([RadnikID], [PrezimeIme], [Plata], [Odeljenje]) VALUES (2, N'Ana',
32000, 2)
INSERT [dbo].[Radnik] ([RadnikID], [PrezimeIme], [Plata], [Odeljenje]) VALUES (3,
N'Dana', 35000, 1)
ALTER TABLE [dbo].[Radnik] WITH CHECK ADD CONSTRAINT [FK_Radnik_Odeljenje] FOREIGN
KEY([Odeljenje])
REFERENCES [dbo].[Odeljenje] ([OdeljenjeID])
GO
ALTER TABLE [dbo].[Radnik] CHECK CONSTRAINT [FK_Radnik_Odeljenje]
GO
USE [master]
GO
ALTER DATABASE [Firma] SET READ_WRITE
GO

310

// Konekcija.cs
class Konekcija
{
public static string konFirma = Properties.Settings.Default.FirmaConnectionString;
}


// II_grupa.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace II_kolokvijum
{
public partial class II_grupa : Form
{
SqlConnection konekcija = new SqlConnection(Konekcija.konFirma);

public II_grupa()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
this.odeljenjeTableAdapter.Fill(this.firmaDataSet.Odeljenje);
this.radnikTableAdapter.Fill(this.firmaDataSet.Radnik);
}

private void racunajProsek()
{
try
{
konekcija.Open();
SqlCommand komanda = new SqlCommand();
komanda.Connection = konekcija;

komanda.CommandText = "select avg(Plata) as Minimalac from Radnik where
Odeljenje=@OdeljenjeID";
komanda.Parameters.Add(new SqlParameter("OdeljenjeID",
int.Parse(comboBox1.SelectedValue.ToString())));
tbProsek.Text = (komanda.ExecuteScalar()).ToString();

komanda.CommandText = "select count(*) as Ukupno from Radnik where
Odeljenje=@OdeljenjeID";
tbBrRadnika.Text = (komanda.ExecuteScalar()).ToString();
}
catch (Exception ex)
{
MessageBox.Show("Greska: " + ex.Message);
}
finally
{
konekcija.Close();
}
}
311

private void button1_Click(object sender, EventArgs e)
{
try
{
this.radnikTableAdapter.Update(firmaDataSet.Radnik);
MessageBox.Show("Uspenso unete izmene");
}
catch (Exception ex)
{
MessageBox.Show("Greska: " + ex.Message);
}
}

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
richTextBox1.Clear();
foreach (DataGridViewColumn kolona in dataGridView1.Columns)
{

richTextBox1.AppendText(dataGridView1.CurrentRow.Cells[kolona.Name].Value.ToString() +
"\n");
}
}

private void racunajStatistikuToolStripMenuItem_Click(object sender, EventArgs e)
{
groupBox1.Enabled = true;
}

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBox1.SelectedIndex != -1)
{
racunajProsek();
if (String.IsNullOrEmpty(tbProsek.Text))
tbProsek.Text = "Nema podataka";
}
}

private void brisiRadnikaToolStripMenuItem_Click(object sender, EventArgs e)
{
if (!String.IsNullOrEmpty(tbRadnik.Text))
{
if (MessageBox.Show("Da li zelite da izbrisete izabranog radnika?",
"Potvrda", MessageBoxButtons.YesNo,
MessageBoxIcon.Question) == DialogResult.Yes)
{
try
{
konekcija.Open();

using (SqlCommand komanda = new SqlCommand(("delete from Radnik
where RadnikID=@ID"), konekcija))
{
komanda.Parameters.Add(new SqlParameter("ID",
int.Parse(tbRadnik.Text)));
komanda.ExecuteNonQuery();
}
this.radnikTableAdapter.Fill(this.firmaDataSet.Radnik);
MessageBox.Show("Brisanje je uspesno obavljeno");
tbRadnik.Clear();
}


312

catch (Exception ex)
{
MessageBox.Show("Greska: " + ex.Message);
}
finally
{
konekcija.Close();
}
}
}
else
{
MessageBox.Show("Morate uneti ID radnika kome dajete otkaz");
}
}
}
}


313

III grupa
A) (10 poena) Kreirati bazu Maloprodaja koja sadri dve povezane tabele (Artikli i
Popusti) iji su opisi dati. Popuniti sa par proizvoljnih zapisa obe tabele.


B) (5 poena) Napraviti formu kao na slici 4.41.

Slika 4.41. Izlazni ekran

C) (10 poena) Prilikom uitavanja forme DataGridView kontrola prikazuje sve zapise iz
tabele Artikli baze Maloprodaja. Kolonu Popust prikazati kao ComboBox, pri emu
se ispisuje opis popusta.
D) (10 poena) Prilikom uitavanja forme ispisuje se i ukupan broj artikala na popustu.
E) (15 poena) Implementirati da se klikom na dugme Odobri prikazuje odgovarajui
MessageBox u kome treba potvrditi uvanje promena.
1. Ako korisnik potvrdi promene se snimaju sve promene (izmena i dodavanje
novog zapisa) nainjene u DataGridView kontroli, aurira baza i korisniku se
prikazuje MessageBox sa odgovarajuom porukom. Aurira se i ukupan broj
artikala na popustu.
2. U suprotnom vratiti DataGridView kontrolu na stare vrednosti.
F) Implementirati meni Artikli koji sadri podmenije Brisi artikal i Pretraga.
1. (15 poena) Ako korisnik izabere opciju Brisi artikal prikazuje se odgovarajui
MessageBox u kome treba potvrditi brisanje. Izbrisati selektovani red iz
DataGridView kontrole. Odnosno, izbrisati selektovani artikal iz baze i aurirati
314

podatke u DataGridView kontroli. Aurira se i ukupan broj artikala na popustu.
Dogaaj kodirati bez upotrebe tipiziranog DataSet-a.
2. (20 poena) Ako korisniku izabere opciju Pretraga GroupBox Pretraga po
popustu postaje dostupan za upotrebu. ComboBox se puni opisima popusta
iz tabele Popusti baze Maloprodaja. Izborom nekog popusta izraunava se
ukupan broj artikala, kao i maksimalna i prosena cena artikala koji su na
izabranom popustu i popunjavaju se odgovarajue TextBox kontrole.
G) (15 poena) Implementirati konteksni meni Racunaj ijim izborom se popunjava
RichTextBox kontrola nazivima artikala koji su na popustu i to sortiranim u opadajuem
redosledu cena.

Napomena: Za sve manipulacije sa bazom obavezna je upotreba try-catch bloka.

Reenje:
Skript baze Maloprodaja:
USE [Maloprodaja]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Artikli](
[ArtikalID] [int] NOT NULL,
[Naziv] [nvarchar](15) NOT NULL,
[Cena] [float] NOT NULL,
[Popust] [int] NULL,
CONSTRAINT [PK_Artikli] PRIMARY KEY CLUSTERED
(
[ArtikalID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Popusti](
[PopustID] [int] NOT NULL,
[Opis] [nvarchar](10) NOT NULL,
[Visina] [int] NOT NULL,
CONSTRAINT [PK_Popusti] PRIMARY KEY CLUSTERED
(
[PopustID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
INSERT [dbo].[Artikli] ([ArtikalID], [Naziv], [Cena], [Popust]) VALUES (111, N'Kaput',
10000, 3)
315

INSERT [dbo].[Artikli] ([ArtikalID], [Naziv], [Cena], [Popust]) VALUES (222, N'Jakna',
70000, 1)
INSERT [dbo].[Artikli] ([ArtikalID], [Naziv], [Cena], [Popust]) VALUES (333, N'Kosulja',
25000, 1)
INSERT [dbo].[Artikli] ([ArtikalID], [Naziv], [Cena], [Popust]) VALUES (444, N'Marama',
2100, 3)
INSERT [dbo].[Artikli] ([ArtikalID], [Naziv], [Cena], [Popust]) VALUES (555, N'Bluza',
450, NULL)
INSERT [dbo].[Popusti] ([PopustID], [Opis], [Visina]) VALUES (1, N'Minimalni', 5)
INSERT [dbo].[Popusti] ([PopustID], [Opis], [Visina]) VALUES (2, N'Srednji', 10)
INSERT [dbo].[Popusti] ([PopustID], [Opis], [Visina]) VALUES (3, N'Maksimalni', 25)
ALTER TABLE [dbo].[Artikli] WITH CHECK ADD CONSTRAINT [FK_Artikli_Popusti] FOREIGN
KEY([Popust])
REFERENCES [dbo].[Popusti] ([PopustID])
GO
ALTER TABLE [dbo].[Artikli] CHECK CONSTRAINT [FK_Artikli_Popusti]
GO
USE [master]
GO
ALTER DATABASE [Maloprodaja] SET READ_WRITE
GO


// Konekcija.cs
class Konekcija
{
public static string kon = Properties.Settings.Default.MaloprodajaConnectionString;
}


// III_grupa.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace II_kolokvijum
{
public partial class III_grupa : Form
{
SqlConnection konekcija = new SqlConnection(Konekcija.kon);

public III_grupa()
{
InitializeComponent();
}

private void artikliPopust()
{
int broj = 0;
for (int i = 0; i <= dataGridView1.Rows.Count - 2; i++)
{
if (!String.IsNullOrEmpty(dataGridView1[3, i].Value.ToString()))
{
broj++;
}
316

}
tbBroj.Text = broj.ToString();
}

private void III_grupa_Load(object sender, EventArgs e)
{
this.artikliTableAdapter.Fill(this.maloprodajaDataSet.Artikli);
this.popustiTableAdapter.Fill(this.maloprodajaDataSet.Popusti);
artikliPopust();
}

private void btnOdobri_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Da li zelite da sacuvate promene?", "Potvrda",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) ==
DialogResult.Yes)
{
try
{
this.artikliTableAdapter.Update(maloprodajaDataSet.Artikli);
MessageBox.Show("Uspenso unete izmene");
artikliPopust();
}
catch (Exception ex)
{
MessageBox.Show("Greska: " + ex.Message);
}
}
else
{
this.artikliTableAdapter.Fill(this.maloprodajaDataSet.Artikli);
}
}

private void racunajToolStripMenuItem_Click(object sender, EventArgs e)
{
artikliPopust();
richTextBox1.Clear();
try
{
konekcija.Open();
SqlCommand komanda = new SqlCommand();
komanda.Connection = konekcija;

komanda.CommandText = "select Naziv from Artikli where Popust is not null
order by Cena desc";
SqlDataReader reader = komanda.ExecuteReader();
while (reader.Read())
{
richTextBox1.AppendText(reader.GetString(0)+ "\n");
}

}
catch (Exception ex)
{
MessageBox.Show("Greska: " + ex.Message);
}
finally
{
konekcija.Close();
}
}


317

private void brisiArtikalToolStripMenuItem_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Da li zelite da izbrisete izabranog radnika?",
"Potvrda", MessageBoxButtons.YesNo,
MessageBoxIcon.Question) == DialogResult.Yes)
{
try
{
konekcija.Open();

using (SqlCommand komanda = new SqlCommand("delete from Artikli where
ArtikalID=@ID", konekcija))
{
komanda.Parameters.Add(new SqlParameter("ID",
int.Parse(dataGridView1.SelectedRows[0].Cells[0].Value.ToString())));
komanda.ExecuteScalar();
dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[0].Index);
}
}

catch (Exception ex)
{
MessageBox.Show("Greska: " + ex.Message);
}

finally
{
konekcija.Close();
}

artikliPopust();
}
}

private void pretragaToolStripMenuItem_Click(object sender, EventArgs e)
{
groupBox1.Enabled = true;
}

private void pretragaPoust()
{
try
{
konekcija.Open();
SqlCommand komanda = new SqlCommand();
komanda.Connection = konekcija;

komanda.CommandText = "select max(Cena) from Artikli where
Popust=@popust";
komanda.Parameters.Add(new SqlParameter("popust",
int.Parse(comboBox1.SelectedValue.ToString())));
tbMax.Text = (komanda.ExecuteScalar()).ToString();

komanda.CommandText = "select avg(Cena) from Artikli where
Popust=@popust";
tbProsek.Text = (komanda.ExecuteScalar()).ToString();

komanda.CommandText = "select count(*) from Artikli where
Popust=@popust";
tbBrojPopust.Text = (komanda.ExecuteScalar()).ToString();
}



318

catch (Exception ex)
{
MessageBox.Show("Greska: " + ex.Message);
}

finally
{
konekcija.Close();
}
}

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBox1.SelectedIndex != -1)
{
pretragaPoust();
}
}
}


319

IV grupa
A) (10 poena) Kreirati bazu Oporezivanje koja sadri dve povezane tabele (Klijent i
Porez) iji su opisi dati. Popuniti sa par proizvoljnih zapisa obe tabele.


B) (5 poena) Napraviti formu kao na slici 4.42.

Slika 4.42. Izlazni ekran

C) (10 poena) Prilikom uitavanja forme DataGridView kontrola prikazuje sve zapise iz
tabele Klijent baze Oporezivanje. Kolonu Porez prikazati kao ComboBox, pri emu
se ispisuje naziv poreza.
D) (10 poena) Prilikom uitavanja forme ispisuje se i ukupan broj razliitih tipova poreza
koji postoje u bazi, u odgovarajui TextBox u okviru GropuBox-a Novi porez.
E) (10 poena) Implementirati da se klikom na dugme Azuriraj snimaju sve promene
(izmena i dodavanje novog zapisa) nainjene u DataGridView kontroli, aurira baza i
korisniku se prikazuje MessageBox sa odgovarajuom porukom.
F) (15 poena) Implementirati meni Porez koji sadri podmeni Unos novog poreza
Izborom opcije Unos novog poreza GroupBox pod nazivom Novi porez postaje
dostupan za upis. TextBox kontrole ne smeju biti prevuene iz tipiziranog DataSet-a.
Klikom na dugme Dodaj proverava se da li su polja za ifru, naziv i stopu poreza
popunjeni.
1. Ako jesu u tabeli Porez u bazi Oporezivanje se kreira novi zapis sa unetim
parametrima i korisniku se prikazuje MessageBox sa odgovarajuom porukom i
320

auriraju podaci u DataGridView kontroli. Aurira se i ukupan broj tipova
poreza.
2. A ako nisu korisniku se prikazuje MessageBox sa odgovarajuom porukom.
G) (15 poena) ComboBox Porez za brisanje sadri sve tipove poreza koji se nalaze u bazi.
Korisnik bira koji porez eli da izbrie. Implementirati konteksni meni Brisi ijim
izborom GroupBox pod nazivom Novi porez postaje nedostupan za upis i korisniku se
prikazuje MessageBox sa odgovarajuom porukom o potvrdi brisanja. Ako korisnik
potvrdi brisanje podaci o izabranom porezu se briu iz baze. Aurira se i ukupan broj
tipova poreza. Dogaaj kodirati bez upotrebe tipiziranog DataSet-a.
H) (25 poena) Selekcijom nekog reda u DataGridView kontroli u odgovarajuoj TextBox
kontroli se prikazuje koliko je neophodno uplatiti za poreze za klijenta koji je selektovan.
(uplata = promet * poreska stopa)

Napomena: Za sve manipulacije sa bazom obavezna je upotreba try-catch bloka.

Reenje:
Skript baze Oporezivanje:
USE [Oporezivanje]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Klijent](
[PIB] [int] NOT NULL,
[Naziv] [nvarchar](25) NOT NULL,
[Promet] [float] NOT NULL,
[Porez] [int] NULL,
CONSTRAINT [PK_Klijent] PRIMARY KEY CLUSTERED
(
[PIB] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Porez](
[Sifra] [int] NOT NULL,
[Naziv] [nvarchar](15) NOT NULL,
[Stopa] [int] NOT NULL,
CONSTRAINT [PK_Porez] PRIMARY KEY CLUSTERED
(
[Sifra] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
321

INSERT [dbo].[Klijent] ([PIB], [Naziv], [Promet], [Porez]) VALUES (111, N'ADA doo',
100000, 1)
INSERT [dbo].[Klijent] ([PIB], [Naziv], [Promet], [Porez]) VALUES (222, N'Maja str',
80000, 2)
INSERT [dbo].[Klijent] ([PIB], [Naziv], [Promet], [Porez]) VALUES (333, N'Udruzenje
slepih', 30000, NULL)
INSERT [dbo].[Porez] ([Sifra], [Naziv], [Stopa]) VALUES (1, N'Osnovni', 8)
INSERT [dbo].[Porez] ([Sifra], [Naziv], [Stopa]) VALUES (2, N'Extra', 20)
INSERT [dbo].[Porez] ([Sifra], [Naziv], [Stopa]) VALUES (3, N'Visoki', 15)
ALTER TABLE [dbo].[Klijent] WITH CHECK ADD CONSTRAINT [FK_Klijent_Porez] FOREIGN
KEY([Porez])
REFERENCES [dbo].[Porez] ([Sifra])
GO
ALTER TABLE [dbo].[Klijent] CHECK CONSTRAINT [FK_Klijent_Porez]
GO
USE [master]
GO
ALTER DATABASE [Oporezivanje] SET READ_WRITE
GO


// Konekcija.cs
class Konekcija
{
public static string kon = Properties.Settings.Default.OporezivanjeConnectionString;
}


// IV_grupa.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace II_kolokvijum
{
public partial class IV_grupa : Form
{
SqlConnection konekcija = new SqlConnection(Konekcija.kon);

public IV_grupa()
{
InitializeComponent();
}

private void IV_grupa_Load(object sender, EventArgs e)
{
this.porezTableAdapter.Fill(this.oporezivanjeDataSet.Porez);
this.klijentTableAdapter.Fill(this.oporezivanjeDataSet.Klijent);
brojPoreza();
}

private void btnAzuriraj_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Da li zelite da sacuvate promene?", "Potvrda",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) ==
DialogResult.Yes)
322

{
try
{
this.klijentTableAdapter.Update(oporezivanjeDataSet.Klijent);
MessageBox.Show("Uspenso unete izmene");
}
catch (Exception ex)
{
MessageBox.Show("Greska: " + ex.Message);
}
}
else
{
this.klijentTableAdapter.Fill(this.oporezivanjeDataSet.Klijent);
}
}

private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
if (dataGridView1.SelectedRows.Count != 0)
{
int porezID;
double promet =
Convert.ToDouble(dataGridView1.SelectedRows[0].Cells[2].Value.ToString());
if (!String.IsNullOrEmpty(dataGridView1.SelectedRows[0].Cells[3].Value.ToString()))
{
porezID =
int.Parse(dataGridView1.SelectedRows[0].Cells[3].Value.ToString());
tbIznos.Clear();
try
{
konekcija.Open();
SqlCommand komanda = new SqlCommand();
komanda.Connection = konekcija;

komanda.CommandText = "select Stopa from Porez where
Sifra=@param";
komanda.Parameters.Add(new SqlParameter("param", porezID));
SqlDataReader reader = komanda.ExecuteReader();
int porez = 0;
while (reader.Read())
{
porez = Convert.ToInt32(reader.GetValue(0));
}
double uplata = promet * porez / 100;
tbIznos.Text = uplata.ToString();
}
catch (Exception ex)
{
MessageBox.Show("Greska: " + ex.Message);
}
finally
{
konekcija.Close();
}
}
else
{
tbIznos.Text = "Nema poreza";
}
}
}


323

private void unosNovogPorezaToolStripMenuItem_Click(object sender, EventArgs e)
{
groupBox1.Enabled = true;
}

private void brojPoreza()
{
try
{
konekcija.Open();
using (SqlCommand komanda = new SqlCommand(("select count(*) from
Porez"), konekcija))
{
tbBrojPoreza.Text = (komanda.ExecuteScalar()).ToString();
}

}
catch (Exception ex)
{
MessageBox.Show("Greska: " + ex.Message);
}
finally
{
konekcija.Close();
}
}

private void btnDodaj_Click(object sender, EventArgs e)
{
if (!String.IsNullOrEmpty(tbSifra.Text) &&
!String.IsNullOrEmpty(tbNaziv.Text) && !String.IsNullOrEmpty(tbStopa.Text))
{
try
{
porezTableAdapter.Insert(int.Parse(tbSifra.Text), tbNaziv.Text,
int.Parse(tbStopa.Text));
MessageBox.Show("Uspenso dodat novi porez");
porezTableAdapter.Fill(oporezivanjeDataSet.Porez);
dataGridView1.Refresh();
tbSifra.Clear();
tbNaziv.Clear();
tbStopa.Clear();
brojPoreza();
}
catch (Exception ex)
{
MessageBox.Show("Greska: " + ex.Message);
}
}
else
{
MessageBox.Show("Sva polja su obavezna");
}
}


private void brisiPorezToolStripMenuItem_Click(object sender, EventArgs e)
{
groupBox1.Enabled = false;

if (MessageBox.Show("Da li zelite da izbrisete izabrani porez?", "Potvrda",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) ==
DialogResult.Yes)
{
324

try
{
konekcija.Open();
using (SqlCommand komanda = new SqlCommand("delete from Porez where
Sifra=@ID", konekcija))
{
komanda.Parameters.Add(new SqlParameter("ID",
int.Parse(comboBox1.SelectedValue.ToString())));
komanda.ExecuteNonQuery();
this.porezTableAdapter.Fill(this.oporezivanjeDataSet.Porez);
}
}
catch (Exception ex)
{
MessageBox.Show("Greska: " + ex.Message);
}
finally
{
konekcija.Close();
}
brojPoreza();
}
}
}
}



325

5. Integralni ispit septembarski ispitni rok 2013. god
A) (10 poena) Kreirati javnu klasu Takmicar sa privatnim atributima: ifra (int), ime (od
string), prezime (string), drava (string) i disciplina (string). Napraviti odgovarajue
propertije. U podrazumevanom konstruktoru postaviti polja prezime, ime, drava i
disciplina da imaju vrednost praznog stringa, a ifru na 0. Napraviti parametarski
konstruktor koji kao ulazne parametre dobija ifru, ime, prezime, drava i disciplina.
Override-ovati metodu ToString() tako da vraa podatke o takmiaru u obliku:
Prijavljen je Ime Prezime (Drava) za takmicenje: Disciplina.
B) (5 poena) Kreirati klasu Konekcija koja sadri statiko string polje, koje sadri
konekcioni string na bazu iji skript je dat u okviru Olimpijada.sql.
C) (5 poena) Napraviti formu pod nazivom frmOlimpijada kao na slici 4.43.
(Meni Ucesnik ima podmenije: Novi i Prikazi, a meni Fajl: Stampa i Izlaz)

Slika 4.43. Forma frmOlimpijada Slika 4.44. Forma frmTakmicar

D) (5 poena) Prilikom uitavanja forme DataGridView kontrola prikazuje sve zapise iz tabele
Takmicari baze Olimpijada.
E) (5 poena) Napraviti formu pod nazivom frmTakmicar kao na slici 4.44.
F) Implementirati meni Ucesnik koji sadri dva podmenija: Novi i Prikazi.
1. (25 poena) Izborom opcije Novi otvara se forma sa slike 2. Klikom na dugme
Upisi proverava se da li su Sifra, Ime, Prezime, Drzava i Disciplina popunjeni.
i. Ako jesu:
a) u tabeli Takmicari baze Olimpijada se kreira novi zapis sa unetim
parametrima
b) ubacuje se takmiar sa unetim podacima u generiki stek takmiara
c) korisniku se prikazuje MessageBox sa odgovarajuom porukom i
auriraju podaci u DataGridView kontroli.
ii. A ako nisu korisniku se prikazuje MessageBox sa odgovarajuom porukom.
326

iii. Klikom na dugme Resetuj prazne se sve kontrole sa forme frmTakmicar.
2. (15 poena) Izborom opcije Prikazi koji GroupBox pod nazivom Pretraga po
drzavi ini dostupnim za upis.
i. U ComboBox-u se prikazuju sve razliite drave iz kojih trenutno postoje
prijavljeni takmiari.
ii. Izborom neke od njih prikazuje se lista sa imenima i prezimena takmiara
iz izabrane drave.
G) (15 poena) Implementirati meni Fajl koji sadri dva podmenija: Stampa i Izlaz.
1. Izborom opcije Stampa upisuje takmiare iz generikog steka u fajl Spisak.txt i
prikazuje MessageBox sa odgovarajuim obavetenjem.
2. Izborom opcije Izlaz zatvara se aplikacija.
H) (15 poena) Implementirati konteksni meni Obrisi koji brie selektovani red u
DataGridView kontroli i korisniku se prikazuje MessageBox sa odgovarajuom porukom.

Skript baze Olimpijada:
USE [Olimpijada]
GO
/****** Object: Table [dbo].[Takmicari] Script Date: 07/25/2013 11:26:05 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Takmicari]')
AND type in (N'U'))
DROP TABLE [dbo].[Takmicari]
GO
/****** Object: Table [dbo].[Takmicari] Script Date: 07/25/2013 11:26:05 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id =
OBJECT_ID(N'[dbo].[Takmicari]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Takmicari](
[Sifra] [int] NOT NULL,
[Ime] [nvarchar](20) NOT NULL,
[Prezime] [nvarchar](20) NOT NULL,
[Drzava] [nvarchar](20) NOT NULL,
[Disciplina] [nvarchar](100) NOT NULL,
CONSTRAINT [PK_Takmicari] PRIMARY KEY CLUSTERED
(
[Sifra] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END
GO
INSERT [dbo].[Takmicari] ([Sifra], [Ime], [Prezime], [Drzava], [Disciplina]) VALUES (111,
N'Petar', N'Peric', N'Srbija', N'Plivanje')
INSERT [dbo].[Takmicari] ([Sifra], [Ime], [Prezime], [Drzava], [Disciplina]) VALUES (222,
N'Marija', N'Markovic', N'Crna Gora', N'Tenis')
INSERT [dbo].[Takmicari] ([Sifra], [Ime], [Prezime], [Drzava], [Disciplina]) VALUES (345,
N'Stefan', N'Saric', N'Srbija', N'Tenis Atletika')
INSERT [dbo].[Takmicari] ([Sifra], [Ime], [Prezime], [Drzava], [Disciplina]) VALUES (654,
N'Milan', N'Markov', N'Srbija', N'Tenis')
327


Reenje:
// Konekcija.cs
class Konekcija
{
public static string cnn = Properties.Settings.Default.OlimpijadaConnectionString;
}

// Takmicar.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Olimpijada
{
class Takmicar
{
private int sifra;
private string ime;
private string prezime;
private string drzava;
private string disciplina;

public int Sifra { get { return sifra; } set { sifra = value; } }
public string Ime { get { return ime; } set { ime = value;} }
public string Prezime { get { return prezime; } set { prezime = value;} }
public string Drzava { get { return drzava; } set { drzava = value;} }
public string Disciplina { get { return disciplina; } set { disciplina = value;}}

public Takmicar()
{
sifra = 0;
ime = "";
prezime = "";
drzava = "";
disciplina = "";
}

public Takmicar(int s, string i, string p, string dr, string dis)
{
sifra = s;
ime = i;
prezime = p;
drzava = dr;
disciplina = dis;
}

public override string ToString()
{
return "Prijavljen je " + Ime + " " + Prezime + " (" + Drzava + ") za
takmicenje: " + Disciplina + ".";
}
}
}

// frmOlimpijada.cs
using System;
using System.Collections.Generic;
328

using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Collections;
using System.Data.SqlClient;

namespace Olimpijada
{
public partial class frmOlimpijada : Form
{
private Stack<Takmicar> takmicari;
private Takmicar t;
SqlConnection konekcija = new SqlConnection(Konekcija.cnn);

public frmOlimpijada()
{
InitializeComponent();
takmicari = new Stack<Takmicar>();
}

private void noviToolStripMenuItem_Click(object sender, EventArgs e)
{
groupBox1.Enabled = false;
frmTakmicar frm = new frmTakmicar();
if (frm.ShowDialog() == DialogResult.OK)
{
t = new Takmicar(frm.Sifra, frm.Ime, frm.Prezime, frm.Drzava,
frm.Disciplina);
takmicari.Push(t);
listBox1.Items.Clear();

try
{
this.takmicariTableAdapter.Insert(frm.Sifra, frm.Ime, frm.Prezime,
frm.Drzava, frm.Disciplina);

MessageBox.Show("Uspesno ste uneli podatke");

this.takmicariTableAdapter.Fill(this.olimpijadaDataSet.Takmicari);
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
}

private void frmOlimpijada_Load(object sender, EventArgs e)
{
this.takmicariTableAdapter.Fill(this.olimpijadaDataSet.Takmicari);
this.takmicariTableAdapter.Fill(this.olimpijadaDataSet.Takmicari);
}

private void stampaToolStripMenuItem_Click(object sender, EventArgs e)
{
StreamWriter sw = new StreamWriter("Spisak.txt");
foreach (Takmicar t in takmicari)
{
sw.WriteLine(t.ToString());
329

}
sw.Close();
MessageBox.Show("Fajl je sacuvan");
}

private void izlazToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}

private void prikaziToolStripMenuItem_Click(object sender, EventArgs e)
{
groupBox1.Enabled = true;

try
{
SqlDataAdapter da = new SqlDataAdapter("Select distinct Drzava from
Takmicari", Konekcija.cnn);

DataTable dt = new DataTable();

da.Fill(dt);

cbDrzava.DataSource = dt;
cbDrzava.DisplayMember = "Drzava";
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}

private void cbDrzava_SelectedIndexChanged(object sender, EventArgs e)
{
listBox1.Items.Clear();

konekcija.Open();

using (SqlCommand komnada = new SqlCommand("Select Ime,Prezime from Takmicari
where Drzava=@Drzava", konekcija))
{
komnada.Parameters.Add(new SqlParameter("Drzava", cbDrzava.Text));

SqlDataReader sdr = komnada.ExecuteReader();

while (sdr.Read())
{
listBox1.Items.Add(sdr.GetString(0));
listBox1.Items.Add("\r\n");
}
}
konekcija.Close();
}

private void obrisiToolStripMenuItem_Click(object sender, EventArgs e)
{
if (dataGridView1.SelectedRows.Count > 0)
{
int selekotvaniRed = dataGridView1.SelectedRows[0].Index;

int sifra = int.Parse(dataGridView1[0, selekotvaniRed].Value.ToString());
string ime = dataGridView1[1, selekotvaniRed].Value.ToString();
string prezime = dataGridView1[2, selekotvaniRed].Value.ToString();
string drzava = dataGridView1[3, selekotvaniRed].Value.ToString();
330

string disciplina = dataGridView1[4, selekotvaniRed].Value.ToString();

try
{
this.takmicariTableAdapter.Delete(sifra, ime, prezime, drzava,
disciplina);

dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[0].Index);

MessageBox.Show("Uspesno ste izbrisali");
}
catch (Exception exc)
{
MessageBox.Show(exc.Message);
}
}
}

}
}

// frmTakmicar.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Olimpijada
{
public partial class frmTakmicar : Form
{
public int Sifra { get { return Convert.ToInt32(tbSifra.Text); } }
public string Ime { get { return tbIme.Text; } }
public string Prezime { get { return tbPrezime.Text; } }
public string Drzava { get { return tbDrzava.Text; } }
public string Disciplina { get { return vratiDiscipline(); } }

public frmTakmicar()
{
InitializeComponent();
}

private void btnResetuj_Click(object sender, EventArgs e)
{
tbSifra.Text = "";
tbIme.Text = "";
tbPrezime.Text = "";
cbTenis.Checked = false;
cbPlivanje.Checked = false;
cbAtletika.Checked = false;
cbOdbojka.Checked = false;
tbDrzava.Text = "";
}

private string vratiDiscipline()
{
string dis = "";
331


if (cbTenis.Checked) dis += " " + cbTenis.Text;
if (cbPlivanje.Checked) dis += " " + cbPlivanje.Text;
if (cbOdbojka.Checked) dis += " " + cbOdbojka.Text;
if (cbAtletika.Checked) dis += " " + cbAtletika.Text;
if (!cbTenis.Checked && !cbPlivanje.Checked && !cbAtletika.Checked &&
!cbOdbojka.Checked) dis += "-";

return dis;
}

private void btnUpisi_Click(object sender, EventArgs e)
{
tbSifra.Focus();
if (tbSifra.Text == "" || tbIme.Text == "" || tbPrezime.Text == "" ||
tbDrzava.Text == "" || vratiDiscipline() == "-")
{
MessageBox.Show("Niste ispravno popunili formular", "Obavestenje",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
DialogResult = DialogResult.OK;
}
}
}
}


332

6. Integralni ispit oktobarski ispitni rok 2013. god
A) (10 poena) Kreirati javnu klasu Pacijent sa privatnim atributima: ID pregleda (int),
broj kartona (int), ime (string), prezime (string), dijagnoza (string) i bolovanje (int).
Napraviti odgovarajue propertije. U podrazumevanom konstruktoru postaviti polja ime,
prezime, dijagnoza da imaju vrednost praznog stringa, a za ID pregleda, broj kartona i
broj dana bolovanja na 0. Napraviti parametarski konstruktor koji kao ulazne parametre
dobija ID pregleda, broj kartona, ime, prezime, dijagnozu i broj dana bolovanja.
Override-ovati metodu ToString() tako da vraa podatke o pacijentu u obliku:
Prezime Ime (Broj kartona) sa dijagnozom Dijagnoza ima pravo na bolovanje u trajanju
Bolovanje dana.
B) (5 poena) Kreirati klasu Konekcija koja sadri statiko string polje, koje sadri
konekcioni string na bazu iji skript je dat u okviru Dom zdarvlja.sql.
C) (5 poena) Napraviti formu pod nazivom frmKartoteka kao na slici 4.45.
(Meni Pregled ima podmenije: Unos novog i Izadji, a meni Izvestaj podmeni
Stampa)

Slika 4.45 Forma frmKartoteka Slika 4.46. Forma frmPregled

D) (5 poena) Prilikom uitavanja forme DataGridView kontrola prikazuje sve zapise iz tabele
Pregledi u baze Dom zdravlja.
E) (5 poena) Napraviti formu pod nazivom frmPregled kao na slici 4.46.
F) (25 poena) Implementirati meni Pregled koji sadri dva podmenija: Unos novog i
Izadji.
1. Izborom opcije Unos novog otvara se forma sa slike 2. Klikom na dugme
Potvrdi proverava se da li su Broj pregleda, Broj kartona, Prezime, Ime,
Dijagnoza i Bolovanje popunjeni, pri emu bolovanje moe biti od 0 do 30 dana.
U ComboBox-u Dijagnoza se prikazuju sve razliite dijagnoze za koje trenutno
postoje podaci u bazi.
i. Ako su sva polja ispravno popunjena:
a) u tabeli se kreira novi zapis sa unetim parametrima
b) ubacuje se pregled sa unetim podacima u generiku listu pregleda
333

c) korisniku se prikazuje MessageBox sa odgovarajuom porukom i
auriraju podaci u DataGridView kontroli.
ii. A ako nisu korisniku se prikazuje MessageBox sa odgovarajuom
porukom.
iii. Klikom na dugme Otkazi prazne se sve kontrole sa forme frmPregled.
2. Izborom opcije Izadji zatvara se aplikacija.
G) (15 poena) Implementirati meni Izvestaj koji sadri podmeni Stampa. Izborom
opcije Stampa upisuju se kandidati iz generikoe liste u fajl ObavljeniPregledi.txt i
prikazuje MessageBox sa odgovarajuim obavetenjem.
H) (15 poena) Implementirati konteksni meni Izmeni koji aurira selektovani red u
DataGridView kontroli i korisniku se prikazuje MessageBox sa odgovarajuom porukom.
I) (15 poena) Klikom na dugme Filtriraj po dijagnozi GroupBox pod nazivom Prikaz
pacijenata po dijagnozi ini dostupnim za upis. Izborom neke dijagnoze prikazuje se
lista sa imenima, prezimena i brojem dana bolovanja za izabranu dijagnozu, kao i
ukupan broj dana bolovanja za sve pacijente za izabranu dijagnozu.

Skript baze Dom zdravlja:
USE [Dom zdravlja]
GO
/****** Object: Table [dbo].[Pregledi] Script Date: 19.9.2013 1:16:54 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Pregledi]')
AND type in (N'U'))
DROP TABLE [dbo].[Pregledi]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Pregledi]')
AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Pregledi](
[ID pregleda] [int] NOT NULL,
[Broj kartona] [int] NOT NULL,
[Prezime] [nvarchar](35) NOT NULL,
[Ime] [nvarchar](15) NOT NULL,
[Dijagnoza] [nvarchar](15) NOT NULL,
[Bolovanje] [int] NOT NULL,
CONSTRAINT [PK_Pregledi_1] PRIMARY KEY CLUSTERED
(
[ID pregleda] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
END

GO
INSERT [dbo].[Pregledi] ([ID pregleda], [Broj kartona], [Prezime], [Ime], [Dijagnoza],
[Bolovanje]) VALUES (111, 909, N'Markovic', N'Petar', N'sinuzitis', 15)
INSERT [dbo].[Pregledi] ([ID pregleda], [Broj kartona], [Prezime], [Ime], [Dijagnoza],
[Bolovanje]) VALUES (123, 764, N'Krunic', N'Sasa', N'nepoznato', 5)
334

INSERT [dbo].[Pregledi] ([ID pregleda], [Broj kartona], [Prezime], [Ime], [Dijagnoza],
[Bolovanje]) VALUES (222, 567, N'Vasiljevic', N'Jelena', N'rinitis', 12)
INSERT [dbo].[Pregledi] ([ID pregleda], [Broj kartona], [Prezime], [Ime], [Dijagnoza],
[Bolovanje]) VALUES (333, 567, N'Vasiljevic', N'Jelena', N'nepoznato', 0)

Reenje:
// Konekcija.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;

namespace OktobarskiIspit2013
{
public class Konekcija
{
public static List<Pacijent> Pacijents = new List<Pacijent>();
public static SqlConnection _dataConnection = null;
public static SqlConnection dataConnection
{
get
{

if (_dataConnection == null)
{
_dataConnection = new SqlConnection(ConnectionString);
_dataConnection.Open();
}
return _dataConnection;
}
}
private static string _connectionString;
public static string ConnectionString
{
get
{
if (_connectionString == null)
_connectionString =
Properties.Settings.Default.Dom_ZdravljaConnectionString;
return _connectionString;
}
set
{
_connectionString = "";
}
}
}
}


335

// Pacijent.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OktobarskiIspit2013
{
public class Pacijent
{
public int IdPregleda { get; set; }
public int BrojKartona { get; set; }
public string Ime { get; set; }
public string Prezime { get; set; }
public string Dijagnoza { get; set; }
public int Bolovanje { get; set; }

public Pacijent()
{
IdPregleda = 0;
Ime = "";
Prezime = "";
Dijagnoza = "";
Bolovanje = 0;
BrojKartona = 0;
}

public Pacijent(int id, int brojKartona, string ime, string prezime, string
diagnoza, int danaBolovanja)
{
IdPregleda = id;
BrojKartona = brojKartona;
Ime = ime;
Prezime = prezime;
Dijagnoza = diagnoza;
Bolovanje = danaBolovanja;
}

public override string ToString()
{
return string.Format("{0} {1} ({2}) sa dijagnozom {3} ima pravo na bolovanje
u trajanju {4} dana", Prezime, Ime, BrojKartona,
Dijagnoza, Bolovanje);
}

}
}


336

// frmKartoteka.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.IO;

namespace OktobarskiIspit2013
{
public partial class frmKartoteka : Form
{
public frmKartoteka()
{
InitializeComponent();
}

private void frmKartoteka_Load(object sender, EventArgs e)
{
this.preglediTableAdapter.Fill(this.dom_zdravljaDataSet.Pregledi);
}

private void izadjiToolStripMenuItem_Click(object sender, EventArgs e)
{
Close();
}

private void unosNovogToolStripMenuItem_Click(object sender, EventArgs e)
{
var frmUnosPodataka = new frmPregled();

if (frmUnosPodataka.ShowDialog() == DialogResult.OK)
{
this.preglediTableAdapter.Fill(this.dom_zdravljaDataSet.Pregledi);
}
}

private void stampaToolStripMenuItem_Click(object sender, EventArgs e)
{
using (StreamWriter report = new StreamWriter("ObavljeniPregledi.txt"))
{
foreach (var p in Konekcija.Pacijents)
{
report.WriteLine(p.ToString());
}
}
}

private void button1_Click(object sender, EventArgs e)
{
if (rb1.Checked)
{
lw1.Clear();
foreach (var t in this.dom_zdravljaDataSet.Pregledi.Where(m =>
m.Dijagnoza.Equals(rb1.Text)))
{
var z = new Pacijent(t.ID_pregleda, t.Broj_kartona, t.Ime, t.Prezime,
t.Dijagnoza, t.Bolovanje);

337

lw1.Text += z.ToString() + "\n";
}

}
if (rb2.Checked)
{
lw1.Clear();
foreach (var t in this.dom_zdravljaDataSet.Pregledi.Where(m =>
m.Dijagnoza.Equals(rb2.Text)))
{
var z = new Pacijent(t.ID_pregleda, t.Broj_kartona, t.Ime, t.Prezime,
t.Dijagnoza, t.Bolovanje);

lw1.Text += z.ToString() + "\n";
}
}
if (rb3.Checked)
{
lw1.Clear();
foreach (var t in this.dom_zdravljaDataSet.Pregledi.Where(m =>
m.Dijagnoza.Equals(rb3.Text)))
{
var z = new Pacijent(t.ID_pregleda, t.Broj_kartona, t.Ime, t.Prezime,
t.Dijagnoza, t.Bolovanje);

lw1.Text += z.ToString() + "\n";
}
}

}

private void izmeniToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
var t = dgw1.SelectedRows[0];
SqlCommand testc = new SqlCommand(string.Format("update Pregledi set
[Broj kartona] = {1},[Prezime] = '{2}',[Ime] =
'{3}',[Dijagnoza]='{4}',[Bolovanje]= {5} where [ID
pregleda] = {0}",
t.Cells[0].FormattedValue, t.Cells[1].FormattedValue,
t.Cells[2].FormattedValue, t.Cells[3].FormattedValue,
t.Cells[4].FormattedValue, t.Cells[5].FormattedValue),
Konekcija.dataConnection);
var result = testc.ExecuteNonQuery();
if (result > 0)
{
MessageBox.Show("Vas Record je uspesno Updajtovan");
}
}
catch (Exception ex)
{
MessageBox.Show("Greska");
}

finally
{
this.preglediTableAdapter.Fill(this.dom_zdravljaDataSet.Pregledi);
}
}
}
}

338

// frmPregled.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace OktobarskiIspit2013
{
public partial class frmPregled : Form
{
public frmPregled()
{
InitializeComponent();


SqlCommand testc = new SqlCommand("select Dijagnoza from Pregledi group by
Dijagnoza order by Dijagnoza", Konekcija.dataConnection);

SqlDataReader data = testc.ExecuteReader();

while(data.Read())
{

tbDiagnoza.Items.Add(data["Dijagnoza"].ToString());
}
data.Close();
}

private void button2_Click(object sender, EventArgs e)
{
tbId.Clear();
tbBK.Clear();
tbIme.Clear();
tbPrezime.Clear();
tbDiagnoza.Text = "";
tbBolovanje.Value = 0;
}

private void button1_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(tbBK.Text) ||
string.IsNullOrEmpty(tbId.Text) ||
string.IsNullOrEmpty(tbIme.Text) ||
string.IsNullOrEmpty(tbPrezime.Text) ||
string.IsNullOrEmpty(tbDiagnoza.Text)||
(int.Parse(tbBolovanje.Text) < 0 || int.Parse(tbBolovanje.Text) > 31))
{
MessageBox.Show("Zao nam je ali uneti podaci nisu potpuni");
}
else
{
try
{
SqlCommand testc = new SqlCommand(string.Format("insert into Pregledi
([ID pregleda],[Broj
kartona],[Prezime],[Ime],[Dijagnoza],[Bolovanje])v
alues ({0},{1},'{2}','{3}','{4}',{5})",
339

tbId.Text, tbBK.Text, tbPrezime.Text, tbIme.Text,
tbDiagnoza.Text, tbBolovanje.TextKonekcija.dataConnection);
var result = testc.ExecuteNonQuery();
var pregled = new Pacijent(int.Parse(tbId.Text),
int.Parse(tbBK.Text), tbIme.Text,
tbPrezime.Text, tbDiagnoza.Text,
int.Parse(tbBolovanje.Text));
Konekcija.Pacijents.Add(pregled);
if (result > 0)
{
MessageBox.Show("Vasi Rezultati su uspesno snimljeni");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
Close();
}
}
}
}



340

7. Integralni ispit januarski ispitni rok 2014. god
A) (10 poena) Kreirati javnu klasu Kandidat sa privatnim atributima: brojPrijave (int),
prezimeIme (string), brojPoena (double) i studijskiProgram (string). Napraviti
odgovarajue propertije. U podrazumevanom konstruktoru postaviti polja prezimeIme i
studijskiProgram na vrednost praznog stringa, a brojPrijave i brojPoena na 0. Napraviti
parametarski konstruktor koji kao ulazne parametre dobija broj prijave, prezime i ime,
broj poena i studijski program. Override-ovati metodu ToString() tako da vraa podatke
o kandidatu u obliku:
Prijavljen je prezime i ime (broj prijave) za studijski program: StudProgram.
B) (2 poena) Napraviti formu pod nazivom frmPrijemni kao na slici 4.47.
(Meni Kandidat ima podmenije: Novi i Pretraga). Napraviti formu pod nazivom
frmKandidat kao na slici 4.48.

Slika 4.47. Forma frmPrijemni Slika 4.48. Forma frmKandidat

C) (8 poena) Kreirati bazu Prijemni koja sadri dve povezane tabele (Kandidati i
StudijskiProgrami) iji su opisi dati. Popuniti sa par proizvoljnih zapisa obe tabele.


D) (10 poena) Prilikom uitavanja forme frmPrijemni DataGridView kontrola prikazuje sve
zapise iz tabele Kandidati baze Prijemni. Kolonu Studijski program prikazati kao
ComboBox, pri emu se ispisuje naziv studijskpog programa. U odgovarajui TextBox na
formi upisati i ukupan broj kandidata (videti sliku 4.47).
E) Implementirati meni Kandidat koji sadri dva podmenija: Novi i Pretraga.
1. (25 poena) Izborom opcije Novi otvara se forma frmKandidat sa slike 4.48.
Klikom na dugme Unesi proverava se da li su Broj prijave, Prezime i ime, Broj
poena i Studijski program popunjeni.
341

i. Ako jesu u tabeli Kandidati baze Prijemni se kreira novi zapis sa
unetim parametrima i kandidat sa unetim podacima ubacuje se u
generiki red kandidata. Korisniku se prikazuje MessageBox sa
odgovarajuom porukom i auriraju podaci u DataGridView kontroli.
Aurira se i ukupan broj kandidata.
ii. A ako nisu korisniku se prikazuje MessageBox sa odgovarajuom
porukom.
2. (20 poena) Izborom opcije Pretraga GroupBox pod nazivom Pretraga po
studijskom programu ini dostupnim za upis. U ComboBox-u se prikazuju svi
razliiti studijski programi za koje trenutno postoje prijavljeni kandidati. Izborom
nekog od njih prikazuje se lista sa imenima, prezimena i brojem poena kandidata
za izabrani studijski program.
F) (10 poena) Obezbediti da se prilikom zatvaranja forme frmKandidat kandidati iz
generikog reda upisuju u fajl PrijavljeniKandidati.txt i prikazuje MessageBox sa
odgovarajuim obavetenjem.
G) (15 poena) Implementirati konteksni meni Brisanje koji brie selektovani red u
DataGridView kontroli i korisniku se prikazuje MessageBox sa odgovarajuom porukom.
Aurira se i ukupan broj kandidata. Dogaaj kodirati bez upotrebe tipiziranog DataSet-a.
Napomena: Za sve manipulacije sa bazom obavezna je upotreba try-catch bloka.

Reenje:
Skript baze Prijemni:
USE [Prijemni]
GO
/****** Object: Table [dbo].[Kandidati] Script Date: 31.1.2014 10:28:49 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Kandidati](
[BrojPrijave] [int] NOT NULL,
[PrezimeIme] [nvarchar](30) NOT NULL,
[BrojPoena] [float] NOT NULL,
[StudijskiProgram] [int] NOT NULL,
CONSTRAINT [PK_Kandidati] PRIMARY KEY CLUSTERED
(
[BrojPrijave] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[StudijskiProgrami](
[StudijskiProgramID] [int] NOT NULL,
[Naziv] [nvarchar](35) NOT NULL,
CONSTRAINT [PK_StudijskiProgrami] PRIMARY KEY CLUSTERED
(
[StudijskiProgramID] ASC
342

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
INSERT [dbo].[Kandidati] ([BrojPrijave], [PrezimeIme], [BrojPoena], [StudijskiProgram])
VALUES (1, N'Maric Ivana', 78.25, 1)
INSERT [dbo].[Kandidati] ([BrojPrijave], [PrezimeIme], [BrojPoena], [StudijskiProgram])
VALUES (2, N'Zarko Vasic', 89.76, 1)
INSERT [dbo].[Kandidati] ([BrojPrijave], [PrezimeIme], [BrojPoena], [StudijskiProgram])
VALUES (3, N'Vanja Savic', 65.24, 2)
INSERT [dbo].[StudijskiProgrami] ([StudijskiProgramID], [Naziv]) VALUES (1,
N'Informacione tehnologije')
INSERT [dbo].[StudijskiProgrami] ([StudijskiProgramID], [Naziv]) VALUES (2, N'Elektronsko
poslovanje')
INSERT [dbo].[StudijskiProgrami] ([StudijskiProgramID], [Naziv]) VALUES (3, N'Racunarska
multimedija')
INSERT [dbo].[StudijskiProgrami] ([StudijskiProgramID], [Naziv]) VALUES (4, N'Organizcija
poslovnih sistema')
ALTER TABLE [dbo].[Kandidati] WITH CHECK ADD CONSTRAINT
[FK_Kandidati_StudijskiProgrami] FOREIGN KEY([StudijskiProgram])
REFERENCES [dbo].[StudijskiProgrami] ([StudijskiProgramID])
GO
ALTER TABLE [dbo].[Kandidati] CHECK CONSTRAINT [FK_Kandidati_StudijskiProgrami]
GO
USE [master]
GO
ALTER DATABASE [Prijemni] SET READ_WRITE
GO

// Konekcija.cs
class Konekcija
{
public static string konString = Properties.Settings.Default.PrijemniConnectionString;
}

// Kandidat.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Januar2014_integralni
{
class Kandidat
{
private int brojPrijave;
private string prezimeIme;
private double brojPoena;
private string studijskiProgram;

public int BrojPrijave
{ get; set; }

public string PrezimeIme
{ get; set; }

public double BrojPoena
{ get; set; }

public string StudijskiProgram
343

{ get; set; }

public Kandidat()
{
this.brojPrijave = 0;
this.prezimeIme = "";
this.brojPoena = 0;
this.studijskiProgram = "";
}

public Kandidat(int prijava, string ime, double poeni, string smer)
{
this.brojPrijave = prijava;
this.prezimeIme = ime;
this.brojPoena = poeni;
this.studijskiProgram = smer;
}

public override string ToString()
{
return "Prijavljen je " + this.prezimeIme + "(" + this.brojPrijave + ") za
studijski program: " + this.studijskiProgram + ".";
}
}
}

// frmPrijemni.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace Januar2014_integralni
{
public partial class frmPrijemni : Form
{
private SqlConnection konekcija = new SqlConnection(Konekcija.konString);

public frmPrijemni()
{
InitializeComponent();
}

private void brojKandidata()
{
tbBrojKandidata.Text = (dataGridView1.Rows.Count-1).ToString();
}

private void Form1_Load(object sender, EventArgs e)
{

this.studijskiProgramiTableAdapter.Fill(this.prijemniDataSet.StudijskiProgrami);
this.kandidatiTableAdapter.Fill(this.prijemniDataSet.Kandidati);

brojKandidata();
}
private void pretragaToolStripMenuItem_Click(object sender, EventArgs e)
344

{
groupBox1.Enabled = true;

try
{
konekcija.Open();

using (SqlCommand komanda = new SqlCommand("SELECT DISTINCT
StudijskiProgrami.Naziv FROM StudijskiProgrami INNER JOIN
Kandidati ON StudijskiProgrami.StudijskiProgramID =
Kandidati.StudijskiProgram", konekcija))
{
SqlDataReader reader = komanda.ExecuteReader();

while (reader.Read())
{
cbSmer.Items.Add(reader.GetValue(0).ToString());
}
}

}
catch (Exception ex)
{
MessageBox.Show("Greska: " + ex.Message);
}
finally
{
konekcija.Close();
}
}

private void cbSmer_SelectedIndexChanged(object sender, EventArgs e)
{
if (cbSmer.SelectedIndex != -1)
{
lbKandidatiSmer.Items.Clear();

try
{
konekcija.Open();

using (SqlCommand komanda = new SqlCommand("SELECT
Kandidati.PrezimeIme, Kandidati.BrojPoena FROM Kandidati INNER
JOIN StudijskiProgrami ON StudijskiProgrami.StudijskiProgramID
= Kandidati.StudijskiProgram where
StudijskiProgrami.Naziv=@smer", konekcija))
{
komanda.Parameters.Add(new SqlParameter("smer",
cbSmer.SelectedItem.ToString()));
SqlDataReader reader = komanda.ExecuteReader();

while (reader.Read())
{
lbKandidatiSmer.Items.Add(reader.GetValue(0).ToString());
}
}
}

catch (Exception ex)
{
MessageBox.Show("Greska: " + ex.Message);
}

finally
345

{
konekcija.Close();
}
}
}

private void brisiToolStripMenuItem_Click(object sender, EventArgs e)
{
if (dataGridView1.SelectedRows.Count > 0)
{
try
{
konekcija.Open();
using (SqlCommand komanda = new SqlCommand("delete from Kandidati
where BrojPrijave=@ID", konekcija))
{
komanda.Parameters.Add(new SqlParameter("ID",
int.Parse(dataGridView1.SelectedRows[0].Cells[0].Value.ToString())));
komanda.ExecuteScalar();
MessageBox.Show("Izabrani kandidat je izbrisan");
dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[0].Index);
}
}

catch (Exception ex)
{
MessageBox.Show("Greska: " + ex.Message);
}
finally
{
konekcija.Close();
}
brojKandidata();
}
}

private void noviToolStripMenuItem_Click(object sender, EventArgs e)
{
frmKandidat frm = new frmKandidat();
frm.ShowDialog();
this.kandidatiTableAdapter.Fill(this.prijemniDataSet.Kandidati);
brojKandidata();
}
}
}

// frmKandidat.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Collections.Generic; // dodato zbog Queue<Kandidat>

// dodato zbog KandidatiTableAdapter
using Januar2014_integralni.PrijemniDataSetTableAdapters;
using System.IO;

346

namespace Januar2014_integralni
{
public partial class frmKandidat : Form
{
Kandidat kandidat;
Queue<Kandidat> kandidati;


public frmKandidat()
{
kandidati = new Queue<Kandidat>();
InitializeComponent();
}

private void frmKandidat_Load(object sender, EventArgs e)
{
this.studijskiProgramiTableAdapter.Fill(this.prijemniDataSet.StudijskiProgrami);
}

private void btnUnesi_Click(object sender, EventArgs e)
{
if (tbBrojPrijave.Text == "" || tbPrezimeIme.Text == "" || tbPoeni.Text == ""
|| cbSmer.SelectedIndex == -1)
{
MessageBox.Show("Morate popuniti sva polja");
}
else
{
kandidat = new Kandidat(int.Parse(tbBrojPrijave.Text), tbPrezimeIme.Text,
Convert.ToDouble(tbPoeni.Text), cbSmer.Text);
kandidati.Enqueue(kandidat);
KandidatiTableAdapter taKandidat = new KandidatiTableAdapter();
taKandidat.Insert(int.Parse(tbBrojPrijave.Text), tbPrezimeIme.Text,
Convert.ToDouble(tbPoeni.Text),
int.Parse(cbSmer.SelectedValue.ToString()));

MessageBox.Show("Uspesan unos");
tbBrojPrijave.Clear();
tbPrezimeIme.Clear();
tbPoeni.Clear();
cbSmer.SelectedIndex = -1;
}
}

private void frmKandidat_FormClosing(object sender, FormClosingEventArgs e)
{
StreamWriter sw = new StreamWriter("PrijavljeniKandidati.txt");
foreach (Kandidat k in kandidati)
{
sw.WriteLine(k.ToString());
}
sw.Close();
MessageBox.Show("Fajl PrijavljeniKandidati.txt je uspeno snimljen",
"Obavestenje", MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
}
}
347

Prilog
1. Kreiranje backup-a baze i restore baze
1.1 Kreiranje backup-a
U SQL Server Management Studio-ju desni klik na naziv baze, opcija Tasks, pa Back Up
(Slika 1).

Slika 1. Kreiranje backup-a baze Slika 2. Podeavanja lokacije backup-a
Otvara se prozor kao na slici 2. Potrebno je izabrati bazu (Databases) i lokaciju
(Destination). Backup baze ima ekstenziju .bak.
1.2 Restore baze
U SQL Server Management Studio-ju desni klik na Databases, opcija Restore Databases
(Slika 3). Otvara se prozor kao na slici 4. Treba podesiti naziv baze u koju se unbackup-
uje, kao i odakle se uzima backup (From device). Na kraju ekirati Restore checkbox pored
naziva backup-a.

348


Slika 3. Restore baze Slika 4. Podeavanje opcija za restore baze
2. Kreiranje script-a baze i njeno startovanje
Script baze je neto kao jedna tekstualna datoteka u kojoj su specificirane akcije (SQL upiti)
koje treba izvriti da bi se baza ponovo uitala.
2.1 Kreiranje script-a
U SQL Server Management Studio-ju desni klik na naziv baze, opcija Tasks, pa Generate
Scripts (Slika 5).

Slika 5. Kreiranje script-a
349

Otvara se Wizard (Slika 6) u kome se izmeu ostalog definie za koju bazu se kreira script
(Slika 7).

Slika 6. Script Wizard Slika 7. Definisanje baze za koju se kreira script
Nakon definisanja baze treba izabrati objekte (Stored procedures i Tables) za koje se kreira
script (Slika 8). Zatim se bira gde se eli sauvati script (Slika 9). Za male baze izabrati
Script to New Query Window ili Script to Clipboard. Za velike baze od nekoliko giga ili ak i
tera izabrati Script to file.

Slika 8. Podeavanja Script objekata Slika 9. Podeavanja Script opcija

Ako se ele obaviti jo neka dodatna podeavanja bira se dugme Advanced. Tada se otvara
prozor prikazan na slici 10. Kako bi se omoguilo kreiranje i popunjavanje tabela setuje se
opcija Script DROP and CREATE na istoimenu vrednost, kao i Types of data to script na
Schema and data (videti sliku 10). U zavisnosti od toga da li je potrebno otvarati bazu i na
starijim verzijama SQL Servera mogue je definisati svojstvo Script for Server Version.
350


Slika 10. Dodatna podeavanja
Klikom na Next dobija se prozor koji sadri sumarni prikaz za skriptovanje. Kilik na Finish
zapoinje kreiranje script-a, nakon ega se generie prozor koji sadri obavetenje o
uspenosti procesa (Slika 11). Script ima ekstenziju .sql.

Slika 11. Obavetenje o uspenosti kreiranja script-a




351

Na slici 12. je prikazan deo skriptovanog fajla.

Slika 12. Deo SQL koda script fajla
2.2 Startovanje script-a
Script se startuje tako to se otvori u SQL Server Management Studio-ju. Klikom na Execute
ikonicu u ToolBar-u (padajui meni Query/Execute ili taster F5) on se startuje.
U sluaju da se startuje iako ta baza ve postoji, automatski se brie stara verzija i izvrava
script.
2.3 Script vs backup baze
Zato script, a ne backup? Izmeu ostalog i zbog veliine fajla. Na primer, za bazu Studenti
ija je veliina 3.072 KB, backup je 3.624 KB dok je script svega 37KB (Slika 13).


Slika 13. Script vs backup baze Studenti

352

3. Podeavanje kompatibilnosti baze sa prethodnim verzijama
SQL Server-a
U SQL Server Management Studio-ju desni klik na bazu i izabrati opciju Properties. S leve
strane prozora izabrati Options, a u desnom delu prozora postoji Compatibility level
combobox u kome se nalaze ranije verzije SQL Servera (Slika 14).

Slika 14. Podeavanje kompatibilnosti baze sa ranijim verzijama


353

Literatura
[1] Svetlana Aneli, Programerski alati, materijali sa nastave u elektronskoj formi, ITS
kolska 2013/2014 godina
[2] Svetlana Aneli, Programerski alati, materijali sa nastave u elektronskoj formi, ITS
kolska 2012/2013 godina
[3] Goran Aritonovi, Objektno programiranje, Beogradska poslovna kola, Beograd,
2010.

You might also like