Avatar billede kaage Nybegynder
27. juli 2004 - 10:47 Der 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);" />
Avatar billede 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 />
Avatar billede kaage Nybegynder
27. juli 2004 - 12:26 #2
Øhh, det er jeg ikke helt sikker på at jeg fatter noget af... Kan du uddybe det?
Avatar billede kurtpedersen Nybegynder
27. juli 2004 - 23:11 #3
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);" />
Avatar billede kurtpedersen Nybegynder
27. juli 2004 - 23:15 #4
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"

og en erklæring af Liste.
Avatar billede kaage Nybegynder
03. august 2004 - 14:37 #5
Okay, det forstår jeg godt, men det virker stadig ikke.. Mangler jeg noget, koden ser således ud:

Liste = Split(Request.Form("area1"))
sql="SELECT * FROM Area1 WHERE ID IN (' " & Liste & "') & 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
Avatar billede kurtpedersen Nybegynder
04. august 2004 - 02:04 #6
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.
Avatar billede kurtpedersen Nybegynder
04. august 2004 - 02:06 #7
Ahh, du har value på kan jeg se, helt fint :-)
Avatar billede kaage Nybegynder
04. august 2004 - 08:25 #8
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

  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
    %>
</select>
Avatar billede soerens Nybegynder
04. august 2004 - 10:04 #9
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:

  Liste = Split(rs("area1"), ", ")

/SoerenS
Avatar billede kaage Nybegynder
04. august 2004 - 10:06 #10
Tusind tak gutter, det virker perfekt nu :o)
Avatar billede kurtpedersen Nybegynder
04. august 2004 - 14:52 #11
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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester