Comunidad de diseño web y desarrollo en internet online

Combos dependientes con AS3

Citar            
MensajeEscrito el 09 Mar 2008 10:35 pm
Wenas, tengo un archivo "ficha.xml" que contine el nombre de la persona <Nombre>, el apellido <Apellido> y el grupo al que pertenece <Grupo>.

En Flash tengo 2 combos, en el 1º cargo los grupos, que me salen repetidos por cada persona... (pero ese es otro problema) lo que quiero es que al seleccionar del 1º combo un grupo, me salgan en el 2ºcombo los nombres de las personas que tengan ese grupo, y no sé por donde empezar... :crap: ...

Por ahora tengo este código:

Código :

import flash.net.URLRequest;
import flash.net.URLLoader;
import fl.controls.*;
import fl.data.*;

//ComboBox
var cmb_grupo:ComboBox=new ComboBox();
cmb_grupo.move(10,30);
var cmb_nombres:ComboBox=new ComboBox();
cmb_nombres.move(120,30);

//XML
var url:URLRequest=new URLRequest("ficha2.xml");
var loader:URLLoader=new URLLoader();
loader.load(url);
var xml:XML=new XML(loader.data);
var dp:DataProvider=new DataProvider(xml);

//Funciones
function alCompletar(event){   
   cmb_grupo.dataProvider=dp;
   cmb_grupo.labelField="Grupo";   
   addChild(cmb_grupo);
   
   cmb_grupo.addEventListener(Event.CHANGE, accion);
}
loader.addEventListener(Event.COMPLETE, alCompletar);

function accion(evento:Event):void{
   var item:Object=evento.target.selectedItem;
                //ESTO ES LO QUE NO SE COMO HACER
   cmb_nombres.dataProvider=dp//.setPropertyIsEnumerable("Grupo",item); ¿?¿?¿?¿?¿?¿?
   cmb_nombres.labelField="Nombre";
   
   addChild(cmb_nombres);   
}

Por favor, que alguien que sepa me diga cómo podría hacerlo con AS3

Saludos  ^^ 

Por Uruviel

48 de clabLevel



Genero:Femenino  

msie7
Citar            
MensajeEscrito el 10 Mar 2008 11:29 am
Prueba a poner lo siguiente:

Código :

function accion(evento:Event):void{

   var item:String=evento.target.selectedLabel;

   cmb_nombres.dataProvider= xml..(@Grupo==item);

   cmb_nombres.labelField="Nombre";

   addChild(cmb_nombres);   
}

Si no me equivoco, eso te devuelve los nodos que tengan el atributo Grupo igual al label seleccionado del primer combo.
Eso suponiendo que tienes Grupo como atributo en el xml.
Espero que te sirva.

Por Whitefeet

42 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 10 Mar 2008 11:46 am
Muchísimas gracias Whitefeet, voy a probarlo

^^

Por Uruviel

48 de clabLevel



Genero:Femenino  

msie7
Citar            
MensajeEscrito el 10 Mar 2008 12:21 pm
Pues no va... :cry:
Al hacer

Código :

cmb_nombres.dataProvider= xml..(@Grupo==item);

me da un error de salida: Error de conversión forzada: no se puede convertir XMLList@2e2aee9 en fl.data.DataProvider.

Por Uruviel

48 de clabLevel



Genero:Femenino  

msie7
Citar            
MensajeEscrito el 10 Mar 2008 01:07 pm
Ays, cierto, porque devuelve un XMLList y quiere un XML...
Supongo que si pones...

Código :

cmb_nombres.dataProvider= xml..(@Grupo==item) as XML;


También te dará error... así que es posible que debas crear un XML al que añadas el resultado de esa sentencia. Prueba a hacer un trace de eso, a ver si realmente te devuelve lo que necesitas.
Ve probando y comentas.

Por Whitefeet

42 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 10 Mar 2008 01:11 pm
Al final lo he conseguido con un for each, porque si sólo coge un elemento de la lista sí que te deja hacerlo

Código :

function alCompletar(event){
     //Cargamos los datos del xml
     var xml:XML=new XML(loader.data);

     //Añadimos cada elemento "Grupo" en el ComboBox 
     for each (var item in xml..Grupo) { 
          cmb_grupos.addItem({label:item});  //ponemos "label" para añadir como texto
     } 
}


Ahora lo probaré con el combo dependiente :wink:

Por Uruviel

48 de clabLevel



Genero:Femenino  

msie7
Citar            
MensajeEscrito el 10 Mar 2008 02:46 pm
Bueno, aquí les dejo el código completo, ya funciona todo correctamente :wink:

Código :

import flash.display.*;
import flash.events.*;
import fl.controls.*;
import fl.data.*;

//ComboBox
var cmb_grupos:ComboBox=new ComboBox();
cmb_grupos.move(100,100);
addChild(cmb_grupos);
var cmb_nombres:ComboBox=new ComboBox();
cmb_nombres.move(250,100);

//XML
var xml:XML;
var url:URLRequest=new URLRequest("ficha2.xml");
var loader:URLLoader=new URLLoader();
loader.load(url);

function alCompletar(event){
   //Cargamos los datos del xml
   var xml:XML=new XML(loader.data);

   //Añadimos cada elemento "Grupo" en el ComboBox 
   for each (var item in xml..Grupo) { 
   cmb_grupos.addItem({label:item});  //ponemos "label" para añadir como texto
    } 
   
   cmb_grupos.addEventListener(Event.CHANGE, accion);
}
loader.addEventListener(Event.COMPLETE, alCompletar);

function accion(evento:Event):void{
   var xml:XML=new XML(loader.data);  //Cargamos los datos del xml
   //Cogemos el valor del combo seleccionado
   var num_grupo:String=evento.target.selectedLabel;  
   //Creamos una lista de los elementos que contienen el valor seleccionado en IdGrupo
   var list_datos:XMLList=(xml..Row.(IdGrupo==num_grupo)); 
   
   cmb_nombres.removeAll(); //Borramos el combo
   //Añadimos el "Nombre" de cada elemento de "list_datos" en "cmb_nombres"
   for each(var item in list_datos.Nombre){      
      cmb_nombres.addItem({label:item});
   }
   
   addChild(cmb_nombres);
}


Espero les sea de ayuda, saludos ^^

PD:Muchas gracias Whitefeet por tus consejos y ayuda

Por Uruviel

48 de clabLevel



Genero:Femenino  

msie7
Citar            
MensajeEscrito el 10 Mar 2008 07:30 pm
De nada, una pena que no haya podido ser de más ayuda.
A la próxima lo haré mejor ;)

Por Whitefeet

42 de clabLevel



Genero:Masculino  

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.