Comunidad de diseño web y desarrollo en internet online

Problemita con combobox

Citar            
MensajeEscrito el 20 Ago 2008 02:56 pm
Hola gente, estoy teniendo un problema al completar un ComboBox con el resultado de un WebService.
El problema está acá:

Código :

[Bindable]
private var arrProvincias:ArrayCollection
private var arrProvinciasNombres:ArrayCollection
private function onGetProvincias (event:ResultEvent):void
{         
arrProvincias=event.result as ArrayCollection;      
var oItem : Object;

for ( var i:String in arrProvincias ) {
   trace( i + ":" + arrProvincias[i].provincia );
             
   oItem = new Object();
   oItem.name = arrProvincias[i].provincia;
   oItem.id = arrProvincias[i].provinciaId;

   }         
   arrProvincias.addItem(oItem);
         
   provincia.dataProvider = arrProvincias;
}


Asi como está, en el combobox se muestran los 7 registros que existen como:

[object][object]
[object][object]
[object][object]
[object][object]
[object][object]
[object][object]
Mendoza

Es decir, el ultimo registro esta bien guardado en el arrayCollection, entonces probé poniendo " arrProvincias.addItem(oItem);" dentro del ciclo for in, pero ahi se cuelga y entra a un ciclo infinito... (lo veo en el debbuger)
Además probé otras cosas mas chapuzas xD que daban errores bien grandes.. Alguien puede ver lo que yo no veo? una guia please.

Saludos

Jonathan

Por jgriguol

35 de clabLevel



Genero:Masculino  

Argentina

msie7
Citar            
MensajeEscrito el 20 Ago 2008 03:14 pm
No se como esta estructurado tu arreglo "arrProvincias" pero guiándome por como lo tienes puesto, debe ser algo como esto:

Código ActionScript :

var datos:Array = new Array();

for (var i:String in arrProvincias) {

   datos.push({data:arrProvincias[i].provinciaId, label:arrProvincias[i].provincia});

}

provincia.dataProvider = datos;

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 20 Ago 2008 03:55 pm

elchininet escribió:

No se como esta estructurado tu arreglo "arrProvincias" pero guiándome por como lo tienes puesto, debe ser algo como esto:

Código ActionScript :

var datos:Array = new Array();

for (var i:String in arrProvincias) {

   datos.push({data:arrProvincias[i].provinciaId, label:arrProvincias[i].provincia});

}

provincia.dataProvider = datos;


Hola elchininet, el arreglo esta bien como lo tomaste, el ws solo me trae 2 campos, el id y el nombre de la provincia. Probé el codigo que me pasaste y me está dando un error.

Éste es tu código:

Código :

var datos:Array = new Array();
for (var i:String in arrProvincias) {
   datos.push({data:arrProvincias[i].provinciaId, label:arrProvincias[i].provincia});
   //trace(datos.provincia); (evidentemente asi no es xD)
   }
provincia.dataProvider = datos;  //aqui me da el error (el de la linea 139)


el error escribió:


TypeError: Error #1006: addEventListener no es una función.
at com.salesbuilder.controls::ComboBox/set dataProvider()[D:\Proyectos AIR\HRTools\src\com\salesbuilder\controls\ComboBox.as:30]
at com.salesbuilder.view::PersonaInfo/onGetProvincias()[D:\Proyectos AIR\HRTools\src\com\salesbuilder\view\PersonaInfo.mxml:139]


Me he estado manejando con ArrayCollection y la verdad nunca use el push. Como accedo a cada elemento del Array?

Éste es el comboBox en mxml:

<c:ComboBox x="154" y="345" id="provincia" width="171" labelField="name" valueField="id" />

Como lo hiciste vos, es necesario declararles las propiedades labelField y valueField?

Gracias por ayudarme, si podes un pelín más te lo agradecere de nuevo :)

saludos

Por jgriguol

35 de clabLevel



Genero:Masculino  

Argentina

msie7
Citar            
MensajeEscrito el 20 Ago 2008 04:42 pm
Disculpa, lo estaba haciendo por el viejo método de AS2 que es con un arreglo, en AS3 introdujeron el DataProvider como clase, a veces pongo cosas de AS2 en AS3 y viceversa. Debe ser tratado con DataProvider, te pongo un ejemplo de "arrProvincias" como debe estar estructurado:

