webForumDet fria alternativet

Från Listbox -----> Listbox och ....

29 svar · 1 934 visningar · startad av PatrikB

PatrikBMedlem sedan mars 20002 713 inlägg
#1

hello,
finns det någon vänlig själ som kan fixa detta lilla problem som jag har.

Det är så att jag listar upp en del värden i en listbox. Med hjälp av en submit-knapp "förflyttar" man det valda objectet över till den andra listboxen.

Jag har redan ett script för det:

<SCRIPT LANGUAGE="JavaScript">

<!--
sortitems = 1; // Automatically sort items within lists? (1 or 0)

function move(fbox,tbox) {
for(var i=0; i<fbox.options.length; i++) {
if(fbox.options.selected && fbox.options.value != "") {
var no = new Option();
no.value = fbox.options.value;
no.text = fbox.options.text;
tbox.options[tbox.options.length] = no;
fbox.options.value = "";
fbox.options.text = "";
fbox.options.selected = 1;
}
}
BumpUp(fbox);
if (sortitems) SortD(tbox);
}
function BumpUp(box) {
for(var i=0; i<box.options.length; i++) {
if(box.options.value == "") {
for(var j=i; j<box.options.length-1; j++) {
box.options[j].value = box.options[j+1].value;
box.options[j].text = box.options[j+1].text;
}
var ln = i;
break;
}
}
if(ln < box.options.length) {
box.options.length -= 1;
BumpUp(box);
}
}

function SortD(box) {
var temp_opts = new Array();
var temp = new Object();
for(var i=0; i<box.options.length; i++) {
temp_opts = box.options;
}
for(var x=0; x<temp_opts.length-1; x++) {
for(var y=(x+1); y<temp_opts.length; y++) {
if(temp_opts[x].text > temp_opts[y].text) {
temp = temp_opts[x].text;
temp_opts[x].text = temp_opts[y].text;
temp_opts[y].text = temp;
}
}
}
for(var i=0; i<box.options.length; i++) {
box.options.value = temp_opts.value;
box.options.text = temp_opts.text;
}
}
// -->
</script>

Problemet nu är att jag vill att de man har förflyttat över ska bli markerade så att man med hjälpa av ASP ska kunna få "användning" för dessa.

Hoppas att det var någon som förstod vad jag menar ... och som kan hjälpa till och lösa detta problems ...

cu all l8er
/PatrikB

emissionMedlem sedan dec. 19996 095 inlägg
#2

en liten

for(var i=0; i<box.options.length; i++) {
box.options.selected=true;
}

borde räcka. En annan variant är att vid OnSubmit flytta över alla rader i listan till ett hiddenfält, och separera med något bra tecken.

PatrikBMedlem sedan mars 20002 713 inlägg
#3

Tackar,

ska testa .....

//PatrikB

PatrikBMedlem sedan mars 20002 713 inlägg
#4

Hello,

funkar hur bra som helst.

muchas gracias,

//PatrikB

petergMedlem sedan aug. 200023 inlägg
#5

Hej!
Jag använder samma kodexempel och sitter med samma problem just nu och kan tyvärr inte mycke javascript, så jag skulle bli jätteglad om någon kunde förklara lite mera ingående hur, (gärna exempel), man med hjälp av OnSubmit flyttar över alla rader i listan till ett hiddenfält, och separerar detta med något bra tecken.

petergMedlem sedan aug. 200023 inlägg
#6

Problemet löst!

[Redigerat av peterg den 06 dec 2001]

solbulleMedlem sedan mars 20014 998 inlägg
#7

Ursäkta solbulle. Detta är andra gången inom loppet av 2 dagar som jag klickar på redigera-knappen istället för "skriv inlägg". Jag lovar att skärpa mig :)

Här är svaret på din fråga i alla fall.

function Moveup(dbox) {
for(var i = 0; i < dbox.options.length; i++) {
if (dbox.options[i].selected && dbox.options[i] != "" && dbox.options[i] != dbox.options[0]) {
var tmpval = dbox.options[i].value;
var tmpval2 = dbox.options[i].text;
dbox.options[i].value = dbox.options[i - 1].value;
dbox.options[i].text = dbox.options[i - 1].text
dbox.options[i-1].value = tmpval;
dbox.options[i-1].text = tmpval2;
dbox.selectedIndex=i;
      }
   }
}

