Avatar billede stefware Nybegynder
22. januar 2003 - 01:24 Der er 13 kommentarer og
1 løsning

Valg i Combo viser nyt indhold i ny combo

Hej

Jeg har en DB med en masse bilnavne og tilsvarende modeller. Navnene vises i en combobox, når man har valgt et bil skal den vise modelerne i den næste combobox, hvor et valg viser modellen.

Hvordan får jeg combo1 til at opdatere combo2 med tabellen med de modeller der passer til ex. Alfa Romeo? og hvordan får jeg valget i combo 2 til at vise den den rigtige side. eks 165.asp, kan man evt. trække værdien fra en tabel, hvis man evt. vil have motor str. osv. ?
Avatar billede stefware Nybegynder
22. januar 2003 - 01:26 #1
How, det forløbelige Script kommer lige her:
<%
Response.Buffer = True
Response.Expires = 0

Set Con = Server.CreateObject("ADODB.Connection")
DBPath = "DBQ=" & server.mappath("db2.mdb")
Con.Open "DRIVER={Microsoft Access Driver (*.mdb)}; " & DBPath


    sqlBil = ("SELECT DISTINCT bil_navn FROM bildb Order BY bil_navn ASC ")
    set rsBil = Con.execute(sqlBil)
   
        sqlModel = ("SELECT DISTINCT bil_model FROM bildb Order BY bil_model ASC ")
    set rsModel = Con.execute(sqlModel)
   
   
%>
<html>
<head>
<title>Dbl</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link rel="stylesheet" href="/test.css" type="text/css">
<link rel="stylesheet" href="/spalte.css" type="text/css">
<script language="JavaScript">
<!--
function MM_reloadPage(init) {  //reloads the window if Nav4 resized
  if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {
    document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}
  else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();
}
MM_reloadPage(true);
// -->
</script>
</head>

<body bgcolor="#000099" text="#000000">

<select name=\"combobox\">

<%Do Until rsBil.EOF%>

<option> <%Response.Write rsBil("bil_navn")%><br>
<%  rsBil.MoveNext
Loop%>
</select>

<select name=\"combobox2\">
<%Do Until rsModel.EOF%>

<option><%Response.Write rsModel("bil_model")%><br>
<%  rsModel.MoveNext
Loop%>
</select>

</body>
</html>
Avatar billede trumf Nybegynder
22. januar 2003 - 02:04 #2
Her er hvordan det skal gøres i JS og så er det jo rimeligt nemt at lægge værdier ind fra en DB. Så sker det hele også på klienten, hvilket er bedre for server og hurtigere på klienten.

<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
<!--
    function update() {
      bil = document.form1.combo1.selectedIndex;
      valg = document.form1.combo1.options[bil].value;

      if (valg == "")
          {document.form1.combo2.options[0].text = "Vælg mærke:";
          document.form1.combo2.options[0].value = "";
          document.form1.combo2.options[1].text = "Vælg bil først";
          document.form1.combo2.options[1].value = "";
          document.form1.combo2.options[2].text = " - ";
          document.form1.combo2.options[2].value = "";
          }
      if (valg == "fiat")
          {document.form1.combo2.options[0].text = "Vælg mærke:";
          document.form1.combo2.options[0].value = "";
          document.form1.combo2.options[1].text = "Fiat 126";
          document.form1.combo2.options[1].value = "f126";
          document.form1.combo2.options[2].text = "Fiat 127";
          document.form1.combo2.options[2].value = "f127";
          }
      if (valg == "ford")
          {document.form1.combo2.options[0].text = "Vælg mærke:";
          document.form1.combo2.options[0].value = "";
          document.form1.combo2.options[1].text = "Mondeo";
          document.form1.combo2.options[1].value = "mondeo";
          document.form1.combo2.options[2].text = "Elektra";
          document.form1.combo2.options[2].value = "elektra";
          }
    }
//-->
</SCRIPT>
</HEAD>
<BODY>
<FORM NAME="form1">
<SELECT name="combo1" onChange="update();">
<OPTION VALUE="">Vælg bil:</OPTION>
<OPTION VALUE="fiat">Fiat</OPTION>
<OPTION VALUE="ford">Ford</OPTION>
</SELECT>
<BR><BR>
<SELECT name="combo2" onChange="update();">
<OPTION VALUE="">Vælg mærke:</OPTION>
<OPTION VALUE=""></OPTION>
<OPTION VALUE=""></OPTION>
</SELECT>
<FORM>
</BODY>
</HTML>

