You are on page 1of 49

Windows Forms kontrole

00:38:42

Jedinica: 4 od 40

U prethodne dve lekcije demonstriran je način na koji se kreira bazična Windows Forms aplikacija.
Tom prilikom je objašnjeno šta se dešava u pozadini kada se za razvoj koristi alat Visual Studio.

Ova lekcija biće posvećena osnovnim Windows Forms kontrolama. Originalna verzija Windowsa
definisala je osnovni set kontrola u koji se ubrajaju sledeće kontrole: Label, TextBox, Button,
RadioButton, CheckBox, ListBox, i ComboBox.

Controls
Veliki broj svojstava sve kontrole nasleđuju od svoje roditeljske klase System.Windows.Forms.Control.
Bez obzira na to o kojoj kontroli se radi, svojstva koja će biti predstavljena u nastavku ovog pasusa
zajednička su za sve kontrole i njima se može manipulisati preko panela Properties.

Svojstvo Opis

Font čita ili postavlja font kontrole


ForeColor čita ili postavlja boju prednjeg plana kontrole, najčešće teksta
BackColor čita ili postavlja boju pozadine kontrole
Bounds čita ili postavlja veličinu i lokaciju kontrole u pikselima, u odnosu na roditeljsku kontrolu
ClientRectangle čita pravougaonik koji predstavlja klijentsku oblast kontrole
Cursor čita ili postavlja izgled kursora kada se on nađe iznad kontrole
Enabled čita ili postavlja podatak da li je kontrola omogućena
Focused sadrži vrednost koja ukazuje na to da li je kontrola vlasnik fokusa
Height sadrži vrednost visine kontrole
Width sadrži vrednost širine kontrole
Visible sadrži vrednost koja ukazuje na to da li će kontrola biti vidljiva ili neće
Text sadrži tekst kontrole

Parent sadrži informaciju o roditeljskoj kontroli


Pored javnih svojstava, Control klasa definiše i određene javne metode dostupne svim kontrolama.

Metoda Opis

BringToFront utiče na vrednost z-ordera, odnosno povećava njegovu vrednost


SendToBack smanjuje vrednost z-ordera
GetNextControl vraća narednu kontrolu u tab organizaciji
Invalidate izaziva ponovno iscrtavanja svih delova kontrole

PointToClient određuje lokaciju određene tačke na ekranu u zavisnosti od kontrole

Klasa Control poseduje i nekoliko javnih eventa.

Event Opis
Click do njega dolazi kada se izvrši klik na kontrolu
KeyPress dešava se kada se pritisne taster, dok kontrola poseduje fokus
MouseUp dešava se kada se taster miša otpusti unutar kontrole
Paint dešava se onda kada je potrebno ponovo iscrtati neki deo ili celu kontrolu

Windows Forms tehnologija je prevashodno zamišljena za rad korišćenjem Designer moda Visual
Studio alata. Sve kontrole prikazane u nastavku lekcije na formu se dodaju jednostavnim
prevlačenjem iz panela Toolbox.
4.1 – Toolbox panel sa najčešće korišćenim WinForms kontrolama

Label
Kontrola koja se najčešće koristi za označavanje drugih kontrola na formi jeste Label kontrola.
Obično sadrži kratak informativni tekst.

4.2 – Label kontrola


Label kontrola se dodaje jednostavnim prevlačenjem Label kontrole iz Toolboxa unutar okruženja
Visual Studio.

Prilikom dodavanja kontrole, Visual Studio za nas generiše određeni kôd unutar designer fajla.

 code
 source

1. this.label1.AutoSize = true;

2.

3. this.label1.Location = new System.Drawing.Point(558, 116);

4.

5. this.label1.Name = "label1";

6.

7. this.label1.Size = new System.Drawing.Size(35, 13);

8.

9. this.label1.TabIndex = 0;

10.

11. this.label1.Text = "label1";

12.

U nastavku prikazane linije biće detaljno objašnjene.

Svojstvo AutoSize koristi se da utvrdi da li će kontrola menjati svoju veličinu kako bi se prilagodila
veličini sadržaja. To je u ovom slučaju tekst, tako da će u situacijama kada je tekst veći od kontrole
Label kontrola povećavati svoju veličinu.

Svojstvo Location određuje poziciju kontrole unutar forme. Lokacija se definiše navođenjem početne
(gornje leve) tačke i to definisanjem koordinata x i y.

Svojstvo Name se odnosi na naziv promenljive, po kojoj će ova kontrola biti dostupna u kodu.

Svojstvo Size prihvata veličinu kontrole u pikselima i to izraženu korišćenjem tipa


System.Drawing.Size.
TabIndex je svojstvo koje definiše redosled kojim se kontrole dodaju formi. Može imati celobrojnu
vrednost, počevši od nule.

Na kraju, svojstvo Text definiše tekst ove Label kontrole, odnosno, onaj tekst koji će biti prikazan
korisniku na formi.