[Redigerat av en trött Jojoxx den 18 jan 2002]

[Redigerat av Jojoxx den 18 jan 2002]

solbulleMedlem sedan mars 20014 998 inlägg
#8

Där ser man så det kan bli, nästan så att man får svaret innan frågan är ställd så att säga :)

:( Tyvärr vill det sig inte som jag vill, när jag gör som du skrivit "förstör" jag lite av den tidigare funktionen när jag flyttar över värdena till denna listbox.
Jag vill helst att när jag först kör den första funktionen och värdena flyttas över så skall de hamna längst ner i den andra boxen. (Vilket de gör orginal) Sen när man markerar en post i dne "nya" boxen och kör Moveup-funktionen vill jag att den post man markerat och därmed flyttat skall vara fortsatt markerad så aatt om man vill flytta upp den ett steg till ska man inte behöva markera den igen.
Är deta möjligt tro?

------------------
/solbulle
Hemmabio | Spelautomater | The Who

JojoxxMedlem sedan juni 20004 306 inlägg
#9

Ja, så här skall det ju vara :)

function Moveup(dbox) {
if(dbox.selectedIndex>0){
for(var i = 0; i < dbox.options.length; i++) {
if (dbox.options[i].selected && dbox.options[i] != "" && dbox.options[i] != dbox.options[0]) {
var tmpval = dbox.options[i].value;
var tmpval2 = dbox.options[i].text;
dbox.options[i].value = dbox.options[i - 1].value;
dbox.options[i].text = dbox.options[i - 1].text
dbox.options[i-1].value = tmpval;
dbox.options[i-1].text = tmpval2;
}
}
dbox.selectedIndex--;
}
}

------------------
/ J

solbulleMedlem sedan mars 20014 998 inlägg
#10

SUPERBRA!

Precis som jag vill ha det, kvalitet.
Tackar.

------------------
/solbulle
Hemmabio | Spelautomater | The Who

solbulleMedlem sedan mars 20014 998 inlägg
#11

Jag vet inte riktigt om detta är möjligt överhuvudtaget, men men ett försök i alla fall.
I min "nya" selectbox vill jag efter att jag sorterat dom med funktionen Moveup kunna spara alla poster/rader med dess gamla value (från den första selecten) samt det nya valuet som kommer utav placeringen i den nya boxen.
Går det och hur göra egentligen?

Vidare skulle jag om möjlig byta texten i boxen, lägga till en siffra som sätter ut placeringen.

Lite lösryck kod:

function Moveup(dbox) {
if(dbox.selectedIndex>0){
for(var i = 0; i < dbox.options.length; i++) {
if (dbox.options[i].selected && dbox.options[i] != "" && dbox.options[i] != dbox.options[0]) {
var tmpval = dbox.options[i].value;
var tmpval2 = dbox.options[i].text;
dbox.options[i].value = dbox.options[i - 1].value;
splitstringt = (dbox.options[i - 1].text).split(". ");
tmpva22 = splitstringt[1]
dbox.options[i].text = (1+dbox.selectedIndex) + ". "+ tmpva22
dbox.options[i-1].value = tmpval;
splitstring = tmpval2.split(". ");
tmpval2 = splitstring[1]
dbox.options[i-1].text = (dbox.selectedIndex) + ". " + tmpval2;
}
}
dbox.selectedIndex--;
}
}

Detta fixar till det hela vid förflyttning på just den aktuella raden.
Men i Move-funktionen, hur får jag in värdet där?

OM det nu går att göra så här och om jag verkligen fortfarande kan komma åt mitt ursprungliga value???

------------------
/solbulle
Hemmabio | Spelautomater | The Who

solbulleMedlem sedan mars 20014 998 inlägg
#12

Ok, nu har jag fått till min lilla hjälpnumrering, den egentliga frågan om jag nu någonsin ska få användning för denna lilla grej är om jag kan få ut "det ingående valuet" samt sedan även positionen i selectboxen?
Kan jag det?

------------------
/solbulle
Hemmabio | Spelautomater | The Who

[Redigerat av solbulle den 19 jan 2002]

solbulleMedlem sedan mars 20014 998 inlägg
#13

Ok, jag frtsätter i min lilla enmannatråd :)
Har nog löst det nu, ska bara putsa till det lite sen lägge jag upp det här så har ni världens bästa funktion att tillgå! (hupp...)

------------------
/solbulle
Hemmabio | Spelautomater | The Who

solbulleMedlem sedan mars 20014 998 inlägg
#14

Så här ser det ut nu:

<SCRIPT LANGUAGE="JavaScript">

<!-- 
sortitems = 0; // Automatically sort items within lists? (1 or 0)

laggtill ="1"
tabort ="2"

function move(fbox,tbox,vad) {
for(var i=0; i<fbox.options.length; i++) {
if(fbox.options[i].selected && fbox.options[i].value != "") {
var no = new Option();
no.value = fbox.options[i].value;
no.text = fbox.options[i].text;
po = tbox.selectedIndex--;
if(vad == laggtill)
{
var boxLength = fbox.length;
boxLength = (11-boxLength)
tut = fbox.options[i].value
no.text = boxLength + ". " + no.text;}
else if(vad == tabort)
{
splitstr = no.text
splitstring = splitstr.split(". ");
no.text = splitstring[1]
}
tbox.options[tbox.options.length] = no;
fbox.options[i].value = "";
fbox.options[i].text = "";
fbox.options[i].selected = 1;
}
}
BumpUp(fbox);
if (sortitems) SortD(tbox);
if(document.formen.checkbox.checked){
SortD(fbox);
}
}

function BumpUp(box) {
for(var i=0; i<box.options.length; i++) {
if(box.options[i].value == "") {
for(var j=i; j<box.options.length-1; j++) {
box.options[j].value = box.options[j+1].value;
box.options[j].text = box.options[j+1].text;
}
var ln = i;
break;
}
}
if(ln < box.options.length) {
box.options.length -= 1;
BumpUp(box);
}
}

function SortD(box) {
var temp_opts = new Array();
var temp = new Object();
for(var i=0; i<box.options.length; i++) {
temp_opts[i] = box.options[i];
}
for(var x=0; x<temp_opts.length-1; x++) {
for(var y=(x+1); y<temp_opts.length; y++) {
if(temp_opts[x].text > temp_opts[y].text) {
temp = temp_opts[x].text;
temp_opts[x].text = temp_opts[y].text;
temp_opts[y].text = temp;
}
}
}
for(var i=0; i<box.options.length; i++) {
box.options[i].value = temp_opts[i].value;
box.options[i].text = temp_opts[i].text;
}
}

function remove(box) {
for(var i=0; i<box.options.length; i++) {
if(box.options[i].selected && box.options[i] != "") {
box.options[i].value = "";
box.options[i].text = "";
   }
}
BumpUp(box);
} 

function Moveup(dbox) {
if(dbox.selectedIndex>0){
for(var i = 0; i < dbox.options.length; i++) {
if (dbox.options[i].selected && dbox.options[i] != "" && dbox.options[i] != dbox.options[0]) {
var tmpval = dbox.options[i].value;
var tmpval2 = dbox.options[i].text;
dbox.options[i].value = dbox.options[i - 1].value;
splitstringt = (dbox.options[i - 1].text).split(". ");
tmpva22 = splitstringt[1]
dbox.options[i].text = (1+dbox.selectedIndex) + ". "+ tmpva22
dbox.options[i-1].value = tmpval;
splitstring = tmpval2.split(". ");
tmpval2 = splitstring[1]
dbox.options[i-1].text = (dbox.selectedIndex) + ". " + tmpval2;
}
}
dbox.selectedIndex--;
}
}

function Movedown(ebox) {
if(ebox.selectedIndex>-1){
for(var i = 0; i < ebox.options.length; i++) {
if (ebox.options[i].selected && ebox.options[i] != "" && ebox.options[i+1] != ebox.options[ebox.options.length]) {
var tmpval = ebox.options[i].value;
var tmpval2 = ebox.options[i].text;
ebox.options[i].value = ebox.options[i + 1].value;
splitstringt = (ebox.options[i + 1].text).split(". ");
tmpva22 = splitstringt[1]
ebox.options[i].text = (1+ebox.selectedIndex) + ". "+ tmpva22
ebox.options[i+1].value = tmpval;
splitstring = tmpval2.split(". ");
tmpval2 = splitstring[1]
ebox.options[i+1].text = (2+ebox.selectedIndex) + ". " + tmpval2;
}
}
ebox.selectedIndex++;
}
}

function saveMe() {
var strValues = "";
var boxLength = document.formen.list2.length;
var count = 0;
if (boxLength != 0) {
for (i = 0; i < boxLength; i++) {
if (count == 0) {
strValues = document.formen.list2.options[i].value;
}
else {
strValues = strValues + "," + document.formen.list2.options[i].value;
}
count++;
   }
}
if (strValues.length == 0) {
alert("Listan är tom!");
}
else {
document.formen.textfield.value = strValues
alert("Dina val, i ordning:\r\n(Se nu till att gör nytta av dom!)\r\n" + strValues);
   }
}

// -->
</script>

Nu måste jag iofs kanske knalla över till aspforumet för nu ska jag till att sätta in selectvärdena i boxarna dynamiskt. Dock så klarar mina funktioner här inte av poster i den "andra" selectboxen från början, men jag tänkte att man kanske om inte annat kan lösa det med ett onloadscript som direkt flyttar över en del poster från första selecten?
Någon?

Sen funkar inte "omnumreringen" när jag flyttar tillbaks en post, någon?

------------------
/solbulle
Hemmabio | Spelautomater | The Who

