webForumDet fria alternativet

Dubbla postbacks

17 svar · 489 visningar · startad av NETwork

NETworkMedlem sedan juni 20011 679 inlägg
#1

Tjena! Jag har ett antal dropdownlistor som gör postbacks automatiskt. Problemet är att om man väljer ett alternativ i en av dropdownlistorna och sedan väljer ytterligare ett alternativ i en annan dropdownlist _innan_ den första dropdownlisten hunnit ladda om sidan så kraschar allt.

När jag gjorde en liten test för att förstå varför så finner jag att den kör funktionerna kopplade till de båda respektive dropdownlistorna samtidigt under samma postbacks. Jag vill bara köra funktionen kopplad till den senast valda dropdownlisten! Har ni någon idé hur jag kan lösa detta?

m_soderlundMedlem sedan sep. 20024 733 inlägg
#2

Du kan inte välja att sätta onSelectedIndexChanged="procedur_som_ska_köras"? :)

NETworkMedlem sedan juni 20011 679 inlägg
#3

Jag skrev nog en rätt kass rubrik, den gör nog inte postback två gånger utan jag vill att den ska göra det, typ. :) Alltså, det är onSelectedIndexChanged jag har kopplat via två olika dropdownlistor, problemet är att båda funktionerna körs om jag väljer något i den första dropdownlisten och sedan även väljer något i den andra innan den första hunnit ladda om sidan... jag tycker att det borde vara endast den sista funktionen som körs!

Så här testade jag och då körs BÅDA funktionerna om man väljer något i båda dropdownlistorna (forloopen är endast för att fördröja funktionen så man ska hinna välja i den andra innan sidan laddas om):

private void DropDownList2_SelectedIndexChanged(object sender, System.EventArgs e) {
  string s = "";
  for(int i=0; i<1000000; i++) {
    s=i.ToString();
  }
  Response.Write("test1");
}

private void DropDownList3_SelectedIndexChanged(object sender, System.EventArgs e) {
  string s = "";
  for(int i=0; i<1000000; i++) {
    s=i.ToString();
  }
  Response.Write("test2");
}

När jag kör detta så skriver den ut BÅDE test1 OCH test2. :(

m_soderlundMedlem sedan sep. 20024 733 inlägg
#4

Onekligen krångligt att få till en hyfsat snygg lösning för det hela.
Du kan ju alltid leka med visible-egenskapen. I början av respektive procedur kan du sätta andra procedurens visible-egenskap till false.

DropDownlist2.visible = false;

I och för sig körs ju båda procedurerna (antar jag, har inte testat ifall om kod relaterad till en kontroll som är osynlig körs, men antar det), men bara info från en procedur visas på sidan.
Vill du slippa visningen från två procedurer, eller slippa två exekveringar? Är det en designfråga eller prestandafråga, helt enkelt? ;)

Hoppas jag förstått dig rätt. :)

NETworkMedlem sedan juni 20011 679 inlägg
#5

Det går inte att använda på det sättet eftersom alla måste vara enablade samtidigt då det inte finns en given ordning som dessa väljs. Jag försöker laborera med javascripts nu men jag får inte till det heller. Jäkla komplicerat det blev för en sån enkel sak.

NETworkMedlem sedan juni 20011 679 inlägg
#6

Alltså, det hela fungerar så att jag har ett antal grupper och undergrupper (i en oändlig lång hierarki) där man med en dropdownlister väljer befintliga grupper och då laddas undergrupper till den valda gruppen in i en ny dropdownlist osv. Jag vill också ha möjligheten att backa ett eller flera steg i hierarkin, alltså om jag valt undergrupper i 4 steg och sedan väljer om en grupp på nivå två så ska nya grupper in i dropdownlisten på nivå tre laddas in samtidigt som dropdownlisten med grupper i nivå fyra töms och disablas.

Allt fungerar! Problemet uppstår när man väljer något i en av dropdownlistorna och sedan väljer något i en annan dropdownlista utan att vänta på att den gjort sin postback färdig. Då balalr allt. Inte bara på sidan utan hela användarsessionen rasar ihop och man måste stänga webblösaren och logga in på nytt för att det ska fungera igen. Jag gör absolut inga konstigheter i funktionerna så detta är lite smått irriterande!!!

m_soderlundMedlem sedan sep. 20024 733 inlägg
#7

Hm.. Det här med att dropdownlistor raserar sessioner har jag också varit med om, och inte har jag löst det problemet heller. :l Helskumt!! Dock måste jag inte stänga webbläsaren, utan bara logga in igen. Logga in - utkastad. Logga in - utkastad.. :x

Ditt problem har jag dessvärre ingen lösning på än så länge. Titta lite här, det kanske ger något: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwebuiwebcontrolsdropdownlistmemberstopic.asp :)

NETworkMedlem sedan juni 20011 679 inlägg
#8