Iako se u najvećem broju slučajeva koristi kao statična kontrola, i kod Label kontrole je moguće
slušati određene evente.

Sledeći primer prikazuje metodu za obradu događaja klika na Label kontrolu. Dodatno, primer
ilustruje i način na koji je moguće promeniti boju teksta Label kontrole, korišćenjem svojstva
ForeColor.

 code
 source

1. private void label1_Click(object sender, EventArgs e)

2.

3. {

4.

5. Random random = new Random();

6.

7. label1.ForeColor = Color.FromArgb(random.Next(0, 255),


random.Next(0, 255), random.Next(0, 255));

8.

9. }

10.

Prilikom svakog klika na Label kontrolu dolazi do promene boje teksta. Boja teksta postavlja se
nasumično. Ta boja se dobija upotrebom metode FromArgb i definisanjem svake komponente boje
zasebno.
4.3 – Label kontrola unutar prozora aplikacije

Button
Ovo je kontrola koja je već pominjana u prethodnoj lekciji i svakako predstavlja jednu od osnovnih
kontrola grafičkog okruženja. Postoji nekoliko vrsta Button kontrola i sve one nasleđuju osnovnu
ButtonBase klasu. Predmet ovog pasusa je kontrola Button klase. Ova klasa predstavlja običnu taster
kontrolu. Taster može sadržati tekst, sliku ili i tekst i sliku. Sama Button klasa je deo
System.Windows.Forms prostora imena i, kao što je rečeno, nasleđuje klasu ButtonBase i
implementira IButtonControl interfejs.

4.4 – Button kontrola

Kada se govori o Button kontroli, nema se mnogo šta reći. Ova kontrola se najčešće koristi da bi
korisnik pokrenuo neku akciju.

Kada se govori o specifičnim svojstvima i metodama ove klase, oni su prikazani u tabelama koje
slede.

Svojstvo Opis
AutoSizeMode definiše kako će se veličina kontrole menjati kada je AutoSize uključen
DialogResult ukazuje na vrednost koja će biti prosleđena roditeljskoj kontroli kada dođe do klika ove kontrole

Metoda Opis
NotifyDefault informiše Button kontrolu da li je podrazumevana kontrola tog tipa na formi
PerformClick generiše klik event na kontroli

Button kontrola će najčešće biti korišćena za pokretanje neke akcije, te će vrlo često postojati
potreba za dodavanjem event handlera za Click event. Evo jednog takvog primera:

 code
 source

1. private void button1_Click(object sender, EventArgs e)

2.

3. {

4.

5. MessageBox.Show("Button Clicked!");

6.

7. }

8.

4.5 – Click na Button kontrolu


RadioButton
RadioButton je kontrola koja se gotovo uvek upotrebljava u grupi. Jednostavno rečeno, više
RadioButton kontrola sačinjava jednu grupu, koja nudi odabir između više međusobno isključivih
opcija.

Studije koje su za temu imale proučavanje efektivnosti korisničkog interfejsa pokazale su da se


korisnici najbolje snalaze kada postoji manje od 7 ponuđenih opcija. Ovo pravilo u potpunosti važi i
za RadioButton kontrole. Ukoliko je potrebno prikazati više opcija korisniku, potrebo je razmisliti o
upotrebi ComboBox kontrole, o kojoj će više reči biti u nastavku. Prednost RadioButton kontrola je ta
što su sve opcije uvek vidljive na formi.

Za grupisanje više RadioButton kontrola mogu poslužiti kontrole za grupisanje kao što su Panel ili
TabPage, ali se za tu svrhu ipak najčešće koristi kontrola GroupBox.

Prvi korak u kreiranju grupe RadioButton kontrole jeste dodavanje upravo GroupBox kontrole formi.

4.6 – GroupBox kontrola

Nakon ovoga se može pristupiti i dodavanju RadioButton kontrola i to prevlačenjem unutar upravo
dodate GroupBox kontrole.

Podešavanje svojstava RadioButton kontrole postiže se kao i za bilo koju drugu kontrolu, upotrebom
menija Properties.

Finalni izgled grupe RadioButton kontrola može biti kao na slici 4.7.
4.7 – RadioButton kontrole koje predstavljaju jednu grupu

Dodavanjem kontrola na formu u pozadini će biti generisan kompletan kod za podešavanje ovih
kontrola.

RadioButton klasa definiše neke specifične metode, svojstva i evente. Oni su prikazani u narednim
tabelama.

Svojstva:

Svojstvo Opis
Appearance određuje izgled kontrole; izgled standardnog RadioButtona ili izgled tastera Toggle
AutoCheck određuje da li će RadioButton promeniti svoje stanje prilikom klika
CheckAlign podešava poravnanje i raspored teksta i ikonice unutar kontrole
Checked definiše trenutno stanje kontrole (čekirano/nečekirano)

