webForumDet fria alternativet

Få värde från en ej checkad checkbox?

ASP

12 svar · 279 visningar · startad av CokeLight

Medlem sedan juni 2000504 inlägg
Frågan#1

Hejsan,

Problem:
Hur får man fram värdet på en ej checkad checkbox...?

Bakgrund:
Jag loopar fram ID från databas, och sätter dessa som value för checkboxar. Sen requestar jag dessa på mottagarsidan, men när jag i en FOR-loop kör response.write får jag ju bara värden för de checkboxar som är ikryssade. Hur får jag fram värden för de checkboxar som inte blivit ikryssade?

------------------
"Between stimulus and response is a pause wherein our ability to choose lies".

Medlem sedan dec. 19998 577 inlägg
#2

Det får du inte... och varför vill du ha dom?

------------------
Vide rox = new Vide();
rox.learn("C#");

webeye.nu

Medlem sedan mars 20002 836 inlägg
#3

Har för mig att det inte går.
Om den inte är ikryssad så "finns inte" den checkboxen med i Request.Form

cya,
PatrikB

------------------
*Det tar sig sa han som hade eld i håret*

Medlem sedan juni 2000504 inlägg
#4

Tack för snabba svaren :)

Okay, orsak:
Jag loopar som sagt fram ID från databas, och dessa blir checkbox-values. Jag vill veta vilka checkboxar som är ikryssade så att jag kan göra en SQL sats som uppdaterar de checkboxar som är ikryssade till TRUE och till FALSE för de som inte är ikryssade.

LarsG berättade för ett tag sen att man kan köra iif om man kör Access. Då verkar man kunna sätta ALLA poster i hela kolumnen till TRUE/FALSE som beskrivet ovan.

Men nu vill jag ju inte sätta ALLA poster till antingen TRUE/FALSE utan bara för de checkboxar som finns med i den aktuella loopen. I och med att checkbox value har ID-värden från dB, så tänkte jag att man köra MIN/MAX värden som villkor för update-satsens WHERE, t.ex

update blabla WHERE ID >= curID AND ID <= curID eller nåt sånt (har inte provat ordentligt ännu eftersom ovanstående inte funkat riktigt.. :) )

Om det är oklart vad jag är ute efter förklarar jag gärna igen :)

Tack

------------------
"Between stimulus and response is a pause wherein our ability to choose lies".

Medlem sedan juni 2000504 inlägg
#5

I mitt ex ovan menade jag förresten någonting i stil med

update blabla WHERE ID >= MIN(curID) AND ID <= MAX(curID) :)

(iif fungerar kanonbra i andra updates jag kört, fast jag vet inte om man kanske kan köra den i detta sammanhang med viss modifiering, eller om man måste göra på ett helt annat sätt? )

------------------
"Between stimulus and response is a pause wherein our ability to choose lies".

Medlem sedan juni 2000504 inlägg
#6

Hej igen :)

Jag hittade ett inlägg från tidigare, där det föreslogs att använda en hidden tag för varje loop och sätta ID-värdet till value för dessa hidden taggar.

Det fungerar och jag kan requesta fram ID-värdena med en FOR-loop från hidden istället för från CheckBox values.

Men är det nån som har nåt tips på hur man får fram max/min värdena från de framloopade värdena (och sätta de till lämplig variabel?)

(Jag vill använda de i min SQL sats som beskrivet tidigare :) )

T.ex, jag kör en response.write i loopen och får fram

175
167
180
174

och jag vill ha 167 som min och 180 som max?

------------------
"Between stimulus and response is a pause wherein our ability to choose lies".

Medlem sedan mars 20002 836 inlägg
#7

I for loopen så kan du lägga till varje värde du får ut i en array.
Därefter kan du sortera arrayen antingen ASC eller DESC.

cya,
PatrikB

------------------
*Det tar sig sa han som hade eld i håret*

Medlem sedan juni 2000504 inlägg
#8

Tackar PatrikB.. :) Sitter o pillar på det just nu. Jag kanske kan hojta till igen om det inte löser sig :)

------------------
"Between stimulus and response is a pause wherein our ability to choose lies".

Medlem sedan juni 2000504 inlägg
#9

Nu snurrar det :) Jag har lagt in värdena i en array, men hur ska jag göra med asc/desc som PatrikB nämnde?

Jag använde en sort funktion som Pace gjorde som fungerar bra o tänkte att jag kanske kunde plocka ut max/min efter att ha sorterat värdena i arrayen, fast jag kanske missade nåt för jag får ut något i stil med

106
20
3
74
75

Provade att sätta cint(ctr) men det gick inte. Kan jag fråga om hjälp igen hur man får ut max/min ur arrayen? :) Min primitiva lösning var att sen ta typ left or right för att få ut min/max.. kaos ! :) Min testsida ser ut så här ser ut så här f.n. :

chkCount = Request.Form("tCheckBox").Count
	Response.Write "Count: " & chkCount & "<p>"
	
	dim arrID(500)
	
	for i=1 to chkCount		arrID(i) = Request.Form("tCheckBox")(i)
		Response.Write arrID(i) & "<br>"
	next
	
	'Response.Write "<p>arrID(4): " & arrID(4)
	Response.Write "Max: " & UBOUND(arrID)
	
	sortArrID = sortArray(arrID,chkCount)
	
	'sorterat resultat
	FOR i = 1 TO UBOUND(arrID)
		if not sortArrID(i) = 0 then
			Response.Write "Nr " & i & ": " & sortArrID(i) & "<BR>"
		end if
	NEXT

------------------
"Between stimulus and response is a pause wherein our ability to choose lies".

Medlem sedan juni 200032 967 inlägg
#10