Nu har jag äntligen hittat en lösning och det var nog tur det för jag hade snart inte mycket hår kvar att slita av. Det blev en javascriptlösning. Jag fick ta bort autopostback på dropdownlisten, gjorde lika många osynluiga buttons som dropdownlistor och så gjorde jag en egen onchange på dropdownlisten som anropar ett javascript. I javascriptet sätter jag inProgress (bool) till false och sedan har jag en ifsats som kollar om inProgress är false, om den är det så går jag vidare, sätter till inProgress till true och startar en funktion via den osynliga knappen. Skulle jag välja något annat nu i en dropdownlist så kommer inprogress vara true och då går den aldrig vidare in i funktionen!

//För varje ddl har jag en asp:button:
<asp:dropdownlist onchange='InProgressCheck(this)' thisID="1" id="ddl1" runat="server"></asp:dropdownlist>
<asp:Button CausesValidation="False" style="visibility:hidden" id="b1" onclick="b1_Click" runat="server"></asp:Button>

//javascriptet
inProgress = false;
function NoDoubleCheck(ID){
  if(!inProgress){
    inProgress = true;
    if(ID.thisID == 1)
      document.getElementById("_ctl0:Button1").click();
   }
}

Grundproblemet, varför hela sidan ballar ur när någon väljer ett item i en dropdownlist två eller fler gånger på rad innan sidan hunnit laddas om vet jag fortfarande inte vad det beror på, men detta förhindrar i alla fall att den postar tillbaka till servern innan sidan hunnit laddas om. :bire

m_soderlundMedlem sedan sep. 20024 733 inlägg
#9

Härligt! Kul att det löste sig! :bire

Vi får dock göra en uppföljning på varför man kastas ut från lösenordsskyddade sidor. Helskumt och jobbigt. :l

DinoMedlem sedan sep. 20011 918 inlägg
#10
//.aspx
 <script language="javascript">
   function disableMyFellows(e){
      for(var i = 1; i < 5; i++){
         el = document.getElementById('ddlTest' + i);
         if(el.id != e.id){
            el.disabled = true;
         }
      }
   }
</script>
<asp:DropDownList ID="ddlTest1" AutoPostBack="True" Runat="server" />
<asp:DropDownList ID="ddlTest2" AutoPostBack="True" Runat="server" />
<asp:DropDownList ID="ddlTest3" AutoPostBack="True" Runat="server" />
<asp:DropDownList ID="ddlTest4" AutoPostBack="True" Runat="server" />

//.cs
private void Page_Load(object sender, System.EventArgs e)
{
   ddlTest1.Attributes.Add("onchange", "disableMyFellows(this),");
   ddlTest2.Attributes.Add("onchange", "disableMyFellows(this),");
   ddlTest3.Attributes.Add("onchange", "disableMyFellows(this),");
   ddlTest4.Attributes.Add("onchange", "disableMyFellows(this),");
}
NETworkMedlem sedan juni 20011 679 inlägg
#11

Jo, det var en snygg lösning! :) Men en anledning till att jag behövde mina buttons är också att det inte verkar gå att sätta CauseValidiation=false på en dropdownlist och jag vill helst ha det...

DinoMedlem sedan sep. 20011 918 inlägg
#12

En dropdownlist utlöser väl inte valideringen så vad skall du med CauseValidiation=false till?

NETworkMedlem sedan juni 20011 679 inlägg
#13

Jupp, det gör den om den om du har autopostback, den gjorde det när jag provade förut iaf.

DinoMedlem sedan sep. 20011 918 inlägg
#14

Det gör det inte för mig.

NETworkMedlem sedan juni 20011 679 inlägg
#15

Nej, det gjorde den ju inte, anledningen till att den gjorde det förut var ju att jag hade kopplat postbacken till en button. Så du har alldeles rätt! Det har varit en mycket förvirrande förmiddag detta... :) Tack för hjälpen!

NETworkMedlem sedan juni 20011 679 inlägg
#16

Testade lite med din kod Dino, men får det inte att fungera. AutoPostBack="true" använder sig av onchange och skriver över funktionsanropet till disableMyFellows. Har du fått det att fungera? Inte för att det är så viktigt, men om din kod går igång så är den ju snyggare än min. :)

DinoMedlem sedan sep. 20011 918 inlägg
#17

Koden är testad och skall fungerar felfritt. Om du kollar den utspottade html koden så borde selecternas onchange event se ut så här.

onchange="disableMyFellows(this),__doPostBack('ddlTest2','')"

red// Eftersom du säger att du haft en lång dag så kanske jag borde påpeka att id:na i min kod antagligen inte är de samma som i din kod.

NETworkMedlem sedan juni 20011 679 inlägg
#18

Aha, hade glömt ett kommatecken... tack!

ddlTest1.Attributes.Add("onchange", "disableMyFellows(this) [u] >>>,<<< [/u] ");

Red: Id hade jag bytt ut, så lång var inte dagen. ;)

130 ms totalt · 3 externa anrop · cache AV · v20260731051352-full.56cc9887
0 ms — hämta statistik (cache)
0 ms — hämta forumlista (cache)
127 ms — hämta tråd, inlägg och bilagor (db)