27. juli 2004 - 10:47Der er
8 kommentarer og 3 løsninger
Multiple select box
Er der nogen som kan hjælpe mig med at loop igennem denne, så den tager alle de markede områder med ud fra databasen. Lige nu tager den kun hvis der er EN.
<select name="area1" multiple="multiple">
<% Set cnnID = Server.CreateObject("ADODB.Connection") cnnID.Open Application("DSN_dealer")
sql="SELECT * FROM Area1 ORDER BY Name" Set rsArea1=cnnID.execute(sql)
Do While Not rsArea1.eof if cstr(rsArea1("id")) = cstr(rs("Area1")) then Response.Write("<option value=""" & rsArea1("id") & """ selected>" & _ rsArea1("name") & "</option>") else Response.Write("<option value=""" & rsArea1("id") & """>" & _ rsArea1("name") & "</option>") end if rsArea1.movenext Loop
Set rsArea1=Nothing %> </select> </td><td valign="bottom"> <script language="JavaScript"> function selectAll(sel,tf) { for (i=0;i<sel.length;i++) { sel.options[i].selected = tf; } } </script> <input type="button" class="input" value=" Vælg alle til" onclick="selectAll(this.form.area1,true);" /><br><br> <input type="button" class="input" value="Vælg alle fra" onclick="selectAll(this.form.area1,false);" />
Bavarian Nordics vækst blev starten på et DevOps-samarbejde med Novataris for hurtigt at kunne tilpasse IT-organisation til forretningen.
7. december 2023
Slettet bruger
27. juli 2004 - 10:53#1
prøv at lade være med at lave MULTIPLE på den xhtml-agtige måde og se om det fungere - Hvis det skal være xhtml så skal du være konsekvent og i givet fald skal du minimum erstatte <br> med <br />
Når du laver en multiple selectionbox bliver de valgte options lagret kommasepareret. Prøv at udskrive area1, så kan du se hvad jeg mener.
Vælges option 1 og 5 vil area indeholde 1,5 - og dermed hverken være lig 1 eller lig 5 - og du får ingen værdier med. Men du kan lave en liste vha split og så løbe elementerne igennem for at se om nogle af dem er lig din nøgle.
Do While Not rsArea1.eof if cstr(rsArea1("id")) = cstr(rs("Area1")) then Response.Write("<option value=""" & rsArea1("id") & """ selected>" & _ rsArea1("name") & "</option>") else Response.Write("<option value=""" & rsArea1("id") & """>" & _ rsArea1("name") & "</option>") end if rsArea1.movenext Loop
Set rsArea1=Nothing %> </select> </td><td valign="bottom"> <script language="JavaScript"> function selectAll(sel,tf) { for (i=0;i<sel.length;i++) { sel.options[i].selected = tf; } } </script> <input type="button" class="input" value=" Vælg alle til" onclick="selectAll(this.form.area1,true);" /><br><br> <input type="button" class="input" value="Vælg alle fra" onclick="selectAll(this.form.area1,false);" />
Hov koden ovenfor skulle ikke ha' været med. Må være noget i retning af Liste = Split(Request.Form("area1")) samt sql="SELECT * FROM Area1 WHERE ID IN (' " & Liste & "') & " ORDER BY Name"
Lad mig gætte på, at du skal vise alle værdier fra area1-tabellen, men kun markere de værdier, der blev valgt fra listen.
Så skal du ikke som først antaget blot trække de valgte ud, men alle. Liste = Split(Request.Form("area1")) sql = "SELECT * FROM Area1 ORDER BY Name" Set rsArea1=cnnID.execute(sql)
Do While Not rsArea1.eof Fundet = FALSE I = 0 DO WHILE (I<= UBOUND(Liste)AND NOT FUNDET) IF CStr(rsArea1("id")) = CStr(Liste(I)) THEN Fundet = True END IF I = I + 1 LOOP
IF Fundet THEN Response.Write("<option value=""" & rsArea1("id") & """ selected>" & _ rsArea1("name") & "</option>") else Response.Write("<option value=""" & rsArea1("id") & """>" & _ rsArea1("name") & "</option>") end if rsArea1.movenext Loop
Forudsat at din multiple choice box sætter value på nøgler, der svarer dem fra tabellen, skulle det køre. Bemærk derfor at ovenstående kodestump vil fjerne nøgle-værdierne. Skal de vedblive at huskes kodes de ind i value-feltet. Du skal også lige huske erklæringer.
Nu ser det således ud, men det virker stadig ikke. Og hvad mener du med erklædringer (jeg er ikke verdens største kode-haj)
<select name="area1" multiple="multiple">
<%
Liste = Split(Request.Form("area1")) sql = "SELECT * FROM Area1 ORDER BY Name" Set rsArea1=cnnID.execute(sql)
Do While Not rsArea1.eof Fundet = FALSE I = 0 DO WHILE (I<= UBOUND(Liste)AND NOT FUNDET) IF CStr(rsArea1("id")) = CStr(Liste(I)) THEN Fundet = True END IF I = I + 1 LOOP
Der mangler et par (vigtige) detaljer i kurtpedersens svar, men i princippet er han på vej i den rigtige retning :-)
1) Du skal ikke splitte på Request.Form("area1"), men derimod på hvilke felter der er valgt i databasen. Jeg gætter på at de ligger i rs("area1"), da det er den du bruger i din IF-sætning i din første post.
2) Der mangler en (vigtig) parameter i din Split kommando. Helt nøjagtigt skal du splitte på ", " (læs: komma-mellemrum).
Rent teoretisk burde din kode virke hvis du bare lige retter split-linien til:
Det var Sørens - din bandit, du løb med gevinsten ;-)
Rigtigt, der mangler lige en blank i min kode. Det var sen nat, og jeg havde ikke energi til at afprøve det.
Det med basen : OK, sådan ville jeg aldrig lave mine tabeller. Det har noget med Boyce Cott at gøre (The key, the hole key and nothing but the key). Jeg gik udfra at id blot var et (dumt) fortløbende nummer - og at selecten lå i en formular (der godt nok ikke var fuldt beskrevet i koden).
Til Kaage (og andre der læser indlægget og ikke er hajer): Vedr. erklæringer betyder det at alle variable bør erklæres:
Dim Variabel
Er det lister (arrays) SKAL de erklæres. Variable der ikke er erklæret eksplicit (af programmør) erklæres incplitit af programmet - MEN ikke altid efter bedste evne, og somme tider får man en kode, der slet ikke gør som den skal. Derfor indsætter jeg altid følgende linie:
<%option explicit%> (SKAL stå i linie 1 i programmet)
Nu SKAL ALLE variable erklæres af programmøren, sker det ikke fejler programmet med en
Microsoft VBScript runtime error '800a01f4'
Variable is undefined: 'a'
/Tina/atest/dropdown.asp, line 29
I linie 29 har jeg brugt variablen a, som ikke er erklæret, og jeg kan let finde manglende erklæringer på den måde.
Hvis ikke jeg erklærer variable opstår der som nævnt somme tider problemer. Eks hvis man bruger samme variabel til 2 forskellige formål (sjusk) så vil koden køre, men da variablen ikke indeholder den forventede værdi går det galt. En sådan fejl kan tage TIMER at finde, hvis programmet er af en vis størrelse. 2 forskellige formål kunne eks være en variabel erklæret i toppen af programmet og en (anden) variabel (med samme navn) erklæret lokalt (i procedure eller funktion). Hvilken variabel bliver nu behandlet i den underliggende procedure? Svaret er - det kommer helt an på hvordan kompileren er lavet, man har ikke længere kontrol over programmet.
Men med min <%option explicit%> så vil jeg let opdage, at variablen allerede er brugt, for når jeg erklærer variablen i den underliggende procedure får jeg en fejl - dobbelterklæring.
Nå, det var et sidespring, fint at problemet blev løst :-)
Kurt
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.