solbulleMedlem sedan mars 20014 998 inlägg
#15
function loadmove(fbox,tbox,vad,vilken)
{
if(vilken > -1){
i = vilken
var no = new Option();
no.value = fbox.options[i].value;
no.text = fbox.options[i].text;
po = tbox.selectedIndex--;
if(vad == laggtill)
{
var boxLength = fbox.length;
boxLength = (11-boxLength)
tut = fbox.options[i].value
no.text = boxLength + ". " + no.text;}
else if(vad == tabort)
{
splitstr = no.text
splitstring = splitstr.split(". ");
no.text = splitstring[1]
}
tbox.options[tbox.options.length] = no;
fbox.options[i].value = "";
fbox.options[i].text = "";
fbox.options[i].selected = 1;
}

Fast det lirar ju inte om jag kör det flera ggr på raken med de ursprungliga värdena... (positionen i selecten)
Hm...

------------------
/solbulle
Hemmabio | Spelautomater | The Who

solbulleMedlem sedan mars 20014 998 inlägg
#16

Oh uj oj. Löst! Postar fullösning:

mystring ="3,4,9,1,2"

function ladda()
{
var ar=mystring.split(",");
for(var i=0; i<ar.length; i++) {
p = ar[i]-1
nummer = i+1
loadmove(document.formen.list3,document.formen.list2,laggtill,p,nummer);
}
for(var i=0; i<ar.length; i++) {
p = ar[i]-1
document.formen.list3.options[p].value = "";
document.formen.list3.options[p].text = "";
document.formen.list3.options[p].selected = 1;

}
BumpUp(document.formen.list3);
}

function loadmove(fbox,tbox,vad,vilken)
{
if(vilken > -1){
i = vilken
var no = new Option();
no.value = fbox.options[i].value;
no.text = fbox.options[i].text;
if(vad == laggtill)
{
no.text = nummer + ". " + no.text;}
else if(vad == tabort)
{
splitstr = no.text
splitstring = splitstr.split(". ");
no.text = splitstring[1]
}
tbox.options[tbox.options.length] = no;
}

...som man då kan slå ihop till en funktion när man sovit lite...
Tack för hjälpen solbulle!
------------------
/solbulle
Hemmabio | Spelautomater | The Who

[Redigerat av solbulle den 20 jan 2002]

-torlejf-Medlem sedan feb. 2000156 inlägg
#17

Hej allihopa!

Jag vill använda denna funktionen ni pratar om, men jag skulle gärna ville se ett koddexempel och hur FORMULÄR koden ser ut?

Taksam för hjälp!
/ David

Peter SMedlem sedan dec. 20025 484 inlägg
#18

Här är någonting jag hade på lager:

<script type="text/javascript">
<!--

function move(s){
	var
		sel=document.forms["f"],
		opt=sel.elements[s].options,
		i=opt.length,
		t=[],
		j=null,
		k=0,
		b=false;
	while(i-->0){
		switch(opt[i].selected){
		case false:
			t.push(opt[i]);
			break;
		default:
			b=true;
			sel.elements[s=="n1"?"n2":"n1"].options[sel.elements[s=="n1"?"n2":"n1"].options.length] = new Option(opt[i].text);
		}
	}
	j=t.length;
	while(j-->0){
		opt[k++] = new Option(t[j].text);
	}
	if(b) opt.length = opt.length-1;
};

//-->
</script>

...

<form onsubmit="return false" name="f">
<div style="float:left">
	<select size="12" name="n1">
		<option>Kol_1_1</option>
		<option>Kol_1_2</option>
		<option>Kol_1_3</option>
		<option>Kol_1_4</option>
		<option>Kol_1_5</option>
		<option>Kol_1_6</option>
	</select>
</div>

<div style="float:left;width:70px">
	<div style="position:relative;top:60px;text-align:center">
		<button onclick="move('n1')">--&gt;</button><br>
		<button onclick="move('n2')">&lt;--</button>
	</div>
</div>

<div>
	<select size="12" name="n2">
		<option>Kol_2_1</option>
		<option>Kol_2_2</option>
		<option>Kol_2_3</option>
		<option>Kol_2_4</option>
		<option>Kol_2_5</option>
		<option>Kol_2_6</option>
	</select>
</div>
</form>

:)

-torlejf-Medlem sedan feb. 2000156 inlägg
#19

Ja, den koden var kanon. :)
Men jag söker lite justeringar.

1. Jag vill att domman flyttar ska bli markerade i den nya listan.
2. Att sakerna man flyttar runt ska sorteras hela tiden så att dom ligger rätt.

Inte:

ACB

Utan:

ABC

EDIT: Jag vill även att man ska kunna använda värdena som man flyttar från den vänstra listan till denhögra. Alltså, ha en submitknapp som skickar iväg de värden som man har flyttat till lista två. Går det?
Tacksam för hjälp!

Peter SMedlem sedan dec. 20025 484 inlägg
#20

Edit: Nu skickas även värden med.

<script type="text/javascript">
<!--

function sortAndAdd(f,o){
	var t = [], added=false, sel=null;
	for( var i=0, elm; ( elm=f.options[i] ); i++ ){
		if(!added && o.text < elm.text){
			t.push(o);
			sel=i;
			added=true;
		}
		t.push(elm);
	}
	if(!added) t.push(o);
	f.options.length=0;
	for( var i=0, elm; ( elm=t[i] ); i++ )
		f.options[i] = new Option(elm.text,elm.value);
	f.options[typeof(sel)=="number"?sel:f.options.length-1].selected=true;
};

function move(s){
	var
		sel=document.forms["f"],
		opt=sel.elements[s].options,
		i=opt.length,
		t=[],
		j=null,
		k=0,
		b=false;
	while(i-->0){
		switch(opt[i].selected){
		case false:
			t.push(opt[i]);
			break;
		default:
			b=true;
			sortAndAdd(sel.elements[s=="n1"?"n2":"n1"], new Option(opt[i].text,opt[i].value));
		}
	}
	j=t.length;
	while(j-->0) opt[k++] = new Option(t[j].text,t[j].value);
	if(b) opt.length = opt.length-1;
};

//-->
</script>

:)

Genererad på 384 ms · cache AV · v20260730165559-full.f96bc7eb