webForumDet fria alternativet

Nåt sätt att kolla innehåll innan page_load körs

.NET

27 svar · 638 visningar · startad av Nöff

Medlem sedan nov. 2003569 inlägg
Frågan#1

Hej..

Om man har en dropdownlist med en händelsehanterare på.
när man klickar på dropen så anropas:

DropDownList1.SelectedIndexChanged()
{
Response.Write(DropDownList1.SelectedIndex)
}

Men, det är ju så att Page_Load körs ju först. sen funktionen.

1. Kan man påverka detta så att DropDownList1.SelectedIndexChanged funktionen körs först och sen page_Load?.

eller

2. Kan man innan Page_Load körs ta reda på vad surfaren klickade på i DropDownList:en?

Medlem sedan juni 20011 732 inlägg
#2

PreRender kanske? Vet inte om du kan ta reda på vad användaren klickade på redan där men du kan ju pova. Körs om inte annat före pageload. Om du har vs.net - markera dropdownlisten, välj events i propertiesfönstret så hittar du prerender.

Varför måste du köra koden innan pageloaden?

Medlem sedan maj 20012 812 inlägg
#3

Det låter som att du har missat IsPostBack funktionen. För det finns ingen som helst anledning att inte göra Page_Load först.

Däremot så skall man inte ha så mycket kod i den funktionen, och denna kod skall säkert inte köras när man har tryckt på en knapp. Alltså inte köras vid en PostBack.

Säg vad som är ditt problem istället, för nu verkar det som du hittar på egna kryptiska lösningar på ett enkelt problem.

- M

Medlem sedan okt. 20005 273 inlägg
#4

Räcker det inte att kolla om det är en Page.IsPostback i Page_Load.

[red]
private void Page_Load(object sender, System.EventArgs e)
{
	if(!Page.IsPostBack)
	{
		BindDropDown();
	}
}
[/red]

på detta sätt binder du inte om DropDownListen vid postback, och då får du rätt värde när du kör din SelectedIndexChanged(). Om det nu var det som var problemet ;)

mv icaaq

Medlem sedan nov. 2003569 inlägg
#5

Kolla här:

http://www.webforum.nu/showthread.php?postid=767838#post767838

denna repeater byggde jag innan.

Det är såhär... Den här repeatern ska fungera "both ways".

1. Man ska kunna lägga in svar.
2. Repeatern ska också kunna leta upp svar och "Selecta" svarsalternativ som kund valt.

Problemet:
Repeatern måste bindas vid postback eftersom jag har andra funktioner på sidan som till exempel Buttons och sådant.
1. När man ska kolla på gamla svar så klickar man i en annan dropdownlist(gamlasvar), som har en händelsehanterare på sig som anropar "visa" funktionen, och denna triggar igång repeatern som sen letar upp svaren och lägger i sig.

Eftersom ordningen ser ut såhär:
Page_Load
"visa" visa funktionen.

Så kommer tyvärr repater att bindas vid postback==false och då är den ofullständig med inga "uppletade svarsalternativ".(just eftersom tågordningen ser ut som den gör)
Därför måste jag i "visa" funktionen skapa om repeatern med kundens svar. Därför kommer repeatern bindas 2 gånger. (Page_Load och "Visa"). Men om jag kan ta reda på vad surfaren valt i dropdownlisten(gamlasvar) innan page_load körs så kan jag undvika att repeatern binds 2 gånger.

Medlem sedan maj 20012 812 inlägg
#6

