Sem začetnik v ASP-ju. Rad bi naredil sledeče. Naredil bi user kontrolo na kateri bi bilo npr. 5 gumbov in panele. Vsak gumb bi na panelu odprel drugo user kontrolo. Če na eventu od gumba napišem Panel.controls.add(UserControl) se desigen še ne osveži. Kako rešiti ta problem?
Hvala
Matjaž
Avtor: o-MA-n-tjaz, objavljeno na portalu SloDug.si (Arhiv)
bojanv - sreda, 03. januar 2007
Pri web-u je problem s spremenljivkami, če se uporabljajo kot se uporabljajo v npr. konzolski aplikaciji; s prirejanjem. V ta namen so narejeni mehanizmi, ki so potrebni za ohranjanje vrednosti spremenljivk, kot npr. Session, ViewState, Cookies, Application, Cache,... Za konkretno rešitev bodite malce bolj specifični (mislim na podano kodo) .....če hočete ohranit vrednosti, priporočam, da se poslužite teh mehanizmov ali pa da preobložite (override) evente, ki skrbijo za nalaganje vrednosti. Seveda pazite na vrstni red dogodkov (nekateri povzročijo to, da se zgodijo, še preden se naloži ControlState oziroma ViewState) in do določenih kolekcij ne boste imeli dostopa.....
o-MA-n-tjaz - sreda, 03. januar 2007
Hvala za pojasnilo. Imam pa še vedno problem, da se že konstruktor od kontrole 2x kljiče in potem (ob drugem klicu) izgubim vrednosti spremenljivk. Lp,Matjaž
bojanv - sreda, 03. januar 2007
AutoEventWireup je lastnost, s katero povemo, da se eventi vežejo avtomatsko, brez našega posredovanja. Vse, kar je potrebno, je, da se držimo imen eventov, ki se v Page class-u predefinirani. Če si opazil, nikjer nimaš definiranega delegate-a za Page_Load, ampak je napisan kot metoda. Torej, ko mu daš lastnost na true, on avtomatsko poveže vse evente znotraj kode, ki so pravilno imenovani. Če bi imel na false, se eventi ne bodo izvršili, ampak je potrebno te evente polinkat. Recimo, takole: imaš stran z imenom Stran.aspx in code-behind file _Stran.cs. V _Stran.cs narediš konstruktor, kjer vežeš evente. Primer:public _Stran() {Load += new EventHandler(Page_Load); }protected void Page_Load(object sender, EventArgs e) {//koda }Ko je nastavljen na true, pa okolje naredi nekaj takega:bool ignoreCase = true; //ne upošteva velikih malih črkbool throwOnFailure = false; //če pride do napake do vezavi, ne VRŽI napakeDelegate d = null;d = Delegate.CreateDelegate( typeof(EventHandler), this, "Page_Load", ignoreCase, throwOnFailure );To, da se ti naloži dvakrat, je pa finta v Control Tree. Kontrole, ko se naložijo (še posebej če imaš composite control), se dodajo v drevesno strukturo kontrol, ki se izvršijo po vrsti. Zakaj dvakrat? Ker se prvo doda v tree od kontrole, potem pa v tree od page-a. Predstavljaj si, kot da je vsaka kontrola zase page (čeprav ni), kar povzroči, da se postopek izvrši 2x. Priporočam branje tega članka pa ti bo pole bolj jasno
o-MA-n-tjaz - torek, 02. januar 2007
Ker imam podobno vprašanje sem ga napisal kar tukaj. Zakaj se v nekaterih primerih page_load user kontrole kliče dvakrat. Naprimer ko imam user kontrolo na user kontroli se mi page_load na prvi kontroli kliče 2x. Pa še to mi ni uspelo ugotoviti v kakšnem primeru, ker to se mi ne dogaja povsod. Se je mogoče kdaj komu dogajalo kaj podobnega? Mimogrede kaj je glavni namen AutoEventWireup. Samo to da onemogočiš evente ali se to uporablja še v kakšnem primeru? Lp,Matjaž
AndrejT - petek, 15. december 2006
Če uporabljaš evente za dodajanje kontrolnikov, bo verjetno šlo lažje, če boš namesto panela uporabil Placeholder, čeprav mislim, da tudi panel ne bi smel povzročat težav.
bojanv - petek, 15. december 2006
Hm, ne vem točno kaj bi rad nardil. A design način misliš, ko še aplikacijo nisi zagnal (ko razvijaš kontrolo) ali to misliš, ko imaš aplikacijo v browserju? Za design način (gradnja kontrole) moraš z atributi poskrbet, da se ti bo osvežilo. Predlagam atribut NotifyParent, s katerim poveš parentu (razredu, od katerega deduješ), da je prišlo do spremembe.Za browser ti bo pa tko ali tko prikazalo..Samo na postbacku boš zgubil kontrole, ker niso dodane v controltree, ampak samo v panel control tree, kar pa ni isto..Moraš v drugi fazi poskrbet, da se ti dodajo.... Al sem te narobe razumu?