Metoda:

Metoda Opis
PerformClick izvršava klik događaj na kontroli

Event:

Događaj Opis
CheckedChanged trigeruje se u trenutku kada dođe do promene Checked svojstva

CheckBox
CheckBox kontrola je veoma slična upravo prikazanoj RadioButton kontroli. Ipak, za razliku od
RadioButton kontrole, CheckBox se u najvećem broju slučajeva koristi samostalno, za evaluaciju
true/false vrednosti.

4.8 – CheckBox kontrola


CheckBox klasa se koristi za predstavljanje upravo opisane kontrole. Inicijalno, ova kontrola može biti
u jednom od dva stanja, čekiranom ili nečekiranom, ali je moguće uvesti i treće, neodređeno stanje.

U nastavku je dat pregled specifičnih svojstava i događaja klase CheckBox.

Svojstvo Opis
Appearance određuje izgled kontrole; standardni izgled ili izgled koji odgovara Toggle button kontroli

AutoCheck da li će CheckBox promeni stanje priliko klika


CheckAlign određuje poravnanje i raspored teksta i ikonice kontrole
Checked određuje da li je CheckBox trenutno čekiran
CheckState postavlja ili čita trenutno stanje CheckBoxa koji poseduje tri stanja i to kao vrednost enumeracione konstante
CheckState, koja može imati vrednosti Checked, Unchecked ili Intermediate
ThreeState definiše da li kontrola podržava treće, neodređeno stanje

Event Opis
CheckedChanged okida se kada dođe do promene Checked svojstva
CheckStateChanged okida se kada dođe do promene CheckState svojstva

TextBoxes
Posebnu grupu kontrola čine one koje omogućavaju korisniku unos teksta. U ovom kursu biće
predstavljene tri takve kontrole, koje imaju zajedničkog roditelja, klasu TextBoxBase.
4.9 – Windows Forms kontrole za rad sa tekstom

Osnovna klasa TextBoxBase definiše mnoštvo svojstava, metoda i događaja, zajedničkih za sve
kontrole za manipulaciju tekstom. U nastavku je dat pregled ovih stanja i ponašanja.

Svojstvo Opis
AcceptsTab definiše da je kontrola sa višelinijskim tekstom, dozvoljava upotrebu Tab karaktera, ili jednostavno pritiskom ovog
tastera prosleđuje fokus na sledeću kontrolu
CanUndo određuje da li kontrola podržava povratak na prethodno stanje nakon editovanja
Lines sadrži linije teksta kontrole koja podražava unos višelinijskog teksta i to kao niz String vrednosti, pri čemu svaki
član niza predstavlja jednu liniju teksta
MaxLength sadrži informaciju o maksimalnom broju karaktera koje kontrola može da prihvati
Multiline sadrži podatak o tome da li kontrola podražava unos višelinijskog teksta
ReadOnly sadrži informaciju o tome da li je tekst kontrole izmenljiv
SelectedText sadrži trenutno selektovani tekst
SelectedStart sadrži informaciju o indeksu prvog karaktera selektovanog teksta
TextLength poseduje informaciju o dužini teksta unetog u kontrolu (readonly)
WordWrap definiše da li će tekst dugačkih linija biti prelaman u novi red

Posebno su korisne i metode koje su definisane u klasi TextBoxBase i koje su na raspolaganju svim
kontrolama za baratanje tekstom.

Metoda Opis
AppendText dodaje string na već postojeći tekst kontrole
Copy dodaje aktuelni tekst kontrole u Windows clipboard
Paste menja trenutno selektovani tekst kontrole sa tekstom iz clipboarda
SelectAll selektuje kompletan tekst kontrole
Select selektuje deo teksta kontrole
Undo vraća tekst kontrole u prethodno stanje

TextBox kontrola se koristi kada je potrebno korisniku omogućiti jednostavan unos ili izmenu teksta.
RichTextBox omogućava naprednije formatiranje teksta i mogućnost prikaza kako običnog, tako i
teksta u formatu RTF. Takođe, ova kontrola omogućava brojna formatiranja jednog dela, ili celog
teksta. MaskedTextBox omogućava na jednostavan način unos teksta u nekom predefinisanom
formatu definisanjem maske.

4.10 – TextBox, RichTextBox i MaskedTextBox kontrole

MaskedTextBox

Srce ove kontrole predstavlja svojstvo Masked. Ovo svojstvo definiše format sadržaja koji se može
uneti u kontrolu. Na primer, maska poštanskog broja dozvoljava unos tačno 5 cifara.
Za kreiranje maski potrebno je poznavati specijalnu sintaksu prikazanu u tabeli:

Značenje
Karakter Opis

0 obavezna cifra prihvata bilo koju cifru od 0 do 9