Jag är fortfarande inte med :(

Du binder din repeater vid Page_Load och vid händelsen visa. Men du vill endast binda din repeater 1 gång. Alltså vid visa eftersom du behöver detta värde. Om detta är korrekt så löser du problemet med att kolla om sidan är en PostBack, och så fall inte binda i Page_Load.


public void Page_Load(){
if(!Page.IsPostBack)
{
//-- BIND DATA TILL REPEATERN, Kommer endast att ske första gången sidan körs.
}
}

- M

Medlem sedan nov. 2003569 inlägg
#7

hehe, jo det är ett knivigt problem,
men oj jag ser att jag skrev fel innan "tyvärr repater att bindas vid postback==false" ... det ska vara "postback==true"

1. repeatern måste bindas vid postback efter jag har flera buttons på sidan, och repeatern ska inte försvinna bara för att man trycker på andra knappar.

2. och repeatern ska också skapas om när det finns ett värde i (gamla svar)dropdownlisten(när den ska leta upp svaren), men eftersom page_load körs först och det samtidigt är en postback så kommer repeatern bindas 2 gånger.

och länken som jag la ut.. den repeatern är lite gammal, men den illustrerade litegrann iaf.. så ta inte den för seriöst.

Medlem sedan maj 2001329 inlägg
#8

Repeatern ska inte försvinna bara för att du trycker på en knapp. Gör den det är det nått fel. Antingen viewstate=false på den eller att du binder den på fel ställe som tex i page_loaden :P

Medlem sedan juni 20011 732 inlägg
#9

Grynet: Tror han menar att knappar och sådant försvinner eftersom han skapar dem dynamiskt, rätt?

Jag hävdar fortfarande att du inte behöver skapa knappar dynamiskt i koden, utan att du ska tänka om på den punkten. Det skulle lösa dina postback-problem också. Det ska väl inte vara några problem att härleda tidigare svar till nya frågor i din repeater med fasta kontroller i denna? Spara undan tidigare svar i en array av något slag så har du ju den att utgå från varje gång du rullar ut nya frågor.

Medlem sedan nov. 2003569 inlägg
#10

korrekt, den är dynamisk därför måste den återskapas. men jag tvivlar på att den går att göra statisk. den är ganska avancerad och den ska fungera "both ways", alltså kunna lägga in svar och få upp svar.,. men du får väldigt gärna göra ett försök network :)

Medlem sedan juni 20011 732 inlägg
#11

Jag har inget grepp om vad du gör. :) I mitt huvud har jag en bild på en repeater som för varje rad listar en fråga och en dropdownlista med svarsalternativ. När du svarat på frågan binder du om repeatern och lägger på ytterligare en fråga i repeatern. Är det rätt uppfattat? Eller vad exakt finns det i varje item i din repeater, varierar du både antal och typ av kontroller för varje rad i samma repeater?

Har du någon bild på hur det ser ut som du kan slänga upp, skulle bli mycket lättare att se och förstå vad du vill göra då!

Medlem sedan nov. 2003569 inlägg
#12

jepp korrekt.

men jag bestämde mig för att skippa att lägga till en händelsehanterare på svarsalternativ dropen, och istället lägga ut allt på en gång.

jag varierar inte typ av controller i repeatern.
Och svaren man angett läggs i en databas.
Och vid behov ska surfaren kunna få upp vad kunden valt i repeatern, och då ska repeatern automatiskt lägga upp svaren .

Jag är klar med denna repeater , men den är hel-dynamisk, funkar jättebra. men problemet är att den binds 2 gånger när den ska leta upp svaren och lägga svaren i repeatern just pga av tågordningen i asp.net. om man nu inte kan lösa det genom att göra den statisk istället, eller komma på nåt sätt att få ur vad surfaren klickade på i (gamla svar)dropdownlisten innan Page_Load körs.

Medlem sedan juni 20011 732 inlägg
#13

Ok, jag kan tyvärr inte komma på något sätt att få bort den dubbla bindningen med den approach du använder du (därmed absolut inte sagt att det är omöjligt :) ) men med tanke på att du binder din repeater med ingenting så borde prestandaförlusten vara försumbar om det inte är någon väldigt prestandakritisk applikation du ska göra.

Det finns nog många sätt att lösa det hela på men eftersom det är samma kontroller som itereras gång på gång så skulle jag lägga dem statiskt i repeatern och sedan på något sätt ("på något sätt" är alltid ett bra svar som alltid är sant :) ) spara undan tidigare frågor och svar, eller åtminstone något id eller vad du nu behöver för att kunna återskapa frågetråden.

Medlem sedan maj 20012 812 inlägg
#14

repeatern måste bindas vid postback efter jag har flera buttons på sidan, och repeatern ska inte försvinna bara för att man trycker på andra knappar

Ursäkta mig att jag är korkad :). Men jag ser faktiskt inte ditt problem. Om inte följande kod löser det, så har jag missuppfattat dig total.

public void Page_Load(){
	if(!Page.IsPostBack)
		BindRepeater();
}

