Goder afton! Vad laddar vad? var är menyn? skilj på kontroll & sida, är inte hundra på ifall du har blandat ihop dem eller iunte... Nu är det du som är ute och cyklar... En sida är ju en page control som hostar alla andra kontroller i kontrollträdet... Hej! Hej! Fössöker hoppa in här, är lite nyvaken efter en eftermiddagstupplur. Hej igen! varför laddar du inte kontrollerna i mymenubar.click ? Måste hinna välja och ladda .ascx kontroller innan viewstaterestore och events kickar igång (senast i load). Om jag gör detta efter menubar.click (efter load) kommer kontrollerna att visas men de kommer inte att svara på genererade events. DVS inga knapptryck på ascx sidorna kommer att göra postbacks... 1... Sätt in en IsPostback kontrollEventhantering med dynamiskt tillagda .ascx filer
nu är jag ute och cyklar lite och behöver lite hjälp att komma upp på vägen igen. Jag har en sida med en navigationsbar som vid klick kommer att kolla vad man skall visa för innehåll och beroende av detta ladda .ascx kontroller för att lösa denna uppgift. Kontrollen läses in med hjälp av:
<code>
phNav.Controls.Add(LoadControl("thecontrol.ascx")
</code>
Detta sker idag i prerender eventen på huvudsidan då jag först måste kolla i clickeventen på min navigationsbar för att se vad som skall göras. När detta exekverar har ju redan alla events körts (efter page_load på huvudsidan) och alla events som triggats från min .ascx fil ignoreras.
Om jag flyttar koden för att lägga till kontrollen till page_load så kommer det att fungera då vi går in innan all eventhantering har körts (efter page_load och innan page_prerender). Men nu vet jag ju inte vilka kontroller jag skall visa för den informationen får jag ju inte förräns mymenubar_click körs. Vilket är efter page_load.
Hur göra?Sv: Eventhantering med dynamiskt tillagda .ascx filer
Sv: Eventhantering med dynamiskt tillagda .ascx filer
Sida är enligt mig en page control som implementerar ihttphandler interfacet. En .ascx fil är en kontroll som laddas in av min codebehindsida i klassens prerender eventhandler.
Problemet är enkelt. Hur fixar man att jag inte vet vad som inmatats (får tillgång till menykontrollens val i klickeventen på denna (som kommer efter page_load eventen) men kontrollen som skall visas måste laddas och adderas till kontrollträdet under page_load (innan jag vet vad som klickats) för att all viewstate skall återställas samts events processas...
<code>
---------------------------------------
menyval1 menyval2 menyvall3-
---------------------------------------
Beroende på menyval kommer
denna area på sidan att ladda in
dedikerade kontroller (WebUserControl)
helt dynamsikt med hjälp av:
TheHost.Controls.Add(TheControl).
</code>
/MickeSv: Eventhantering med dynamiskt tillagda .ascx filer
Det låter som ett riktigt moment 22.
Med reservation för att ha missförstått något i problembeskrivningen skulle jag föreslå att du använder dig av samma webcontrol hela tiden. Förändra utseendet på den m.h.a. olika subrutiner som du anropar i menyns on_click events.Sv: Eventhantering med dynamiskt tillagda .ascx filer
Men det jag vill komma bort ifrån är att behöva ladda alla kontroller som inte skall användas. Ett sätt vore ju att sätta dessa i en tabcontrol och sätta hidden = true på de kontroller som inte används under anropet men i detta fall kommer de ju ändå att laddas bara det att de inte renderas.
Finns det inget sätt att gå in efter en clickevent på sidan och lägga till kontroller på sidan samt processa deras events??? Informationen måste ju finnas tillgänglig i viewstaten vis on_load bara det att man inte läser in den förräns efter?
Om det inte är möjligt att först kolla vad som hänt innan man bestämmer sig vad man skall visa verkar det ju som ett steg tillbaka från att bara greppa en request.querysting("whathappened") från ett formulär i vanlig asp.
/MickeSv: Eventhantering med dynamiskt tillagda .ascx filer
Du har en Aspx sida som under Page_Load ritar utt din meny samt sidans startinnehåll? Och när du trycker på menyn triggas ett OnClick event som inte körs förrän efter Page_Load och du vill inte att det i page_load skall utföras igen?
först av allt har du ju IsPostBack attributet som du kan använda för att förhindra data att ritas igen. Sedan blir du faktiskt tvungen att gå genom page_Load innan du når ditt event. :-(
Som du säger så kan du strunta i att trigga ett event vid val av meny och istället köra en hederlig a href på den med querystring värden. Och plocka dessa i Page_Loaden.
//Johan NSv: Eventhantering med dynamiskt tillagda .ascx filer
Som sagt var. Jag är inte helt säker på att jag greppat hela komplexiteten i problemet, men jag tror inte att .visible = false-varianten innebär någon större prestandaförsämring.
I ditt .asp-exempel där du bara kollar Request.QueryString("whathappened") har du ju också laddat allt, oavsett om det ska renderas eller ej... (Såvida du inte använder dig av Server.Execute, men i så fall skulle du inte kunna använda dig av variabler och querystrings.)Sv: Eventhantering med dynamiskt tillagda .ascx filer
Sv: Eventhantering med dynamiskt tillagda .ascx filer
/MickeSv: Eventhantering med dynamiskt tillagda .ascx filer
2... Sätt de saker du inte vill ha som disabled eller invisivble
3... Om du dyn laddar saker kan du ju dyn lägga till de kontroller du vill ha alltså
skapa någon XML fil som talar om vilka kontroller du skall ha vid respektive menyval.
Ritar du upp kontrollerna i Page_Loaden? om du gör det kan du även lägga dem i olika metoder som du med en if sats eller case anropar. Så minskar du oxå kontroll instansieringar etc...
Typ... så har du fixat en del problem.
//Johan N