Código ActionScript :

var arrProvincias:Array = new Array({provinciaId:1, provincia:"Pinar del Río"}, {provinciaId:2, provincia:"La Habana"}, {provinciaId:3, provincia:"Matanzas"});

var datos:DataProvider = new DataProvider();

for (var i:String in arrProvincias) {

   datos.addItem({data:arrProvincias[i].provinciaId, label:arrProvincias[i].provincia});

}

provincia.dataProvider = datos;

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 20 Ago 2008 04:46 pm
Ahh y para acceder al DataProvider:

Código ActionScript :

datos[numero].data; //---Para el ID
datos[numero].label; //---Para el nombre


Y no es obligado usarlos los dos, pero es muy cómodo ya tener todo en el comboBox porque de esta forma cuando presiones una provincia puede devolverte el Id de esta y no tendrías que hacer una función para hallarlo.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 20 Ago 2008 05:26 pm
Ahora me da un error "Llamada a un método DataProvider posiblemente no definido" y "No se encontró el tipo o no es una constante en tiempo de aplicación:DataProvider"
Habrá que importar alguna clase? No sabia que se podia hacer de tipo de dato DataProvider, tenia entendido que cualquier Array, o ArrayCollection servia para popular ciertos componentes y funcionar como dataProvider sin explicitarlo, como en el caso del ComboBox.

Por otra parte, se que el resultado del webservice viene como un ArrayCollection, pero no se si toma exactamente esa forma que pusistes hard coded.

Eso que dices de que no es necesario utilizar una funcion para capturar el value me parece genial, sólo de ésta forma es posible? Eso es fundamental para lo que quiero hacer, de hecho es parte de un form de ABM y necesito tomar el valueField siempre.

Gracias por tu tiempo :)

Por jgriguol

35 de clabLevel



Genero:Masculino  

Argentina

msie7
Citar            
MensajeEscrito el 20 Ago 2008 05:58 pm
Bueno desde una clase de AS3 que también debe servirte debo importar estas clases para trabajar con un ComboBox

Código ActionScript :

import fl.controls.ComboBox;
import fl.data.DataProvider;
import flash.events.*;


He hecho un ejemplo y me funciona desde flash, debes probra por tu lado.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 20 Ago 2008 06:02 pm
Cuando deseo capturar un id al ser presionado un item del comboBox, lo hago de esta manera:

Código ActionScript :

provincia.addEventListener(Event.CHANGE, getIdProv);

function getIdProv(evt:Event):void{
   
   trace(evt.target.selectedItem.data);
   
}

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 20 Ago 2008 06:03 pm
Estoy viendo... puede ser que mi webservice devuelva solamente un ArrayCollection?, ya he utilizado otro Webservice para llenar un DataGrid y he utilizado ArrayCollection.

Edit: mientras escribia ésto.. probé con otra forma.. de todas formas necesito saber si puedo tomar el valueField sin implementar ninguna funcion.
He aqui el codigo:

Código :

[Bindable]
private var arrProvincias:ArrayCollection
private var arrProvinciasNombres:ArrayCollection
private function onGetProvincias (event:ResultEvent):void
{         
   arrProvincias=event.result as ArrayCollection;
   var datos:ArrayCollection = new ArrayCollection();
   //var datos:DataProvider = new DataProvider();// AcÁ me daba un error por el tipo de dato
   for (var i:String in arrProvincias) {   
   datos.addItem({data:arrProvincias[i].provinciaId, label:arrProvincias[i].provincia});
   }
   provincia.dataProvider = datos;
}


El MXML:
<c:ComboBox x="154" y="345" id="provincia" width="171" labelField="label" valueField="data" />

y funcionó!, ahora, cuando te referias a tomar el value sin implementar alguna funcion te referias a hacer:
trace(provincias.value); ? Porque si es asi, me lo está tomando bien creo.

Por jgriguol

35 de clabLevel



Genero:Masculino  

Argentina