public void BindRepeater(){
	//-- Här binder du alla objekt till din repeater.
}

public void Button_onClick(object sender, EventArgs e){
	//-- här gör du en massa som skall göras när man tryckt på knappen.

	//-- kallar på funktionen som binder din repeater
	BindRepeater()
}

public void Button_annan_onClick(object sender, EventArgs e){
	//-- här gör du en massa som skall göras när man tryckt på knappen.

	//-- kallar på funktionen som binder din repeater
	BindRepeater()
}

Första gången sidan körs, så bindsdata till din repeater. När du trycker på en knapp så gör du vad du skall med det, och sedan så kallar du på funktionen som binder data till din repeater.

Nu kommer din repeater endast att bindas 1 gång. Aldrig 2.

Men jag kan ju ha missförståt dig totalt

- M

Medlem sedan nov. 2003569 inlägg
#15

jo gladh. din kod. tex om surfaren tryckt på public void Button_onClick utan att välja nåt i den dropdownlisten som triggar repeatern så kommer Bindrepeater att anropas i onödan .
hmmm iofs så skulle man kunna göra en IF sats i varje funktion som kollar om den dropdownlist som triggar repeatern har ett select värde eller ej.. hmm, jo, det blir ett antal, ska prova litegrann.

Medlem sedan maj 20012 812 inlägg
#16

jo gladh. din kod. tex om surfaren tryckt på public void Button_onClick utan att välja nåt i den dropdownlisten som triggar repeatern så kommer Bindrepeater att anropas i onödan

Nu förstår jag dig inte alls.

1. du säger att du har en dynamisk repeater som byggs upp varje gång en sida körs.
2. du säger att den måste byggas om vid varje postback
3. sedan säger du att den byggs i onödan om man trycker på en knapp.

Din repeater kan inte byggas i onödan om den byggs dynamiskt, eftersom den har försvunnit så fort sidan har kört. Alltså måste du bygga om den vid en postback.

Och skulle det av någon underlig anledning inte behövas byggas om när man trycker på Button_onClick, så tar du bara bort funktionsanropet BindRepeater().

Så återigen, jag ser verkligen inte vad det problem är. Antingen så måste repeatern byggas om vid varje postback, och då kallas BindRepeater() vid varje event. Eller så behöver den inte byggas om vid varje postback, och då behöver man inte kalla på BindRepeater().

Tror du gör saker svårare än vad de är.

- M

Medlem sedan dec. 2000537 inlägg
#17

äh. varför inte använda dynamiska repeatrar istället?

Medlem sedan nov. 2003569 inlägg
#18

Gladh

svar Nej.

Det är såhär att ifall den dropdownlista som triggar repeatern inte har ett selectat värde, då ska inte repeatern skapas om i de andra kontrollerna, MEN repeatern ska skapas om i de andra kontrollerna OM den dropdownlista som triggar repeatern är selectad. därför om jag ska göra som du föreslår måste jag först ta reda på med en IF sats om den dropdownlista som triggar repeatern är selectad eller inte i varje händelsehanterare. Det skulle jag kunna göra, men men det blir en massa if satser då. Jag skulle helst vilja ha den vid if(ispostback==true) istället och där ta reda på om den dropdownlist som triggar repeatern har ett selectat värde eller ej. men detta måste då göras innan Page_Load körs. Och det går nog inte.

Medlem sedan maj 20012 812 inlägg
#19

Du kan lägga den kontrollen i DataBindRepater() funktionen.

Du lägger kontrollen först i funktionen och om den dropdownlista inte har något värde så gör du bara en return.

Alltså kommer endast du binda om din repeater när du har ett selectat värd. Du får dock lite problem första gången sidan körs, eftersom dropdownlistan inte har något värde. Det löser man enkelt med att kolla i samma if sats om sidan är en postback eller inte, och låter det vara avgörande om man skall göra en kontroll på dropdownlistans värde.

Nu slipper du göra if-satser i varje händelsefunktion.

- M

Medlem sedan nov. 2003569 inlägg
#20

Hmm. jo, jag tror nog det ska gå, att ha bindrepeater() först upp i varje händelsehanterare på varje kontroll jag har. och ta bort bindrepeater() i postbacken istället. ska testa det. tror nog det kan vara en lösning. jag återkommer med det.

266 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)