9 opciona cifra ili prazan prostor prihvata bilo koju cifru od 0 do 9 ili prazan prostor
# opciona cifra ili prazan prostor prihvata bilo koju cifru, prazan prostor, karakter + ili -
L obavezno slovo prihvata bilo koje ASCII slovo
? opciono slovo prihvata bilo koje ASCII slovo
& obavezni karater prihvata bilo koji nekontrolni karakter
C opcioni karakter prihvata bilo koji karakter
A obavezni alfa prihvata bilo koje slovo ili cifru
a opcioni alfa prihvata bilo koje slovo ili cifru

Pored ovih, specijalnih karaktera koji ukazuju na to šta sme, a šta ne sme da se pojavi u korisničkom
unosu, prilikom definicije maske mogu se koristiti i određeni karakteri koji imaju ulogu separatora, a
oni će biti verno preneti na tekst kontrole. Oni su prikazani u sledećoj tabeli.

Karakter separatora

.
,
:
/
$

Pri kreiranju maske mogu se koristiti i karakteri koji utiču na tekst koji korisnik unosi. Oni su prikazani
u sledećoj tabeli.

Karakter Opis
< pretvara sve karaktere u mala slova
> pretvara sve karaktere u velika slova
| poništava prethodno definisana pretvaranja u velika ili mala slova
\ escape karakter za štampanje specijalnih karaktera
Primer

Sledeća maska:

00000

dozvoljava kreiranje zapisa od tačno 5 cifara.

Maska se može definisati korišćenjem opcije Properties panela, kao na slici 4.11.

4.11 – Definisanje Mask svojstva

Ukoliko je potrebno kreirati polje za unos teksta u nekom predefinisanom formatu, koju
kontrolu je potrebno koristiti?

TextBox

Label

MaskedTextBox

RichTextBox
ListControls
ListBox, zajedno sa srodnom kontrolom ComboBox, omogućava prezentovanje kolekcije stavki
korisniku.

ListBox kontrola omogućava prezentovanje liste objekata, od kojih se svakim može individualno
manipulisati.

Osnovna klasa od koje sve ovakve kontrole nasleđuju jeste klasa ListControl.

4.12 – Windows Forms kontrole za rad sa kolekcijama

Neke od zajedničkih osobina svih ovakvih kontrola su:

Svojstvo Opis
DataSource predstavlja izvor podataka kontrole
DisplayMember sadrži naziv propertija klase stavke koji će biti prikazan u listi

FormatString definiše string koji se koristi za formatiranje svake stavke

FormattingEnabled sadrži informaciju o tome da li je formatiranje omogućeno


SelectedIndex sadrži informaciju o indeksu selektovane stavke
SelectedValue sadrži objektnu vrednost trenutno selektovane stavke
ValueMember sadrži informaciju o imenu propertija stavke koji će biti vraćen kao vrednost stavke; ukoliko ova vrednost nije
postavljena, vraća se kompletan objekat stavke

Listbox

4.13 – ListBox kontrola

Dodavanje stavki listi

ListBox kontrola poseduje svojstvo Items, što je zapravo kolekcija stavki koje kontrola sadrži.
Manipulacijom ovom kolekcijom može se uticati na stavke kolekcije.

Za jednostavno dodavanje stavke ListBox kontroli, pod uslovom da se ona zove listBox1, može se
napisati ovakva linija koda:

 code
 source

1. listBox1.Items.Add("ListBox Item");
2.

Moguće je dodavati stavke i na određenu poziciju i to korišćenjem metode Insert, na sledeći način:

 code
 source

1. listBox1.Items.Insert(1, p1);

2.

Određene Windows Forms kontrole imaju mogućnost direktne interakcije sa klasama kolekcija. Tako
je moguće korišćenjem svojstva DataSource postaviti izvor podataka kontrole i to u obliku neke
kolekcije podataka.

Data je sledeća klasa koja modeluje pojam osobe:

 code
 source

1. public class Person

2.

3. {

4.

5.

6.

7. public string FirstName { get; set; }

8.

9. public string LastName { get; set; }

10.

11.

12.

13. public string FullName

14.
15. {

16.

17. get { return FirstName + " " + LastName; }

18.

19. private set { }

20.

21. }

22.

23.

24.

25. public DateTime DateOfBirth { get; set; }

26.

27.

28.

29. public string Postal { get; set; }

30.

31. public string Email { get; set; }

32.

33. public float Weight { get; set; }

34.

35.

36.

37. public Person()

38.

39. {
40.

41.

42.

43. }

44.

45.

46.

47. public Person(string FirstName, string LastName, DateTime DateOfBirth,


string Postal, string Email, float Weight)

48.

49. {

50.

51. this.FirstName = FirstName;

52.

53. this.LastName = LastName;

54.

55. this.DateOfBirth = DateOfBirth;

56.

57. this.Postal = Postal;

58.

59. this.Email = Email;

60.

61. this.Weight = Weight;

62.

63. }

64.
65.

66.

67. }

68.