Men det er vel kun halvdelen af svaret, hvis det absolut skal gøres i ASP!
Avatar billede stefware Nybegynder
22. januar 2003 - 08:38 #3
Men skal man så ikke taste alle data ind manuelt
Avatar billede eagleeye Praktikant
22. januar 2003 - 09:45 #4
Med javascript så og arrayet bliver lavet med ASP:


<%
set conn = server.CreateObject("ADODB.Connection")
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& server.mappath("db9.mdb")
%>
<html>
<head><title>Select menu vælger sekundær select menu.</title>
<META NAME="Generator" CONTENT="Stone's WebWriter 3">

<script language="JavaScript"> <!--

var selbokse = new Array();


selbokse['land'] =
new Array( "- vælg amt -"

<%
strSQL = "SELECT * FROM amter WHERE landeID = 1"
set rs = conn.execute (strSQL)
do while not rs.eof
  Response.Write ", """ & rs("amtNavn") & """"
  rs.movenext
loop
%>
);

//selbokse['land'] =
//    new Array ( "- vælg Amt -",    "København", "Aarhus",      "Odense"    ), // Danmark


// forhvert madsted skal databasen generere en url og et navn

selbokse['madsted'] =
new Array(
<%
strSQL = "SELECT * FROM amter WHERE landeID = 1"
set rs = conn.execute (strSQL)
do while not rs.eof
%>
new Array ( "- vælg madsted -"
<%
  strSQL = "SELECT * FROM restaurant WHERE amtID = " & rs("id")
  set rsMad = conn.execute(strSQL)
  do while not rsMad.eof
    Response.Write ", """ & rsMad("link") & "|" & rsMad("restaurantnavn") & """"
    rsMad.movenext
  loop
  rs.Movenext
%>)<%
if NOT rs.EOF then response.write ","
loop
%>
);


//selbokse['madsted'] =
//    new Array(
//        new Array (    // selbokse['madsted'][0][0]  for Danmark,København.
//            "- vælg Restaurant -",
//            "www.restaurant-cassiopeia.dk/|Cassiopeia",
//            "www.dentatoveredeenke.dk/|Den Tatoverede Enke",
//            "www.egoisten.dk/|Egoisten",
//            "www.restaurant-kanalen.dk/|Kanalen",
//            "www.krogs.dk/|Krogs Fiskerestaurant"
//                  ),
//        new Array (    // selbokse['madsted'][0][1]  for Danmark,Aarhus.
//            "-1|- vælg Restaurant -",
//            "www.rold.dk/|Rold Storkro",
//            "www.spiseguiden.dk/luneborg/|Luneborg Kro",
//            "home10.inet.tele.dk/ihj/|Hotel Plesner Skagen",
//            "www.spiseguiden.dk/glvraaslot/|Gl. Vraa Slot",
//            "www.pandrupkro.dk/index.htm|Pandrup Kro"
//
//                  ),
//        new Array (    // selbokse['madsted'][0][2]  for Danmark,Odense.
//            "-1|- vælg Restaurant -",
//            "www.le-provence.dk/Le Provence",
//            "www.skaerven.dk/|skaerven",
//            "www.majorgaarden.com/|Majorgården"
//                  )
//            );

var offMenu = new Array( " \< - \< - \< - \< - \< -" ); // >

var sel;
var selo;

function setOption( idx, data ) {
  var tmp = data.split("|");
  if ( tmp.length == 1 ) { tmp[1]=tmp[0]; tmp[0]="" };
  if ( selo.length > idx ) {
      selo[idx].text = tmp[1];
      selo[idx].value = tmp[0];
  } else
      selo[idx] = new Option( tmp[1], tmp[0] );
}; //end setOption( number, string, string )

function setupMenu( selobj, menuarray ) {
//alert("menuarray type: " +typeof(menuarray) );
    sel  = selobj.selectedIndex;
    selo = selobj.options;
    for (var i=0; menuarray.length>i; i++ ) setOption( i, menuarray[i] );
    selobj.selectedIndex = 0;
    selobj.disabled = ( menuarray==offMenu )?true:false;
    selo.length = menuarray.length;
}; //end setupMenu( select object, array )

var idxLand = -1;  // intet land valgt

function setMenu ( frm, selNavn ) {
  if ( selNavn == "" ) {
      setupMenu( frm.land, selbokse['land'] );
      setupMenu( frm.madsted, offMenu );
      idxLand = -1;
  } else
  if ( selNavn == 'land' ) {
      idxLand = frm.land.selectedIndex-1;
      if ( idxLand >= 0 )
          setupMenu( frm.madsted, selbokse['madsted'][idxLand] );
      else
          setupMenu( frm.madsted, offMenu );
  } else
  if ( selNavn == 'madsted' && idxLand>=0 ) {
      var helurl = "http://" + frm.madsted.options[frm.madsted.selectedIndex].value;
      window.open( helurl, 'winduesnavn' );
  } else
      alert( "Slem programfejl. du bør aldrig se denne besked." );
}; //end setMenu ( radioKnap element )

// -->  </script>
 
</head>
<body  onload="setMenu( document.sfrm, '' )">

<p><form name="sfrm" action="dest_fil.asp" onsubmit="return pakResultat(this);">
<center><table border=0 cellspacing=10>
  <tr>
    <td valign='top'>
        <select name="land" width="200px" style="width:200px"
          onchange="setMenu(this.form, this.name);">
          <option value=1>- - - - - - - - - - - -</option>
          <option value=2> </option>
          <option value=3> </option> <!-- indsæt toppe options af hensyn til NS4.x -->
          <option value=4> </option>
          <option value=5> </option>
          <option value=6> </option>
          <option value=7> </option>
          <option value=8> </option>
          <option value=9> </option>
          <option value=10> </option>
        </select>
    </td>
    <td valign='top'>
        <select name="madsted" width="200px" style="width:200px"
          onfocus="if (0>idxLand) this.blur();"
          onchange="if (this.selectedIndex>0) setMenu(this.form, this.name);">
          <option value=1>- - - - - - - - - - - -</option>
          <option value=2> </option>
          <option value=3> </option>
          <option value=4> </option>
          <option value=5> </option>
          <option value=6> </option>
          <option value=7> </option>
          <option value=8> </option>
          <option value=9> </option>
          <option value=10> </option>
        </select>
    </td>
  </tr>
</table></center>
</form>
<p>Bemærk at datamængden stiger exponentielt. Her med blot 3 valgmuligheder i hver select skal der loades 3*3 = 9 restaurantlinier. Med 6 valg i hver gruppe bliver tallet 6*6 = 36 restaurantlinier.
<p>Det kan blive så mange linier der skal hentes at det går hurtigere at hente ny data fra serveren for hvert valg.
<p>Især hvis du laver <A HREF="exp145224.html">flere niveauer</A> af selectbokse.</p>

<p align='right'><!-- WebWriter AutoDato -->Opdateret: 3.1.2002<!-- WW -->
</body>
</html>




I den combo box med linket skal en option i arrayet se såan her ud:

"www.rold.dk/page.asp|Rold Storkro",

Det bliver lavet i denne linie:
Response.Write ", """ & rsMad("link") & "|" & rsMad("restaurantnavn") & """"
Avatar billede trumf Nybegynder
22. januar 2003 - 11:38 #5
Nej, options (options[x]) klarer du med en for-lykke og selve optionerne har du jo i din DB

Begge svar er rigtige (samme løsning)
Avatar billede stefware Nybegynder
22. januar 2003 - 20:03 #6
Damn det var noget af en kode, det må vi se om jeg kan finde hoved og hale i!
Avatar billede trumf Nybegynder
22. januar 2003 - 20:40 #7
Ja, den er ikke let og det er svært skrive koden for dig, når man ikkekender indholdet af DB, som sikkert også ændrer sig hele tiden.

Vær dog opmærksom på, at der altid skal være samme antal af options i alle valgene, for hvis du vælger feks fiat med kun 2 optioner og derefter ford med tre, så vises kun de to første. Derfor skal du lave fiat med en tom option til sidst.

Jeg kigger forbi en gang i mellem og ser om der er mere der driller :-)
Avatar billede stefware Nybegynder
22. januar 2003 - 22:52 #8
Ja det er vist heller ikke den nemmeste metode jeg har valgt.
Jeg har rettet mit script til nu og som jeg kan læse mig ud fra i eagleeye's indlæg (selv om jeg må indrømme jeg ikke forstod meget af det) skal jeg bruge et Array til at lave den liste som skal bruges til at udvælge de biltyper der passer til et bestemt bilnavn, så kan man lave noget lign:
 
if (valg == "<%Response.Write rsBil("bil_navn")%>")
          {document.form1.combo2.options[0].text = "Vælg mærke:";
          document.form1.combo2.options[0].value = "";
          document.form1.combo2.options[1].text = "<%Response.Write rsModel("bil_type")%>";
          document.form1.combo2.options[1].value = "<%Response.Write rsModel("bil_type")%>";

Kan man arbejde noget ind med at det link der henvises til genereres ud fra ID?

Måske skulle man bare lave 1 side med bilnavne i en liste og ved klik viser den alle de typer der har det bilnavn

DB: db2
Tabel: bildatabase
Kolonner: ID, bil_navn, bil_type (der kommer nok også en der hedder bil_link)

Script nu:

<%
Response.Buffer = True
Response.Expires = 0

Set Con = Server.CreateObject("ADODB.Connection")
DBPath = "DBQ=" & server.mappath("db2.mdb")
Con.Open "DRIVER={Microsoft Access Driver (*.mdb)}; " & DBPath




    sqlBil = ("SELECT DISTINCT bil_navn FROM bildatabase Order BY bil_navn ASC ")
    set rsBil = Con.execute(sqlBil)
   
        sqlModel = ("SELECT DISTINCT bil_model FROM bildatabase Order BY bil_model ASC ")
    set rsModel = Con.execute(sqlModel)
   
   
%>

<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">


    function update() {
      bil = document.form1.combo1.selectedIndex;
      valg = document.form1.combo1.options[bil].value;

      if (valg == "")
          {document.form1.combo2.options[0].text = "Vælg mærke:";
          document.form1.combo2.options[0].value = "";
          document.form1.combo2.options[1].text = "Vælg bil først";
          document.form1.combo2.options[1].value = "";
          document.form1.combo2.options[2].text = " - ";
          document.form1.combo2.options[2].value = "";
          }
         

      if (valg == "Fiat")
     
          {document.form1.combo2.options[0].text = "Vælg mærke:";
          document.form1.combo2.options[0].value = "";
          document.form1.combo2.options[1].text = "Fiat 126";
          document.form1.combo2.options[1].value = "f126";
          document.form1.combo2.options[2].text = "Fiat 127";
          document.form1.combo2.options[2].value = "f127";
          }
      if (valg == "Ford")
          {document.form1.combo2.options[0].text = "Vælg mærke:";
          document.form1.combo2.options[0].value = "";
          document.form1.combo2.options[1].text = "Mondeo";
          document.form1.combo2.options[1].value = "mondeo";
          document.form1.combo2.options[2].text = "Elektra";
          document.form1.combo2.options[2].value = "elektra";
          }
    }
//-->
</SCRIPT>
</HEAD>
<BODY>
<FORM NAME="form1">
<SELECT name="combo1" onChange="update();">

<OPTION VALUE="">Vælg bil:</OPTION>
<%Do Until rsBil.EOF%>
<OPTION VALUE="<%Response.Write rsBil("bil_navn")%>"><%Response.Write rsBil("bil_navn")%></OPTION>
<%  rsBil.MoveNext
      Loop%>
</SELECT>


<SELECT name="combo2" onChange="update();">
<OPTION VALUE="">Vælg mærke:</OPTION>
<OPTION VALUE=""></OPTION>
<OPTION VALUE=""></OPTION>
</SELECT>
</FORM>
</BODY>
</HTML>
Avatar billede trumf Nybegynder
23. januar 2003 - 02:07 #9
Nu skal du ikke give op, du er kommt langt og har set noget af lyset :-)

Når du er færdig har du det meget bedre med dig selv!

Du kan indarbejde ID'et i value-feltet, det er jo det der sendes med i formen, når den submittes.

Sådan lidt syrealistisk set:
<OPTION VALUE="document.form1.combo2.options[0].value">document.form1.combo2.options[0].text</OPTION>
Avatar billede stefware Nybegynder
23. januar 2003 - 10:12 #10
Jeg lå og tænkte over det det meste af natten ;-) Jeg overvejer om jeg skal def. min DB anderledes således jeg har en Tabel der har alle bilnavnene, og en tabel med model numrene som:

Tabel:bil
bil_navn    Bil_id
Affa                  1
Audi                2
osv.

Tabel: model
Bil_id        bil_model
1                  145
1                  165
2                  80
2                100

Og så laver en forspørgsel  hvor jeg finder de bil_id som svarer til bil_navn i tabellen model,  så må jeg undvære onChange funktonen!
Avatar billede trumf Nybegynder
01. april 2003 - 23:03 #11
Thanks, men fik du klaret det ?
Avatar billede stefware Nybegynder
01. april 2003 - 23:08 #12
Nææ jeg kom fra det igen, men ville lige have lukket de åbne ? jeg havde!
Avatar billede trumf Nybegynder
01. april 2003 - 23:31 #13
Nåh men hvis du stadig er frisk, så skal jeg selv have lavet noget i samme stil, så hvad i vi lavede det sammen ?
Avatar billede stefware Nybegynder
01. april 2003 - 23:34 #14
Lige pt. har jeg lidt for meget at se til, men ellers mange tak for tilbuddet

stef
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