Tema je, naizgled trivijalna: radi se o trigerovanju Click eventa za radioButton.
Za ocekivati je, kako mu i ime kaze, da se ovaj event trigeruje kad kliknete misem na doticni radioButton ili kad je u fokusu, pa pritisnete taster Enter.
E, ono sto ja nisam znao, ovaj event moze da se trigeruje (samo sto to kod Microsoft-a ne pise ili barem ja nisam uspio da pronadjem) i kada ne kliknete misem na radioButton ili
ne pritisnete taster Enter, ako je u fokusu. A jos ako vam se to desi usled razvoja, relativno, slozenije kontrole, moze da bude jako, pa nemam bolji izraz,
iritirajuce i da vam uzme, kao i meni, odredjeno vrijeme.
Imam jednu kontrolu na kojoj su (ilustracije radi): 3 groupBox-a (bilo sa listboksovima, textboxovima, button-ima, sa namjenom za: prikaz podataka, pretrazivanje
podataka, dodavanje novih, mijenjanje, brisanje itd), 2 panela - na jednom je jedan dataGridView za unos, prikaz i modify podataka, a na drugom panelu (on sada vazan :) ):
jedan dataGridView (za unos, prikaz, modify, itd) plus 4 groupBox-a sa po dva radioButton-a svaki (za izbor nekih opcija) i plus jos neke textBox-ove.
Napominjem da se UI oba panela realizovani kao posebne kontrole, to jest, kao dvije razlicite klase.
I evo sto se dogadja u praksi: razvijao sam funkcionalnost 'Modify' za dataGridView u jednom panelu. Prilikom testiranja, kad se inicira operacija 'Modify' u gridu na prvom panelu,
a to se radi (trenutno) klikom na neko dugme, program odradi 'Update' u bazi podataka i plus 'IZNENADJENJE': trigeruje i Click event od jednog radiobutton-a sa drugog panela
(u kome se takodje odradi 'Update' u bazi podataka).
Na kontroli ovakve slozenosti moze svasta da vam padne na pamet, samo vjerovatno ne, kao sto nije ni meni, da se Click event moze trigerovati i bez klika misem (ili
preko tastature).
Uvidom u 'stack trace' moze da se vidi razlika u slucaju da je Click trigerovan bas klikom misa i da Click nije trigerovan klikom misa.
StackTrace za slucaj da je Click trigerovan klikom misa:
OnClick - OnMouseUp - WinMouseUp - WndProc - OnMessage itd
StackTrace za skucaj da Click nije trigerovan klikom misa:
OnClick - OnEnter - NotifyEnter - UpdateFocusedControl - AssignActiveControlInternal - ActivateControlInternal - SetActiveControlInternal.
Poslije razmisljanja i google-ovanja, razumio sam sta se desilo:
- pregledao sam sve kontrole sa ukljucenom opcijom 'TabOrder' (to je vazno),
- TabOrder panela (sa radioButton-ima) je prvi sledeci u odnosu na TabOrder button-a, kojim se inicira 'Update' podataka sa prvog panela,
- na panelu sa radioButton-ima, prvi TabOrder je bas onog radioButton-a, ciji se Click trigeruje,
- zbog logike aplikacije, ja po zavrsetku 'Update'-a na prvom panelu, uradim disable button-a: recimo, buttonUpdate.Enable = false,
- u tom trenutku se kontrola (fokus) prebacuje na prvu sledecu (prema TabOrder-u) kontrolu, a to je ovaj drugi panel, a u njemu je, opet, prva kontrola, na koju se
setuje fokus, radioButton, i
- ono sto nisam znao, Click event se trigeruje i tada, bez ikakvog klika na sam radioButton, dakle: dovoljno je da se radioButton nadje u fokusu.
Stvar sam rijesio tako sto sam 'ispremjestao' TabOrder kontrola na doticnom panelu, tako da neka druga kontrola dobija fokus, kada ga dobije sam panel.
Interesuje me vase misljenje, da li je ovo 'bug' u Visual Studio-u: trigerovanje Click event-a, a bez klika misem ?
Da li je jos neko imao slicnih iskustava?
Programming is fun, but writing good software is hard ...