Funkcionalnost koja bi postavila izvor podataka ListBox kontrole mogla bi da se enkapsulira u jednu
metodu, koja bi izgledala ovako:

 code
 source

1. private void loadList()

2.

3. {

4.

5. Person p1 = new Person();

6.

7. p1.FirstName = "John";

8.

9. p1.LastName = "Davidson";

10.

11.

12.

13. Person p2 = new Person();

14.

15. p2.FirstName = "Mark";

16.

17. p2.LastName = "Wilkinson";


18.

19.

20.

21. List<Person> Persons = new List<Person>();

22.

23. Persons.Add(p1);

24.

25. Persons.Add(p2);

26.

27.

28.

29. listBox1.DataSource = Persons;

30.

31. listBox1.DisplayMember = "FullName";

32.

33. }

34.

U prvih šest linija ove metode kreiraju se objekti tipa person i postavljaju se vrednosti njihovih
svojstava FirstName i LastName. Zatim se kreira kolekcija objekata tipa Person i njoj se dodaju dve
kreirane instance ove klase. Na kraju se postavljaju vrednosti svojstava DataSource i DisplayMember.
DataSource ukazuje na izvor podataka kontrole, što je u našem slučaju kolekcija sa nazivom Persons.
Svojstvo DisplayMember definiše svojstvo izvora podataka koje će se koristiti za prikaz stavki u
kontroli. Ovaj podatak se prosleđuje kao String vrednost koja se mora podudariti sa nazivom svojstva
u klasi. Upravo zbog ovoga je u klasi Person i kreiran poseban read only property čija je jedina uloga
da se koristi u ovakvim situacijama reprezentacije u List kontrolama.

Selektovanje stavki

ListBox klasa poseduje mogućnost selektovanja jedne ili više stavki u listi koju prikazuje.
Podrazumevano, samo jedna stavka može biti selektovana u jednom trenutku, ali se ovakvo
ponašanje može lako promeniti, što će biti prikazano kasnije.
Dva ključna propertija koja omogućavaju selektovanje stavki jesu SelectedItem and SelectedIndex.
Prvi sadrži objektivnu reprezentaciju stavke, a drugi indeks stavke u listi.

Praćenje promena selekcije

Praćenje promene selekciju u ListBoxu se ostvaruje praćenjem promena upravo prikazanih propertija.

Event Opis
SelectedIndexChanged trigeruje se u trenutku promene indeksa selektovane stavke
SelectedValueChanged trigeruje se u trenutku promene vrednosti selektovane stavke

Za svaki od propertija postoji odgovarajući event.

Metoda za obradu eventa promene indeksa selektovane stavke može izgledati kao u nastavku:

 code
 source

1. private void listBox1_SelectedIndexChanged(object sender, EventArgs e)

2.

3. {

4.

5. Console.WriteLine("Selected Index Changed. Current Index is: " +


listBox1.SelectedIndex);

6.

7. }

8.

Metoda za obradu eventa promene vrednosti selektovane stavke može izgledati kao u nastavku:

 code
 source

1. private void listBox1_SelectedValueChanged(object sender, EventArgs e)

2.

3. {
4.

5.

6.

7. if (listBox1.SelectedItem != null)

8.

9. {

10.

11. Person selectedPerson = (Person)listBox1.SelectedItem;

12.

13. Console.WriteLine("Selected Value Changed. Current Value is: "


+ selectedPerson.FullName);

14.

15. }

16.

17. }

18.

Selekcija više stavki

Kao što je već rečeno, inicijalno, ListBox dozvoljava selektovanje samo jedne stavke. Na ovo
ponašanje se može uticati i to uz pomoć propertija SelectionMode. Ovo je zapravo enumeracija, koja
poznaje nekoliko enumeracionih konstanti.

Enumeraciona
Opis
konstanta
None stavke se ne mogu selektovati
One samo jedna stavka može biti selektovana
MultiSimple više stavki može biti selektovano korišćenjem miša ili spacebara
MultiExtended više stavki može biti selektovano, korišćenjem miša, spacebara, prevlačenjem ili upotrebom kombinacije
tastera Shift, Ctrl i strelica
Kada je selektovanje više stavki omogućeno u ListBox kontroli, mora se voditi računa i o utvrđivanju
selektovanih stavki, s obzirom na to da sada u jednom trenutku može biti isporučen veći broj
selektovanih stavki.

Baš kao što svojstvo Items sadrži kolekciju stavki liste, tako postoje svojstva koja sadrže kolekcije
selektovanih stavki i njihovih indeksa. Reč je o svojstvima SelectedObjectCollection i
SelectedIndexCollection, odnosno o kolekciji selektovanih stavki i kolekciji selektovanih indeksa,
respektivno. Svojstva kojima se rukuje ovim kolekcijama su SelectedItems i SelectedIndices,
respektivno.