hur ser funktionen sortarray ut?

------------------
<A HREF="http://cartman.nu" TARGET=_blank>
can i borrow your goat?
</A>

Medlem sedan juni 2000504 inlägg
#11
FUNCTION sortArray(inArray,arraySize)
		FOR ctr1 = 1 TO arraySize
		   FOR ctr2 = ctr1 + 1 TO arraySize
		      IF inArray(cint(ctr1)) > inArray(cint(ctr2)) THEN
				temp = inArray(cint(ctr1))
				inArray(cint(ctr1)) = inArray(cint(ctr2))
				inArray(cint(ctr2)) = temp
		      End If
		   NEXT
		NEXT
		sortArray = inArray
	END FUNCTION

Jag ändrade iof lite så att villkoret för den första loopen inte var arrSize=UBOUND(inArray) utan lade till ett extra argument för att begränsa loopen till det antal som fanns i min array, eftersom jag initerade med dim arrID(500). (Det gick inte att att ha arrID(variabel) tydligen, utan bara statiskt värde?

orig koden är alltså:

FUNCTION sortArray(inArray)

	arrSize = UBound(inArray)
	FOR ctr1 = 1 TO arrSize

	   FOR ctr2 = ctr1 + 1 TO arrSize
	      IF inArray(ctr1) > inArray(ctr2) THEN
			temp = inArray(ctr1)
			inArray(ctr1) = inArray(ctr2)
			inArray(ctr2) = temp
	      End If
	   NEXT
	NEXT
	sortArray = inArray

END FUNCTION

------------------
"Between stimulus and response is a pause wherein our ability to choose lies".

Medlem sedan juni 2000504 inlägg
#12

Hej igen :)

Nu har jag kommit vidare lite granna. Sort felet innan löste sig genom att sätta cint på rätt ställe:

arrID(i) = cint(Request.Form("tCheckBox")(i))

Efter det var det lätt att hitta max/min genom att ta första o sista elementet i arrayen.

Men mitt problem är när jag kör sqlUpdate. tCheckBox som jag requestar representerar en bland flera dynamiskt framloopade checkboxar på föregående sida. De checkboxar som är iklickade inom den utav max/min angivna rangen ska i databasen sättas till TRUE och resten till FALSE.

Jag provade först med:

sqlUpdate = "UPDATE myTable SET isChecked = " &_
				"CASE WHEN TableID = " & arrCollect(1) &_
				" AND WHEN TableID = " & arrCollect(2) &_
				" AND WHEN TableID = " & arrCollect(3) & " THEN 1 ELSE 0 END " &_
				" WHERE TableID >=" & minArr & " AND TableID <= " & maxArr

men fick felmeddelande vid CASE. (arrCollection(i) ska naturligtvis inte vara hårdkodat men jag ville bara se om det fungerade så långt). Jag är inte säker på om syntaxen är riktig och sen så kanske det inte stöds av Access2000?

Sen provade jag med LarsG's tips med iif
så här:

sqlUpdate = "UPDATE myTable SET isCheckede = iif (TouristID = " & arrCollect(3) & ",true,false) WHERE TableID >=" & minArr & " AND TableID <= " & maxArr

det är närmast här som jag inte klarar av problemet. Vad som händer är att den rad som anges av arrCollect(3) sätts till TRUE och resten till FALSE inom den range som anges av max/min. Och det är ju okay om EN checkbox har klickats i. Men säg att t.ex 3checkboxar klickats i. De bör (?) jag ju sätta sqlUpdate i en FOR-loop, och använda arrCollect(i) för att på så sätt uppnå önskat resultat.

Problemet med detta är ju att nästa loop "sopar" igen föregående loops resultat, dvs. sätter den rad (i databasen) som blev satt som TRUE till FALSE istället, eftersom endast AKTUELL arrCollect(i) sätts till TRUE, och resten till FALSE.

Går detta att lösa på något sätt?

Svårt att veta om jag var övertydlig eller om det blev flummigt. Jag förklarar gärna igen, då jag gärna tar emot all hjälp jag kan få, eftersom om detta går att lösa så är det mycket annat som också kommer att fungera :)

------------------
"Between stimulus and response is a pause wherein our ability to choose lies".

Medlem sedan juni 2000504 inlägg
#13

Såg att jag inte förklarat hur jag fick fram "arrCollect(i)":

dim arrCollect(500)
for i=1 to Request.Form("chkFinished").Count 
	arrCollect(i) = cint(Request.Form("chkFinished")(i))
next

Försök till sammanfattning:
På sidan med checkboxar har jag en loop som loopar fram checkboxar och hidden fält. Loopen ser, något nedbantad och med förenklade namn, ut så här:

while not rs.EOF
	Response.Write	"<tr bgcolor='" & strColor & "' class=""TextNormal"">" &_
	"<td align=""center""><input type=""checkbox"" name=""[b]chkFinished[/b]"" value=""" & rs("[b]TableID[/b]") & """></td>" &_
	"<input type=""hidden"" value=""" & rs("[b]TableID[/b]") & """ name=""tCheckBox"">"
rs.movenext
wend

arrID() används för att requesta hidden fälten och får då fram TableID som har samma value som checkboxarna. De ger mig sedan underlag för att få fram max/min range.

arrCollect() är till för att få fram vilka checkboxar som är iklickade.

I sqlUpdate vill jag alltså sen uppdatera den rad där TableID = arrCollect(i) men får problem såsom beskrivet ovan.

Nu kommer jag inte på vad mer jag kan förtydliga.. :) Hoppas att det gick att förstå.

------------------
"Between stimulus and response is a pause wherein our ability to choose lies".

260 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)