Hej. Jag förstår inte riktigt vad du menar. Men mitt upskick "Redigerar flera poster på en sida": Programarkivet:Redigerar flera poster på en sida kanske kan vara till hjälp. Nej, inte riktigt så. Det är bara att använda dig av MoveFirst. Skulle nog hellre rekommendera att du använder <b>GetRows</b> på ditt rs, då får du all data i en array som du sedan kan fylla dina droplistor med Du kan ju loopa igenom recordsetet och lägga valen i en sträng: Nu måste jag hindra dig. Strängkonkratenering är galenskap. Tänk att du för varjepost är vungen att adressera nytt minne för att variabeln är större än den gamla. Detta är ett ineffektivt sätt att göra det på. Jag gjorde en liten prestandatest, och det jag fick fram var att break-even ligger någonstans omkring tusen poster. Ifall man har färre än så, så tar det längre tid att lägga in dem i en array, och det är ju inte så ofta man ens kommer i närheten av tusen val i en select-lista. Bara en fundering som tåls att kommenteras. Nackdelen med en subrutin är att den kör koden för varje anrop. Om du använder en funktion och tillderar resultatet till en variabel får du ett anrop. Du kan ju oxå caha resultatet i funktionen efter första anropet. Det handlar ju om storleken på strängen i kombination med antalet. Jag vill bara uppmärksamma användarna på detta. Det man inte är medveten om kan skada en senare. ;o) Har skrivit ett exempel som istället implementerar Stream. Tror det är effektivare i både mindre och större sammanang:Select boxar..
En bra lösning för att loopa flera selectboxar med samma information.
Tex. Orderrader till ett orderformulär.
Selectboxarna fyller information från en databas.
Har idag 1 st, men vill kunna ha upp till kanske 10 st!Sv: Select boxar..
Sv: Select boxar..
Jag har en dropdown meny som innehåller data från en databas, med artiklar.
Men om jag vill ha en till dropdown meny så vill jag ju inte öppna samma recordset igen.
Utan samma information från mitt recorset till flera dropdown menyer.Sv: Select boxar..
När du då ska skriva ut till nästa Selectbox så kör du RS.MoveFirst, loopar ut den.
Vill du skriva ut den igen så kör du bara MoveFirst och loopar igen.
//Anna-KarinSv: Select boxar..
Sv: Select boxar..
<code>strOptions = ""
Do until RS.EOF
strOptione = strOptions & "<option valye=""" & RS("Id") & """>" & Server.HTMLEncode(RS("Option")) & "</option>"
Loop</code>
Sedan är det bara att använda strängen:
<select name="Kossor"><%=strOptions%></select>Sv: Select boxar..
Men jag håller med dig om att det är snyggt att ha listan i en variabel.
Låt os slå våra kloka huvud ihop.
Tyvärr går det inte i detta fallet att använda GetText() medlemmen på recordset. Då du kallar på HTMLEncode. HTMLEncode tycker jag är mycket bra att du använder. Det ger sidan kvalitet och säkerhet infogandet av script genom poster på sidan. Efterom HTML tagar formateras till ofarliga escape tecken.
En komplet optimerat exempel bör därför se ut så här:
<code>
Dim rs
Dim con
Dim fldKategorinr, fldKategorinamn
Dim strOptions
Dim strResult
Const adUseClient = 3
Set con = CreateObject("ADODB.Connection")
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Program\Microsoft Office\Office10\Samples\Northwind.mdb"
strSQL = "SELECT Kategorier.Kategorinr, Kategorier.Kategorinamn" & vbCrLf & _
"FROM Kategorier" & vbCrLf & _
"ORDER BY Kategorier.Kategorinamn"
Set rs = CreateObject("ADODB.Recordset")
rs.CursorLocation = adUseClient
rs.Open strSQL, con
Set fldKategorinr = rs("Kategorinr")
Set fldKategorinamn = rs("Kategorinamn")
ReDim strOptions(1 To rs.RecordCount)
For Index = 1 To rs.RecordCount
strOptions(Index) = "<option valye=""" & fldKategorinr.Value & """>" '& Server.HTMLEncode(fldKategorinamn.Value) & "</option>"
rs.MoveNext
Next
strResult = Join(strOptions, vbCrLf)
Erase strOptions
Set fldKategorinr = Nothing
Set fldKategorinamn = Nothing
rs.Close
Set rs = Nothing
con.Close
Set con = Nothing
Respone.Write "<select name=""Kategori1"">" & strResult & "</select>"
Respone.Write "<select name=""Kategori2"">" & strResult & "</select>"
Respone.Write "<select name=""Kategori3"">" & strResult & "</select>"
</code>Sv: Select boxar..
Ifall man nu riskerar att få en lista med så många poster så ska man naturligtvis använda en array.
Angående att allokera minne, så allokeras ju minne för varje sträng som läggs in i arrayen, så det blir ju lika många minnesallokeringar med bägge metoderna.Sv: Select boxar..
Är det helt fel att skriva en subrutin som skriver ut det hela? Skulle ju vara smidigt annars.
Men å andra sidan... Om det var en bra lösning skulle säkerligen någon ha föreslagit det tidigare. Så jag kan ju passa på att undra varför det inte är bra med en gång. ;-)
MvhSv: Select boxar..
Sv: Select boxar..
Små strängar är det ju lätt att hitta plats för och flytta data mellan. Men just för att man helatiden ökar strängen så måste den alokera om plats för den nya informationen.Sv: Select boxar..
<code>
Function MakeOptions(Recordset, ValueField, TextField)
Dim Stream
Const adTypeText = 2
Const adModeReadWrite = 3
Set Stream = CreateObject("ADODB.Stream")
Stream.Type = adTypeText
Stream.Mode = adModeReadWrite
Stream.Open
Do Until Recordset.EOF
Stream.WriteText "<option value=""" & Server.HTMLEncode(ValueField.Value) & """>" & Server.HTMLEncode(TextField.Value) & "</option>"
Recordset.MoveNext
Loop
Stream.Position = 0
MakeOptions = Stream.ReadText
Stream.Close
End Function
Dim rs
Dim con
Dim strSQL
Dim strOptions
Set con = CreateObject("ADODB.Connection")
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Program\Microsoft Office\Office10\Samples\Northwind.mdb"
strSQL = "SELECT Kategorier.Kategorinr, Kategorier.Kategorinamn" & vbCrLf & _
"FROM Kategorier" & vbCrLf & _
"ORDER BY Kategorier.Kategorinamn"
Set rs = CreateObject("ADODB.Recordset")
rs.Open strSQL, con
strOptions = MakeOptions(rs, rs("Kategorinr"), rs("Kategorinamn"))
rs.Close
Set rs = Nothing
con.Close
Set con = Nothing
Respone.Write "<select name=""Kategori1"">" & strOptions & "</select>"
Respone.Write "<select name=""Kategori2"">" & strOptions & "</select>"
Respone.Write "<select name=""Kategori3"">" & strOptions & "</select>"
</code>