Metode za obradu eventa, prikazanih u jednom od prethodnih pasusa, sada moraju imati malo
drugačiju logiku.

 code
 source

1. private void listBox1_SelectedIndexChanged(object sender, EventArgs e)

2.

3. {

4.

5.

6.

7. string message = "";

8.

9.

10.

11.

12.

13. if (listBox1.SelectedIndices.Count > 0)

14.

15. {

16.
17. for (int i = 0; i < listBox1.SelectedIndices.Count; i++)

18.

19. {

20.

21. message += listBox1.SelectedIndices[i];

22.

23.

24.

25. if (i < listBox1.SelectedIndices.Count - 1)

26.

27. {

28.

29. message += ", ";

30.

31. }

32.

33. }

34.

35.

36.

37. Console.WriteLine("Selected Index Changed. Current Index is: "


+ message);

38.

39. }

40.

41. }
42.

Metoda za obradu promene selektovane vrednosti:

 code
 source

1. private void listBox1_SelectedValueChanged(object sender, EventArgs e)

2.

3. {

4.

5.

6.

7. String message = "";

8.

9.

10.

11. if (listBox1.SelectedItems != null)

12.

13. {

14.

15.

16.

17.

18.

19. for (int i = 0; i < listBox1.SelectedItems.Count; i++)

20.

21. {
22.

23. Person selectedPerson = (Person)listBox1.SelectedItems[i];

24.

25.

26.

27. message += selectedPerson.FullName;

28.

29.

30.

31. if (i < listBox1.SelectedItems.Count - 1)

32.

33. {

34.

35. message += ", ";

36.

37. }

38.

39.

40.

41. }

42.

43.

44.

45. Console.WriteLine("Selected Value Changed. Current Value is: "


+ message);

46.
47. }

48.

49.

50.

51. }

52.

Uklanjanje stavki

Za uklanjanje stavki iz kolekcije može se koristiti metoda RemoveAt nad kolekcijom Items, koja
prihvata indeks stavke koju je potrebno ukloniti.

Za uklanjanje druge stavke kolekcije može se napisati:

 code
 source

1. listBox1.Items.RemoveAt(1);

2.

ComboBox
ComboBox je sledeća kontrola iz seta osnovnih Windows kontrola kojoj će biti posvećena pažnja u
ovom kursu. ComboBox je zapravo kontrola veoma slična ListBoxu, s razlikom što je inicijalno vidljiva
samo selektovana stavka, dok ostale postaju vidljive otvaranjem padajućeg (drop-down) menija.
Takođe, ComboBox poseduje i neke osobine TextBox kontrole.

4.14 – ComboBox kontrola


Jednostavno, može se reći da sa ComboBox sastoji iz TextBox dela i List dela. TextBox deo može biti
vidljiv ili nevidljiv, i on sadrži vrednost trenutno selektovane stavke. List odeljak takođe može biti
vidljiv ili nevidljiv, a sadrži sve ostale stavke kontrole.

Osnova ove kontrole jeste ComboBox klasa.

Svojstvo Opis
DropDownStyle definiše izgled DropDown kontrole
DropDownWidth definiše širinu padajućeg dela ComboBox kontrole
DroppedDown ukazuje da li je ComboBox trenutno otvoren ili nije
Items predstavlja kolekciju stavki kontrole
MaxDropDownItems definiše maksimalni broj elemenata u padajućem delu kontrole
MaxLength definiše maksimalni broj karaktera u tekstualnom delu kontrole
SelectedItem sadrži trenutno selektovanu stavku
SelectedText sadrži trenutno selektovan tekst, u tekstualnom delu kontrole
Sorted ukazuje na to da li je potrebno da stavke u list delu budu sortirane

Metoda Opis
FindString pronalazi prvu stavku koja počinje navedenim tekstom
SelectAll selektuje kompletan tekst u tekstualnom delu kontrole

Event Opis
DropDown trigeruje se neposredno pre prikaza padajućeg dela kontrole
DropDownClosed trigeruje se kada se padajući deo kontrole zatvori
SelectedIndexChanged trigeruje se kada dođe do promene indeksa selektovane stavke
SelectedValueChanged trigeruje se kada dođe do promene selektovane vrednosti
SelectionChangeCommitted trigeruje se kada se izvrši selekcija stavke i zatvori padajući deo, ali isključivo od korisnika

Izgled ComboBox kontrole

Na izgled ComboBox kontrole, pa samim tim i na dostupne funkcionalnosti, može se uticati


definisanjem DropDownStyle svojstva, koje može imati neku od vrednosti enumeracionih konstanti,
enumeracije ComboBoxStyle.

Enumeraciona konstanta Opis


DropDown lista se prikazuje klikom na strelicu, a tekstualni odeljak je editabilan
DropDownList lista se prikazuje klikom na strelicu, a tekstualni odeljak nije editabilan
Simple lista je uvek vidljiva, a tekstualni odeljak je izmenljiv

