Professional Documents
Culture Documents
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
Metoda Opis
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.
Prilikom dodavanja kontrole, Visual Studio za nas generiše određeni kôd unutar designer fajla.
code
source
1. this.label1.AutoSize = true;
2.
4.
5. this.label1.Name = "label1";
6.
8.
9. this.label1.TabIndex = 0;
10.
12.
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.
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
2.
3. {
4.
6.
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.
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
2.
3. {
4.
5. MessageBox.Show("Button Clicked!");
6.
7. }
8.
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.
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.
Svojstvo Opis
Appearance određuje izgled kontrole; standardni izgled ili izgled koji odgovara Toggle button kontroli
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.
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
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
Maska se može definisati korišćenjem opcije Properties panela, kao na slici 4.11.
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.
Svojstvo Opis
DataSource predstavlja izvor podataka kontrole
DisplayMember sadrži naziv propertija klase stavke koji će biti prikazan u listi
Listbox
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.
code
source
2.
3. {
4.
5.
6.
8.
10.
11.
12.
14.
15. {
16.
18.
20.
21. }
22.
23.
24.
26.
27.
28.
30.
32.
34.
35.
36.
38.
39. {
40.
41.
42.
43. }
44.
45.
46.
48.
49. {
50.
52.
54.
56.
58.
60.
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
2.
3. {
4.
6.
7. p1.FirstName = "John";
8.
9. p1.LastName = "Davidson";
10.
11.
12.
14.
16.
19.
20.
22.
23. Persons.Add(p1);
24.
25. Persons.Add(p2);
26.
27.
28.
30.
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 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
Metoda za obradu eventa promene indeksa selektovane stavke može izgledati kao u nastavku:
code
source
2.
3. {
4.
6.
7. }
8.
Metoda za obradu eventa promene vrednosti selektovane stavke može izgledati kao u nastavku:
code
source
2.
3. {
4.
5.
6.
7. if (listBox1.SelectedItem != null)
8.
9. {
10.
12.
14.
15. }
16.
17. }
18.
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
2.
3. {
4.
5.
6.
8.
9.
10.
11.
12.
14.
15. {
16.
17. for (int i = 0; i < listBox1.SelectedIndices.Count; i++)
18.
19. {
20.
22.
23.
24.
26.
27. {
28.
30.
31. }
32.
33. }
34.
35.
36.
38.
39. }
40.
41. }
42.
code
source
2.
3. {
4.
5.
6.
8.
9.
10.
12.
13. {
14.
15.
16.
17.
18.
20.
21. {
22.
24.
25.
26.
28.
29.
30.
32.
33. {
34.
36.
37. }
38.
39.
40.
41. }
42.
43.
44.
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.
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.
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
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.
code
source
2.
code
source
1. comboBox1.Items.Add("6");
2.
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
2.
3. {
4.
6.
7. }
8.
9.
10.
12.
13. {
14.
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:
razvoj je veoma tesno povezan sa razvojnim okruženjem i korišćenjem dizajnera, što otežava
razumevanje i smanjuje slobodu,
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:
Baza podataka
code
source
1. USE [Test]
2.
3. GO
4.
5.
6.
8.
10.
12.
14.
16.
18.
20.
21. (
22.
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.
34.
36.
38.
40.
42.
44.
46.
48.
49.
50.
52.
53. {
54.
56.
57. {
58.
59.
60.
62.
63.
64.
66.
68.
70.
72.
73.
74.
75. #endregion
76.
77.
78.
80.
81.
82.
84.
85. {
86.
88.
89. set
90.
91. {
92.
94.
95. {
96.
97. return;
98.
99. }
100.
102.
103. }
104.
105. }
106.
107.
108.
110.
111. {
112.
114.
115. set
116.
117. {
118.
120.
121. {
122.
123. return;
124.
125. }
126.
128.
129. }
130.
131. }
132.
134.
135. {
136.
138.
139. set
140.
141. {
142.
144.
145. {
146.
147. return;
148.
149. }
150.
152.
153. }
154.
155. }
156.
157.
158.
160.
161. {
162.
164.
165. }
166.
167.
168.
170.
171. {
172.
174.
175. set
176.
177. {
178.
180.
181. }
182.
183. }
184.
185.
186.
187.
188.
189. #endregion
190.
191.
192.
194.
195.
196.
198.
199. {
200.
202.
204.
206.
208.
209. }
210.
211.
212.
214.
215. {
216.
217.
218.
219. }
220.
221.
222.
223.
224.
225. #endregion
226.
227.
228.
230.
231.
232.
234.
235. {
236.
237.
238.
240.
242.
243.
244.
246.
247. {
248.
249. conn.ConnectionString =
ConfigurationManager.ConnectionStrings["ConnString"].ToString();
250.
251. conn.Open();
252.
253.
254.
256.
257.
258.
260.
261. {
262.
264.
265. {
266.
268.
269. persons.Add(person);
270.
271. }
272.
273. }
274.
275.
276.
277. }
278.
280.
281. }
282.
283.
284.
285. #endregion
286.
287. }
288.
289. }
290.
291. MainWindow.cs
292.
294.
296.
298.
299. using System.Data;
300.
302.
304.
306.
308.
310.
311.
312.
314.
315. {
316.
318.
319. {
320.
321.
322.
325.
326.
328.
330.
331.
332.
333. #endregion
334.
335.
336.
338.
339.
340.
342.
343. {
344.
345. InitializeComponent();
346.
347.
348.
349. //get all persons from database
350.
352.
353.
354.
356.
358.
360.
361. personListBox.SelectedIndexChanged +=
PersonListBox_SelectedIndexChanged;
362.
363.
364.
365. }
366.
367.
368.
369. #endregion
370.
371.
372.
375.
376.
378.
380.
381. {
382.
384.
386.
387.
388.
390.
392.
394.
395. dateOfBirthTextBox.Text =
currentPerson.DateOfBirth.ToShortDateString();
396.
397. }
398.
399.
400.
401. #endregion
402.
403.
404.
405. }
406.
407. }
408.