Comunidad de diseño web y desarrollo en internet online

Ayuda con datagrid y drag&drop en as3

Citar            
MensajeEscrito el 08 Jun 2011 10:01 am
Hola, estoy buscando la manera de hacer que desde un datagrid donde tengo todos los datos se pinche, se haga click o se arrastre y me muestre los datos en otro datagrid. Pero quiero que en el segundo datagrid se me vaya añadiendo todos los que arrastre.
Todos los ejemplos que veo en internet son con flex y yo estoy haciendo mi proyecto en as3.
Por favor alguna idea??
Tampoco encuentro nada para poder añadir en el datagrid varios elementos haciendo clic en una de las filas del primer datagrid.
Alguna idea o ejemplo de como puedo hacer esto en as3 con flash?
Gracias por adelantado

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 08 Jun 2011 01:46 pm
Hacer una fila arrastrable es muy difícil y un motivo absolutamente válido para usar Flex. En cuanto a agregar haciendo click, mira los eventos del datagrid en la ayuda, creo que es CHANGE (hace muuuuuuucho que no uso un datargrid en Flash), luego haces un addItem al dataProvider y lo vuelves a asignar al datagrid

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 08 Jun 2011 05:19 pm
Gracias por tu respuesta Jorge lo he estado probando pero no consigo que muestre nada el segundo datagrid, te escribo lo que hago, creo un datagrid(1) donde tengo toda mi lista y luego quiero que los que vaya haciendo click me los añada al datagrid(2), que tengo en el escenario al principio vacío.
Creo el dataprovider nuevo y le meto lo que ha clickeado pero al meterlo al otro datagrid que he llamado info no me sale nada...

Código ActionScript :

public class Main extends MovieClip{
            
         private var data_grid:DataGrid = new DataGrid();
         private var info:DataGrid=new DataGrid();
         private var dp:DataProvider;
         private var textInput:TextInput = new TextInput();
         private var xmlDP:XML;
         private var xmlListData:XML;
         private var url_loader:URLLoader = new URLLoader();
         private var grupoLista:List;
      
      public function Main():void {
         setupDatagrid();         
         data_grid.addEventListener(Event.CHANGE, clickHandler);         
      }
      
      public function setupDatagrid():void{
         // datagrid      
         var col_alimentos:DataGridColumn = new DataGridColumn("Alimentos");
         data_grid.addColumn(col_alimentos);
         
         var col_calorias:DataGridColumn= new DataGridColumn("Calorías");
         data_grid.addColumn(col_calorias);
                  
         var col_grupo:DataGridColumn= new DataGridColumn("Grupo");
         data_grid.addColumn(col_grupo);
         
         var col_img:DataGridColumn = new DataGridColumn("Imagen");
         data_grid.addColumn(col_img);
         col_img.cellRenderer = LoaderCellRenderer; 
                  
         data_grid.width = 700;         
         data_grid.rowCount = 5;
         data_grid.move(200, 220);
         addChild(data_grid);
                  
         var url:String = "lms-list.xml";
         var request:URLRequest = new URLRequest(url);
         url_loader = new URLLoader();
         url_loader.addEventListener(Event.COMPLETE, completeHandler);
         url_loader.load(request);
      }
            
      public function completeHandler(event:Event):void {
         var ldr = event.currentTarget as URLLoader;         
         xmlDP = new XML(ldr.data);
         
         dp = new DataProvider(xmlDP);
         data_grid.dataProvider = dp;
         
         setLista(xmlDP.entry.Grupo, grupoLista);
      }
      