Kreiranje ComboBox kontrole i popunjavanje stavkama

Dodavanje ComboBox kontrole, baš kao i svake druge, postiže se jednostavnim prevlačenjem
kontrole na formu, korišćenjem razvojnog okruženja Visual Studio.

ComboBox kontrola, baš kao i ListBox, poseduje svojstvo Items, koje predstavlja kolekciju stavki
kontrole. Manipulacijom ovom kolekcijom, manipuliše se stavkama kontrole.

Sledeća linija koda ilustruje jednostavno dodavanje tekstualnih stavki kontroli:

 code
 source

1. comboBox1.Items.AddRange(new object[] { "1", "2", "3", "4", "5" });

2.

Za pojedinačno dodavanje stavki može se koristiti metoda Add.

 code
 source

1. comboBox1.Items.Add("6");

2.

ComboBox kontrola, baš kao i ListBox, poseduje svojstvo DataSource i DisplayMember za


postavljanje izvora podataka kontrole.

Selektovanje stavki

Logika vezana za selektovanje stavki je nešto drugačija kod ComboBoxa nego kod ListBoxa. ListBox
dozvoljava višestruku selekciju, dok to sa ComboBoxom nije slučaj.

Obe kontrole podržavaju SelectedIndexChanged događaj. Kod ComboBoxa, ovaj event se okida kada
dođe do promene indeksa selektovane stavke, bilo da je to pokrenuo korisnik ili je pokretanje
programabilno. ComboBox kontrola poznaje još jedan event vezan za selekciju stavki. Reč je o eventu
SelectionChangeCommitted. Ovaj event se okida kada korisnik izvrši selekciju i zatvori padajući menu
ComboBox kontrole. Za razliku od ostalih eventa

 code
 source

1. private void comboBox1_SelectedIndexChanged(object sender, EventArgs


e)

2.

3. {

4.

5. Console.WriteLine("Selection Changed. Current Index is: " +


comboBox1.SelectedIndex);

6.

7. }

8.

9.

10.

11. private void comboBox1_SelectionChangeCommitted(object sender,


EventArgs e)

12.

13. {

14.

15. Console.WriteLine("Selection Change Committed. Current Value is: "


+ comboBox1.SelectedIndex);

16.

17. }

18.

Zaključak
Prethodne tri lekcije imale su za cilj da vam približe postupak razvoja grafičkog interfejsa korišćenjem
tehnologije Windows Forms. Može se zaključiti je sledeće:

 raspoređivanje kontrola se obavlja korišćenjem apsolutnih koordinata, što je veoma loše za


razvoj prilagodljivog UI-ja,

 promena izgleda i ponašanja kontrola je veoma komplikovana i ograničena,

 razvoj je veoma tesno povezan sa razvojnim okruženjem i korišćenjem dizajnera, što otežava
razumevanje i smanjuje slobodu,

 kreiranje bogatog grafičkog okruženja uz upotrebu animacija je otežano,

 renderovanje se obavlja piksel po piksel bez hardverske akceleracije.

Sve pomenute nedostatke ispravlja tehnologija WPF, kojoj će biti posvećen ostatak kursa.

Primer

Potrebno je napraviti aplikaciju sa jednim prozorom koja će sadržati Master-Detail pregled podataka
o
osobama u sistemu. Izgled aplikacije je potrebno da bude sledeći:

4.15 – Izgled Demo aplikacije

Baza podataka
 code
 source

1. USE [Test]

2.

3. GO

4.

5.

6.

