Cristalab

Cómo colorear una fila de un DataGrid en Flex

Por: Zandy + 12.10.2007

En este tip explicaré cómo colorear una fila dentro de un componente dataGrid en Flex.

Primero que todo hago una clase llamada myDataGrid que extiende de mx.controls.Datagrid y la situo en la misma carpeta del proyecto Flex, (la puedes poner donde quieras y después especificar en el package de la clase la ruta.)

MyDataGrid.as

Código :

package { 

  import mx.controls.DataGrid;
  public class myDataGrid extends DataGrid {

  }
}


Dentro de ella sobre-escribimos el método drawRowBackground que no es mas que el método en el datagrid que se encarga de pintar el fondo de la celda..

Código :

package { 
    import mx.collections.ArrayCollection;
    import mx.controls.DataGrid;
    import flash.display.Sprite;

  public class myDataGrid extends DataGrid {
       override protected function drawRowBackground(s:Sprite,rowIndex:int,y:Number,height:Number,color:uint,dataIndex:int):void 
        { 
         var dp:ArrayCollection = dataProvider as ArrayCollection;
         var item:Object;
                         
         if( dataIndex < dp.length ) item = dp.getItemAt(dataIndex);
         if( item != null && item.price < 20 ) color = 0xFF8800;
         else color = 0xFFFFFF;
         
         super.drawRowBackground(s,rowIndex,y,height,color,dataIndex); 
         }
  }
}


Desmenuzando un poco este código..

var dp:ArrayCollection = dataProvider as ArrayCollection; --> Creamos un arrayCollection dp que le pasaremos el contenido del dataProvider del Grid en cuestión [el mismo.]

var item:Object; --> Una variable objet para almacenar temporalmente el contenido de la fila

if( dataIndex < dp.length ) item = dp.getItemAt(dataIndex); --> Aqui le añado el contenido de la fila actual a item SI el dataIndex [indice de la fila actual] es menor que el largo del arrayCollection dp que es la copia del dataProvider. (el # de filas de un datagrid no es = al numero de elementos del dataProvider!)

if( item != null && item.price < 20 ) color = 0xFF8800; --> aquí digo que si ítem que es el que contiene los valores de la fila actual no es null y ademas el campo price <20 la variable color sera un naranja claro..

else color = 0xFFFFFF; --> Si no la variable color sera blanca...

super.drawRowBackground(s,rowIndex,y,height,color,dataIndex); --> aquí invocamos al metodo drawRowBackground de la superclase... (dataGrid)... dentro de los parámetros que se le pasa..

Bien ahora abrimos nuestro proyecto Flex. y creamos el siguiente script que nos llena un arrayCollection provisional ..

Código :

<mx:Script>
   <![CDATA[
      import mx.collections.ArrayCollection;
      [Bindable] public var f:ArrayCollection = new ArrayCollection();
     
      function a()
      {
         var h:Object = new Object();
         for(var i:int=0;i<10;i++)
         {
            h = {};
            h["products"] = "Judias_"+i.toString();
            h["price"] = 10*i;
            f.addItem(h);
         }
      }
   ]]>
</mx:Script>


Ahora insertamos nuestro GRID (myDataGrid)...

Código :

<local:myDataGrid dataProvider="{ f }" >
   <local:columns>
      <mx:DataGridColumn headerText="Column 1" dataField="products"/>
      <mx:DataGridColumn headerText="Column 2" dataField="price"/>
   </local:columns>
</local:myDataGrid>


Ejecutamos y listo. Este es el resultado:

Etiquetas flex

Comentarios | Enviar un comentario
men estoy buscando para columna no tendras una forma?
Por: chap_blog
Joris Van Spilbergen, como te dije en el post, muy buen tip.

chap_blog, itemRenderer no te sirve?
Por:
El invitado soy yo Lengua
Por: Dano
chap para la columna usa la propiedad backgroundColor en el elemento columna de un datagrid...

gracias a todos.. Sonrisa
Por: Joris Van Spilbergen_blog
Hice este ejemplo y me da el siguiente error
Could not resolve

E el archivo .mxml del application definie de la siguiente manera xmlns:component="ar.com.view.componentes.*"
y al archivos .as EstadoComercioDataGrid

esta es
<component:EstadoComercioDataGrid dataProvider="{ estados }" >
<component:columns>
<mx:DataGridColumn headerText="Estado" dataField="descripcion"/>
<mx:DataGridColumn headerText="Fecha de modificación" dataField="fechaInicio"/>
</component:columns>
</component:EstadoComercioDataGrid>


El error que tira el server es el siquiente:

<component:EstadoComercioDataGrid> to a component implementation


Cuales el problema ??
Por: Carolina_blog
Hola, al principio probe el Script y no me funciono lanzando algunos errores, probando lo resolvi pondre el codigo para que vean los cambios que hise:

Modifique esta funcion un poco.

Código :


public function a():void{      
            var h:Object = new Object;
            
            for(var i:int = 0;i < 10; i  ){
               h = {};
               h["products"] = "Judias_" i.toString();
               h["price"] = 10 * i;
               f.addItem(h);
            }
         }


Ahora antes de que el Datagrid llame a "f" tenemos que llamar a la funcion "a" para que llene los campos de "f"
para eso cree un simple boton.

Código :


<mx:Button id="boton" click="{ a() }"/>


Saludos, adiós
Por: Boa_blog
No me funciona si alguien puede pegar el codigo completo plis...

Trabajo con Flex Builder 3.0
Por: micky82
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.