      public function clickHandler(e:Event):void{
         var dp2:DataProvider=new DataProvider;
         dp2.addItem(data_grid.selectedItem.Grupo);
         info.dataProvider=dp2;   
      }


No estoy segura de estar haciendolo bien, que me falta???
Además he probado a imprimirlo en un textarea al hacer click en el datagrid(1) pero solo me sale uno siempre y yo quiero que me salgan varios y que pueda volver a quitarlos del segundo también.
Gracias de nuevo por cualquier ayuda.

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 08 Jun 2011 05:29 pm
EL dataProvider tiene que ser una Array, no puede ser una propiedad, por ejemplo

dp2.addItem(new Array(data_grid.selectedItem));

Aunque ya no me acuerdo mucho de los datagrid en Flash. Por otra parte si cada vez recreas el dataprovider, al clickar te borrará lo anterior y te mostrará el último, no será acumulativo

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 08 Jun 2011 06:58 pm
Gracias, he conseguido hacer lo que me has dicho, pero no me funciona cuando le personalizo el datagrid es decir cuando le digo yo las columnas que tiene que tener en mi caso quiero que tenga dos,

Código ActionScript :

dp2.addItem(new Array(data_grid.selectedItem.Grupo,data_grid.selectedItem.Alimentos));
info.dataProvider=dp2

Con lo anterior me salen dos columnas con los datos, pero no hay manera de que me salga si yo he diseñado previamente el datagrid con dos columnas con un nombre cada uno en la cabecera, entonces no me sale nada... y claro necesito poner estilos al datagrid como he hecho con el primero. Alguna idea?

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 08 Jun 2011 07:05 pm
Un dataprovider tiene tipicamente objetos con nombres de columnas y valores, así si quiero que tenga la columna Conjunto y la columna valor, haría lo siguiente>

Código ActionScript :

dp2.addItem(new Array({Conjunto:data_grid.selectedItem.Grupo,Valor:data_grid.selectedItem.Alimentos})); 


Es decir agrego un array de objetos

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 08 Jun 2011 07:28 pm
Gracias Jorge lo he conseguido poniendolo así:

Código ActionScript :

 
dp2.addItem({Grupo: data_grid.selectedItem.Grupo , Alimentos: data_grid.selectedItem.Alimentos});

Lo malo es que pueden repetirse de nuevo y añadir varios iguales, ahora lo que me interesa por lo menos es que pueda borrar algunos de los incluidos en el datagrid(2), se supone que por si me he equivocado o porque voy a poner en una columna un limite 'máximas calorías' y quiero que no pueda pasarme.
Alguna idea? Gracias de nuevo por tu ayuda.

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 08 Jun 2011 07:32 pm
PAra no repetir deberías verificar que no exista en el array del dataprovider nuevamente, eso es recorrerlo y comparar los objetos. Para borrar, puedes agregar un botón que pille el selectedItem y lo quite del dataprovider ... en fin ... son todas operaciones sobre el array

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 09 Jun 2011 03:23 pm
Hola de nuevo,
se me esta complicando mucho no consigo recorrer el dataprovider para ver si hay repetidos para que no me los añada. Tampoco consigo que me guarde bien la suma de las calorías que tengo en el datagrid que se corresponde con la suma de una de las columnas del datagrid. Lo estaba añadiendo en un array aparte pero al borrarlo no consigo volver a almacenar la suma correctamente.
Este es el código que tengo al hacer clic en el primer datagrid(1) para que se añadan al segundo y el de al hacer click en el datagrid(2) se borra:

Código ActionScript :

public function clickHandler(e:Event):void{
               
         // Me suma las calorias totales que va añadiendo
         b.push(Number(data_grid.selectedItem.Calorías));
         calorias_total=sum(b);
         if (calorias_total >= 300){
            calorias.text="Te has pasado:" +String(sum(b));
         }else {
            calorias.text=String(sum(b));
         }
         
         var ali= data_grid.selectedItem.Alimentos;
         for(var i:int=0;i<=dp2.length;i++){
            if(ali== dp2.toArray()[i].elements()){ 
                             // en este if falla y no entra con esta condicion
               info2.text="Ya tienes ese alimento";
            }else{
               dp2.addItem({Alimentos: data_grid.selectedItem.Alimentos, Calorías: data_grid.selectedItem.Calorías });
            }
         }
         info.dataProvider=dp2;   
      }   
      
      public function sum(array:Array, ini:int=0, fin:int=-1):Number{
         fin = (fin==-1) ? array.length : fin;
         var suma:Number=0;
         for (var i:uint = ini; i<fin ; i++){
            if(typeof(array[i]) == "number"){
                  suma += array[i];
            }
         }
         return suma;
      }
         
      public function borrarHandler(e:Event){
      //aqui no se como restarle las calorias del alimento que acabo de quitar   
                //pero borrar lo borra      
         info.dataProvider.removeItem(info.selectedItem);
         
      }



Alguna idea? Me estoy liando mucho y no consigo que no me salgan repetidos ni que lleve bien la suma de la columna de las calorias que tengo en el datagrid.
Gracias de nuevo.

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 09 Jun 2011 03:34 pm
Nop, el DataProvider si mal no recuerdo tenía los métodos getItemAt (revisa la ayuda), entonces sería algo como>

if(ali== dp2.getItemAt(i).Alimentos)

La suma sigue el mismo camino, recorres el dataprovider pillando la columna Calorias (castealo como Number si ves que lo trata como String)

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 09 Jun 2011 03:57 pm
Gracias Jorge por responder tan rápido: si que existe el getItemAt

Código ActionScript :

for(var i:int=0;i<=dp2.length;i++){
   if(ali== dp2.getItemAt(i).Alimentos){
       info2.text="Ya tienes ese alimento";
   }else{
       dp2.addItem({Alimentos: data_grid.selectedItem.Alimentos, Calorías: data_grid.selectedItem.Calorías });
        }
} 

Pero me da el siguiente error al ejecutarlo y no muestra nada en el datagrid
RangeError: DataProvider index (0) is not in acceptable range (0 - -1)
at fl.data::DataProvider/fl.data:DataProvider::checkIndex()
at fl.data::DataProvider/getItemAt()
at Main/clickHandler()
at flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at fl.controls::SelectableList/fl.controls:SelectableList::handleCellRendererClick()
at fl.controls::DataGrid/fl.controls:DataGrid::handleCellRendererClick()

He probado poniendo primero distinto (!=) pero ocurre lo mismo.. no se que hacer..

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 09 Jun 2011 04:01 pm
Cambia esta línea>

for(var i:int=0;i<=dp2.length-1;i++){

El array es basado en cero, si te vas hasta el largo te pasas

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 09 Jun 2011 04:26 pm
Pero de este modo no entra en el bucle y no entiendo porque:

Código ActionScript :

for(var i:int=0;i<=dp2.length-1;i++){
            trace("entra0");
            if(ali== dp2.getItemAt(i).Alimentos){
               trace("entra1");
               info2.text="Ya tienes ese alimento";
            }else{
               trace("entra2");
               dp2.addItem({Alimentos: data_grid.selectedItem.Alimentos, Calorías: data_grid.selectedItem.Calorías });
            }
         }

Y si pongo un if fuera del bucle para el caso inicial en el que no haya ningun alimento en el datagrid, luego me entra pero se hace un lio y acaba permitiendo insertar todos.

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 09 Jun 2011 05:18 pm
La primera vez dp2 está vacío y nunca entrará (por lo tanto nunca lo agregará) Mira que si el largo es cero lo agregue directamente

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 10 Jun 2011 06:36 pm
Muchas gracias Jorge, creo que ya lo tengo :)... por lo menos este problema está solucionado. Vamos a por el siguiente. Un saludo.

Por madeline

28 de clabLevel



 

firefox

 

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