7. CREATE TABLE [dbo].[Person](

8.

9. [id] [int] IDENTITY(1,1) NOT NULL,

10.

11. [first_name] [nvarchar](50) NOT NULL,

12.

13. [last_name] [nvarchar](50) NOT NULL,

14.

15. [date_of_birth] [date] NOT NULL,

16.

17. [is_deleted] [int] NULL,

18.

19. CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED

20.

21. (

22.

23. [id] ASC

24.
25. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

26.

27. ) ON [PRIMARY]

28.

29.

30.

31. GO

32.

33. Person klasa:

34.

35. using System;

36.

37. using System.Collections.Generic;

38.

39. using System.Configuration;

40.

41. using System.Data.SqlClient;

42.

43. using System.Linq;

44.

45. using System.Text;

46.

47. using System.Threading.Tasks;

48.

49.
50.

51. namespace DemoWinFormsApp

52.

53. {

54.

55. public class Person

56.

57. {

58.

59.

60.

61. #region Fields

62.

63.

64.

65. private int _id;

66.

67. private string _firstName;

68.

69. private string _lastName;

70.

71. private DateTime _dateOfBirth;

72.

73.

74.
75. #endregion

76.

77.

78.

79. #region Properties

80.

81.

82.

83. public int Id

84.

85. {

86.

87. get { return _id; }

88.

89. set

90.

91. {

92.

93. if (_id == value)

94.

95. {

96.

97. return;

98.

99. }
100.

101. _id = value;

102.

103. }

104.

105. }

106.

107.

108.

109. public string FirstName

110.

111. {

112.

113. get { return _firstName; }

114.

115. set

116.

117. {

118.

119. if (_firstName == value)

120.

121. {

122.

123. return;

124.
125. }

126.

127. _firstName = value;

128.

129. }

130.

131. }

132.

133. public string LastName

134.

135. {

136.

137. get { return _lastName; }

138.

139. set

140.

141. {

142.

143. if (_lastName == value)

144.

145. {

146.

147. return;

148.

149. }
150.

151. _lastName = value;

152.

153. }

154.

155. }

156.

157.

158.

159. public string FullName

160.

161. {

162.

163. get { return _firstName + " " + _lastName; }

164.

165. }

166.

167.

168.

169. public DateTime DateOfBirth

170.

171. {

172.

173. get { return _dateOfBirth; }

174.
175. set

176.

177. {

178.

179. _dateOfBirth = value;

180.

181. }

182.

183. }

184.

185.

186.

187.

188.

189. #endregion

190.

191.

192.

193. #region Constructor

194.

195.

196.

197. public Person(int Id, string FirstName, string LastName, DateTime


DateOfBirth)

198.

199. {
200.

201. this.FirstName = FirstName;

202.

203. this.LastName = LastName;

204.

205. this.DateOfBirth = DateOfBirth;

206.

207. this.Id = Id;

208.

209. }

210.

211.

212.

213. public Person()

214.

215. {

216.

217.

218.

219. }

220.

221.

222.

223.

224.
225. #endregion

226.

227.

228.

229. #region Data Access

230.

231.

232.

233. public static List<Person> GetAllPersons()

234.

235. {

236.

237.

238.

239. List<Person> persons = new List<Person>();

240.

241. Person person = null;

242.

243.

244.

245. using (SqlConnection conn = new SqlConnection())

246.

247. {

248.

249. conn.ConnectionString =
ConfigurationManager.ConnectionStrings["ConnString"].ToString();
250.

251. conn.Open();

252.

253.

254.

255. SqlCommand command = new SqlCommand("SELECT id, first_name,


last_name, date_of_birth FROM Person WHERE is_deleted = 0", conn);

256.

257.

258.

259. using (SqlDataReader reader = command.ExecuteReader())

260.

261. {

262.

263. while (reader.Read())

264.

265. {

266.

267. person = new Person((int)reader["id"],


(string)reader["first_name"], (string)reader["last_name"],
(DateTime)reader["date_of_birth"]);

268.

269. persons.Add(person);

270.

271. }

272.

273. }
274.

275.

276.

277. }

278.

279. return persons;

280.

281. }

282.

283.

284.

285. #endregion

286.

287. }

288.

289. }

290.

291. MainWindow.cs

292.

293. using System;

294.

295. using System.Collections.Generic;

296.

297. using System.ComponentModel;

298.
299. using System.Data;

300.

301. using System.Drawing;

302.

303. using System.Linq;

304.

305. using System.Text;

306.

307. using System.Threading.Tasks;

308.

309. using System.Windows.Forms;

310.

311.

312.

313. namespace DemoWinFormsApp

314.

315. {

316.

317. public partial class MainWindow : Form

318.

319. {

320.

321.

322.

323. #region Fields


324.

325.

326.

327. private List<Person> persons = new List<Person>();

328.

329. private Person currentPerson = new Person();

330.

331.

332.

333. #endregion

334.

335.

336.

337. #region Constructors

338.

339.

340.

341. public MainWindow()

342.

343. {

344.

345. InitializeComponent();

346.

347.

348.
349. //get all persons from database

350.

351. persons = Person.GetAllPersons();

352.

353.

354.

355. //set data source for list control

356.

357. personListBox.DataSource = persons;

358.

359. personListBox.DisplayMember = "FullName";

360.

361. personListBox.SelectedIndexChanged +=
PersonListBox_SelectedIndexChanged;

362.

363.

364.

365. }

366.

367.

368.

369. #endregion

370.

371.

372.

373. #region Event Handlers


374.

375.

376.

377. //handler for ListBox SelectedIndexChanged event

378.

379. private void PersonListBox_SelectedIndexChanged(object sender,


EventArgs e)

380.

381. {

382.

383. //get selected person

384.

385. currentPerson = personListBox.SelectedItem as Person;

386.

387.

388.

389. //fill details panel with person info

390.

391. firstNameTextBox.Text = currentPerson.FirstName;

392.

393. lastNameTextBox.Text = currentPerson.LastName;

394.

395. dateOfBirthTextBox.Text =
currentPerson.DateOfBirth.ToShortDateString();

396.

397. }
398.

399.

400.

401. #endregion

402.

403.

404.

405. }

406.

407. }

408.

You might also like