msie7
Citar            
MensajeEscrito el 20 Ago 2008 06:11 pm
Me refería a una función para hallar el id dentro de tu array collection. Si tienes que hacer una función, la de presionar los items, pero al hacerlo puedes tomar de este el id de la provincia.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 20 Ago 2008 06:50 pm
La última chininet... que diferencia hay entre usar el addEventListener y usar una funcion como ésta:

Código :

import mx.events.ListEvent;

public function obtenerProvinciaId(event:ListEvent):void{     
         trace(provincia.value);   
      }


Mi MXML:

Código :

<c:ComboBox x="154" y="345" id="provincia" width="171" labelField="label" valueField="data"
      change="obtenerProvinciaId(event)" />


Asi con ésa funcion puedo obtener el valor que necesito para por ejemplo, hacer un alta o modificación. Con eso vale? o es muy chapucero hacerlo asi? Mi pregunta pasa más ya por qué es lo más optimo, o mas "profesional", no se si me explico.

Igualmente mil gracias por la ayuda, gracias avos tengo lo que quería funcionando.

Saludos

Por jgriguol

35 de clabLevel



Genero:Masculino  

Argentina

msie7
Citar            
MensajeEscrito el 20 Ago 2008 09:05 pm
Es lo mismo, no se si notaste que el evento que llamo lo hago con CHANGE y en el caso tuyo lo tienes en el mxml cuando creas el componente le añades el evento change, y la forma que capturas el texto no está mal, lo que haces con:

Código ActionScript :

trace(provincia.value);


Es capturar el texto que tiene el comboBox puesto en ese momento y lo que haces con esto:

Código ActionScript :

trace(evt.target.selectedItem.data);


Es el item que se ha seleccionado tomar los datos de él como el "id" de la provincia si lo necesitaras, pero si solamente necesitas el nombre de la provincia lo puedes hacer como lo tienes puesto.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 21 Ago 2008 02:22 am
En realidad, con provincia.value, lo que obtengo es el id, para obtener el nombre seria provincia.text..

Ya me ha quedado funcionando eso. El nuevo problema es que no me funcionan si tengo que utilizar otro webservice xD.. estoy utilizando uno para cargar el ComboBox, y otro para hacer el ALTA de usuario, parece que no pueden convivir juntos jeje. Ya tendré que investigar un poco, si no encuentro nada claro, recurriré al foro mañana.

Gracias! :wink: ^^

Por jgriguol

35 de clabLevel



Genero:Masculino  

Argentina

msie7
Citar            
MensajeEscrito el 21 Ago 2008 02:27 pm
Creo que si lo puedes hacer, cada "<mx:WebService>" puedes incluirle varias "<mx:operation>" cada una con su "<mx:request>" así de esta menera puedes hacer varias request en un solo WebService.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 21 Ago 2008 02:38 pm
Hola man, era una burrada mía... si funciona.

Código :

private var webService : WebService = new WebService();
      
      private function loadWebService():void
      {
         // Cargar el WSDL y agregar listeners para saber cuando este listo
         webService.wsdl = "http://localhost:3332/net/Service.asmx?WSDL";
         webService.addEventListener(LoadEvent.LOAD, onWSDL);
         webService.addEventListener(FaultEvent.FAULT, onWebServiceFault);
         webService.loadWSDL( );
      }


Ese es uno por ejemplo, y al otro lo declaré utilizando la misma variable webService de tipo WebService, de ahi el conflicto, por lo cual me daba un error.

Por cierto, prefiero utilizar el {as} para el manejo de éstos... hay alguna diferencia en cuanto a rendimiento si se hace con MXML? actionscript me da la sensación de tener mayor control de todo en mis manos xD, más alla de que mi capacidad de control sea más bien escasa! jaja. Como estoy aprendiendo, prefiero ir bien de abajo.

Saludos!

Jonathan

Por jgriguol

35 de clabLevel



Genero:Masculino  

Argentina

msie7
Citar            
MensajeEscrito el 21 Ago 2008 03:09 pm
El rendimiento no tiene nada que ver, puedes hacerlo por cualquiera de las dos vias, pero en mi caso particular que empecé con flash, me siento con más control sobre las cosas con AS aunque muchas veces tenga que emplear un poco más de trabajo.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox

 

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