Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Oi pessoal, estou com um probleminha em meu formulário.
Eu tenho uma lista de cargos dentro de um select multiple, mas não consigo recuprar os itens selecioandos porque o formulário é do tipo enctype="multipart/form-data". Eu selecione vários cargos, mas só consigo recuperar apenas 1 dos itens selecionados.
Como devo fazer? Não quero usar checkbox pois são muitas opções de cargos.
Obrigada
>
Da uma olhada neste tópico, pode te dar uma luz
http://forum.imasters.com.br/index.php?/topic/201879-recupera-da-select-multiple/
Eu vi o link, mas não é isso não. De qqer forma obrigada.
tem que fazer uma "gambiarra" em javascript. Dá prafazer usando jquery, fica mais simples. O problema ocorre porque ao clicar no botão para submeter, os valores selecionados são perdidos, o que se faz é manipular a seleção após o clique. Seu problema não está no form mas sim no select
<script>
function selecionarTodos(opt){
if (opt.length > 0){
for (i = 0 ; i < opt.length ; i++){
opt[i].selected = true;
}
return true;
}
return false;
}
function validarEditar(frm){
selecionarTodos(lojaSelecionada.options);
document.getElementById(frm).submit();
}
</script>
<body>
<form name="frmEditar" id="frmEditar">
<select name="lojaSelecionada" id="lojaSelecionada" multiple size="6">
<option value="12" >Loja 2</option>
<option value="13" >Loja 3</option>
</select>
<input type="button" onclick="validarEditar('frmEditar');" name="btnSalvar" id="btnSalvar" value="Salvar" />
</form>
</body>certa vez, precisei fazer um form de pesquisa bem grande mesmo, e reparei k alguns users, naun fazia a multipla escolha, e para isso, eu disponibilizei para ele, um dropdown k se caso tivesse, dependendo da escolha ele automaticamente preencheria o outro combo, mas o k deve se fazer é recuperar os dados, dá um split nele para pegar os valores, ou como citado acima com javascript.
dá uma olhada neste link, pode te ajudar
olha este exemplo:
<<%
Dim intNumberSelected
Dim strSelectedTeams
Dim arrSelectedTeams
Dim I
intNumberSelected = Request.Form("teams").Count
If intNumberSelected = 0 Then
%>
Escolha seus times favoritos (segure a tecla CTRL para selecionar mais de um):<BR>
<FORM ACTION="multiple_selection.asp" METHOD="post">
<SELECT NAME="teams" MULTIPLE SIZE="10">
<OPTION>Anaheim Angels</OPTION>
<OPTION>Atlanta Braves</OPTION>
<OPTION>Arizona Diamondbacks</OPTION>
<OPTION>Baltimore Orioles</OPTION>
<OPTION>Boston Red Sox</OPTION>
<OPTION>Chicago Cubs</OPTION>
<OPTION>Chicago White Sox</OPTION>
<OPTION>Cincinnati Reds</OPTION>
<OPTION>Cleveland Indians</OPTION>
<OPTION>Colorado Rockies</OPTION>
<OPTION>Detroit Tigers</OPTION>
<OPTION>Florida Marlins</OPTION>
<OPTION>Houston Astros</OPTION>
<OPTION>Kansas City Royals</OPTION>
<OPTION>Los Angeles Dodgers</OPTION>
<OPTION>Milwaukee Brewers</OPTION>
<OPTION>Minnesota Twins</OPTION>
<OPTION>Montreal Expos</OPTION>
<OPTION>New York Mets</OPTION>
<OPTION>New York Yankees</OPTION>
<OPTION>Oakland Athletics</OPTION>
<OPTION>Philadelphia Phillies</OPTION>
<OPTION>Pittsburgh Pirates</OPTION>
<OPTION>San Diego Padres</OPTION>
<OPTION>San Francisco Giants</OPTION>
<OPTION>Seattle Mariners</OPTION>
<OPTION>St. Louis Cardinals</OPTION>
<OPTION>Tampa Bay Devil Rays</OPTION>
<OPTION>Texas Rangers</OPTION>
<OPTION>Toronto Blue Jays</OPTION>
</SELECT>
<BR>
<INPUT type="submit" value="enviar">
</FORM>
<%arrSelectedTeams = Split(strSelectedTeams, ", ", -1, 1)
'
'ReDim arrSelectedTeams(intNumberSelected - 1)
'
'For I = 1 To intNumberSelected
' arrSelectedTeams(I - 1) = Request.Form("teams")(I)
'Next 'I
'
%>
<P>você selecionou <B><%= intNumberSelected %></B> team(s).</P>
<P>Request.Form("teams") retornou</P>
<P><FONT SIZE="-1"><B><%= strSelectedTeams %></B></FONT></P>
<P>Você pode facilmente converter isso em um array usando o comando split. O conteúdo dessa matriz são mostrados na tabela abaixo:</P>
<TABLE BORDER="1">
<TR>
<TH>Array Element <FONT COLOR="#FF0000">*</FONT></TH>
<TH>Value</TH>
</TR>
<%
For I = LBound(arrSelectedTeams) To UBound(arrSelectedTeams)
%>
<TR>
<TD><%= I %></TD>
<TD><%= arrSelectedTeams(I) %></TD>
</TR>
<%
Next 'I
%>
</TABLE>
<P><FONT COLOR="#FF0000">*</FONT> Lembre-se que matrizes de VBScript iniciar a contagem de 0. Assim, uma matriz de 10 item será executado 0-9!</P>
<%
'Dim Item
'For Each Item in Request.Form
' Response.Write Request.Form.Key(Item) & ": "
' Response.Write Request.Form.Item(Item) & " "
' Response.Write Request.Form.Item(Item).Count & "<BR>"
'NextVou tentar explicar melhor. Os valores selecionados não estão sendo perdidos, eu acho.
No formulário normal, todos os itens selecionados são recuperados. Mas no formulário do tipo multipart/form-data não. Se eu seleciono 3 cargos, só um vem.
O problema tá nessa linha:
CodCargo = UploadRequest.Item("CodCargo").Item("Value")
Para recuperar os dados eu utilizo a linha acima, e funciona normalmente. Mas para o select multiple não. Tem que ser diferente, mas não sei como.
Vou postar um trecho do código:
<!-- #include file = "Scripts/Funcoes.asp" -->
<%
' Chamando Funções, que fazem o Upload funcionar
byteCount = Request.TotalBytes
RequestBin = Request.BinaryRead(byteCount)
Set UploadRequest = CreateObject("Scripting.Dictionary")
BuildUploadRequest RequestBin
' Recuperando os Dados Digitados ----------------------
CodCargo = UploadRequest.Item("CodCargo").Item("Value")
tipo_arquivo = UploadRequest.Item("Arquivo").Item("ContentType")
caminho_arquivo = UploadRequest.Item("Arquivo").Item("FileName")
nome_arquivo = Right(caminho_arquivo,Len(caminho_arquivo)-InstrRev(caminho_arquivo,"\"))
arquivo = UploadRequest.Item("Arquivo").Item("Value")
' pasta onde os arquivos serao guardados
pasta = Server.MapPath("Arquivos")
nome_arquivo = Senha&nome_arquivo
nome_arquivo_banco = "\"&nome_arquivo
' Fazendo o Upload do arquivo selecionado
If arquivo <> "" Then
Set ScriptObject = Server.CreateObject("Scripting.FileSystemObject")
Set MyFile = ScriptObject.CreateTextFile(pasta & nome_arquivo_banco)
For i = 1 to LenB(arquivo)
MyFile.Write chr(AscB(MidB(arquivo,i,1)))
Next
MyFile.Close
End If
%>
Até testei os 2 exemplos que vcs enviaram, o primeiro não funcionou e o segundo ocorre o mesmo problema, só um cargo é recuperado.
ah tá
tens que fazer um For Each no item pois ele armazena um conjunto de valores
Acho que assim deve funcionar
For Each valor In UploadRequest.Item("CodCargo")
response.write valor.Item("Value") & "<br>"
Next
O valor seria o que?
Pq deu este erro:
Erro de tempo de execução do Microsoft VBScript (0x800A01A8)
Objeto necessário: 'valor'
usa o exemplo k colokei acima ele recupera todos os itens selecionados no SELECT MULTIPLE
Eu usei mas não dá certo. Para formulário com enctype="multipart/form-data" ele não funciona.
Meu formulário faz upload, então eu recupero os dados assim:
CodCargo = UploadRequest.Item("CodCargo").Item("Value") e não com request.form. É aqui que está o problema.
mas apenas os itens selecionados da select multiple, você pode até armazenar em session e depois usar
o que ocorre se você fizer assim:
For Each valor In UploadRequest.Item("CodCargo")
response.write valor & "<br>"
Next
Não dá erro, apenas aparece assim: Value
Acho que este link tem a solução. Porém não consegui fazer funcionar por ser javascript. Alguém poderia dar uma luz?
http://social.msdn.microsoft.com/forums/pt-BR/asppt/thread/bbeb90ad-633b-4aad-8a55-5de75f38f707/
você pode usar a funcaun em js e armazenar os itens selecionados em uma var e depois recuperar no ASP...
faz tempo que não mexo com upload sem componente. Mas me veio na mente uma "solução" em forma de POG.
ao clicar no check você varre todos da coleção, via javascript, e pega os values dos checados e joga num input do tipo hidden(separando-os com virgula). No request você faz desse hidden que terá todos os values dos cheks
///EDIT
Enquanto salvava minha ideia(post) abri o link que você achou e a logica é a mesma hehehe
Entendi a lógica, mas não manjo de javascript. Então fiz um teste assim, mas não funcionou.
<script language="JavaScript" type="text/javascript">
<!--
function Carrega()
{
vConta = 0
vCombo = document.formulario.Combo;
for(i=0;i<vCombo.options.length;i++)
{
if(vCombo.options[i].selected==true)
{
vConta = vConta + 1
if(vConta==1){
document.getElementById("campo_hidden").value +=vCombo.options[i].value;
}
else{
document.getElementById("campo_hidden").value +=","+vCombo.options[i].value;
}
}
}
//-->
</script>
<FORM name="formulario" ACTION="teste3.asp" METHOD="post" enctype="multipart/form-data" onSubmit="Carrega();">
<input type="hidden" name="campo_hidden">
<SELECT NAME="Combo" MULTIPLE SIZE="10">
<OPTION value="1">Cargo 1</OPTION>
<OPTION value="2">Cargo 2</OPTION>
<OPTION value="3">Cargo 3</OPTION>
<OPTION value="4">Cargo 4</OPTION>
<OPTION value="5">Cargo 5</OPTION>
</SELECT><BR>
<input type="file" name="Arquivo"><BR>
<INPUT type="submit" value="enviar">
</FORM>Ops, o compo hidden está assim: <input type="hidden" name="campo_hidden" value="<%=vCombo%>">
Agora funcionou. Faltava uma "}" no código.
Obrigada a todos pela ajuda.
Para quem precisar tá aqui:
<script language="JavaScript" type="text/javascript">
<!--
function Carrega()
{
vConta = 0
vCombo = document.FormCurriculo.Combo;
for(i=0;i<vCombo.options.length;i++)
{
if(vCombo.options[i].selected==true)
{
vConta = vConta + 1
if(vConta==1){
document.getElementById("campo_hidden").value +=vCombo.options[i].value;
}
else{
document.getElementById("campo_hidden").value +=","+vCombo.options[i].value;
}
}
}
}
//-->
</script>beleza, kker coisa pasta ae...
Da uma olhada neste tópico, pode te dar uma luz
http://forum.imasters.com.br/index.php?/topic/201879-recupera-da-select-multiple/