Componente DataGrid

Flash y PHPEl componente DataGrid nos permite listar información dentro de un control formado por renglones y columnas. Tiene la propiedad de añadir un scrollbar horizontal o vertical en caso de que la información no se muestre completamente dentro de las dimensiones establecidas del DataGrid. Este componente es ideal para mostrar objetos que tienen varias propiedades, por ejemplo un arreglo que contiene la información obtenida de un query o consulta a una base de datos.

Este control tiene las siguientes propiedades:

Si deseas conocer todos los métodos y propiedades que conforman la clase DataGrid, ingresa a la siguiente página y de lado inferior izquierdo, dentro de la lista "All Classes" busca la clase DataGrid. Esta clase pertenece al paquete mx.controls, por lo que también podrías llegar a la información de la clase DataGrid haciendo click en la parte superior izquierda (Packages) en donde dice mx.controls.

Tutorial

Abre el programa Flex Builder 3 y crea un nuevo proyecto (Flex Project) con el nombre DataGridControl. No olvides seleccionar la opción "Web application" como tipo de aplicación (Application type).
En el panel Components, dentro de la sección Controls, busca el control DataGrid y arrástralo al área de trabajo. Selecciona el DataGrid que tienes en el área de trabajo y dentro del panel Properties asígnale el ID de productos_dg.

Haz click en el botón Source para cambiarte de la vista de diseño a la vista de código. Observarás que el programa creó automáticamente el código del DataGrid; este código es similar a:

Actionscript:
  1. <mx:DataGrid x="204" y="135" id="productos_dg">
  2.     <mx:columns>
  3.         <mx:DataGridColumn headerText="Column 1" dataField="col1"/>
  4.         <mx:DataGridColumn headerText="Column 2" dataField="col2"/>
  5.         <mx:DataGridColumn headerText="Column 3" dataField="col3"/>
  6.     </mx:columns>
  7. </mx:DataGrid>

Como podrás darte cuenta, este DataGrid recién creado está formado por tres columnas (cada DataGridColumn que se encuentra dentro de los tags mx:columns). El encabezado por default de estas columnas es Column 1, Column 2 y Column 3. Agrega una nueva columna y cambiales el nombre por Producto, Precio Unitario, Cantidad y Total. El código quedará de la siguiente forma:

Actionscript:
  1. <mx:DataGrid x="278.5" y="46" id="productos_dg" width="638" height="281">
  2.     <mx:columns>
  3.         <mx:DataGridColumn headerText="Título DVD" dataField="titulo"/>
  4.         <mx:DataGridColumn headerText="Protagonistas" dataField="protagonistas"/>
  5.         <mx:DataGridColumn headerText="Precio" dataField="precio"/>
  6. <mx:DataGridColumn headerText="Año" dataField="fecha"/>
  7.     </mx:columns>
  8. </mx:DataGrid>

En el código anterior podrás ver que también le cambié el valor de la propiedad dataField a cada columna.
La propiedad dataField es el nombre del campo o propiedad a la que hace referencia en el arreglo o colección que contiene la información que llenará el DataGrid. A este arreglo o colección de datos se le conoce como Data Provider (proveedor de datos o de información).

Existen varias formas de llenar de información el dataProvider. La forma más sencilla y menos dinámica es usando el siguiente código:

Actionscript:
  1. <mx:dataProvider>
  2.     <mx:Object titulo="Dexter - The complete second season"         protagonistas="Michael C. Hall" precio="24.99" fecha="2006"/>
  3.     <mx:Object titulo="The Office - Season Four"                protagonistas="Steve Carell"   precio="30.99" fecha="2005" />
  4.     <mx:Object titulo="Gilmore Girls - The complete seventh season" protagonistas="Lauren Graham, Alexis Bledel" precio="22.99" fecha="2006" />
  5.     <mx:Object titulo="21 Jump Street - The complete first season"  protagonistas="Peter DeLuise, Johnny Depp" precio="21.99" fecha="1987" />
  6.     <mx:Object titulo="Friends - The complete ninth season"         protagonistas="Jennifer Aniston, Courteney Cox, Lisa Kudrow, Matt LeBlanc, Matthew Perry, David Schwimmer" precio="24.99" fecha="2002" />
  7. </mx:dataProvider>

El código anterior deberás colocarlo dentro de los tags <mx:DataGrid>  y </mx:DataGrid>, ya sea antes del código de las columnas o bien después.

Si corres la aplicación verás la información en el DataGrid similar a la siguiente imagen:

De la imagen anterior, podemos ver que automáticamente el ancho de las columnas del DataGrid es el mismo para las cuatro columnas. Para las columnas de Precio y Año es mucho desperdicio de espacio ya que la información de estas columnas es poca. Cambia el código por lo siguiente para ajustar las columnas:

Actionscript:
  1. <mx:columns>       
  2.     <mx:DataGridColumn headerText="Título DVD" dataField="titulo" width="250"/>
  3.     <mx:DataGridColumn headerText="Protagonistas" dataField="protagonistas"/>
  4.     <mx:DataGridColumn headerText="Precio" dataField="precio" width="50"/>
  5. <mx:DataGridColumn headerText="Año" dataField="fecha" width="50"/>  
  6. </mx:columns>

Después de realizar los cambios anteriores, la aplicación se verá igual a la siguiente imagen:

Los títulos de los DVDs y los protagonistas se pueden leer mejor, sin embargo la información no se muestra completa. Si le das click en el borde derecho de cada columna (dentro del área del encabezado) podrás ajustar el ancho de las columnas.

Si haces click sobre el título de la columna Título DVD verás que la información es ordenada alfabéticamente de forma ascendente de acuerdo a los títulos DVD. Si vuelves a hacer click sobre el título de la misma columna la información se mostrará en orden alfabético descendente. Si queremos evitar que una columna se pueda ordenar (en ocasiones esto es necesario cuando usamos ítem renderers en la columna), agrégale la propiedad sortable con el valor de false:

Actionscript:
  1. <mx:DataGridColumn headerText="Título DVD" dataField="titulo" width="250" sortable="false"/>

Ahora haz click sobre la columna Precio y, sin soltarlo, arrastra la columna y ponla en medio de la columna Título DVD y Protagonistas. Las columnas, por default, tienen la opción draggable activada, para desactivarlo agrega esta propiedad con el valor de false:

Actionscript:
  1. <mx:DataGridColumn headerText="Precio" dataField="precio" width="50" draggable="false"/>

 

Otra forma de pasarle la información al DataGrid es creando un arreglo y llenándolo con la información que contendrá el DataGrid. Arrastra otro control DataGrid al área de trabajo y ponle de ID productos2_dg. A este nuevo DataGrid ponle la misma cantidad de columnas y propiedades. El código de este DataGrid quedaría:

Actionscript:
  1. <mx:DataGrid x="279.5" y="401" id="productos2_dg" width="638" height="281" creationComplete="llenaDataGrid()">
  2.              
  3.     <mx:columns>       
  4.         <mx:DataGridColumn headerText="Título DVD" dataField="titulo" width="250"/>
  5.         <mx:DataGridColumn headerText="Protagonistas" dataField="protagonistas"/>
  6.         <mx:DataGridColumn headerText="Precio" dataField="precio" width="50"/>
  7.         <mx:DataGridColumn headerText="Año" dataField="fecha" width="50"/>   
  8.     </mx:columns>
  9.         
  10. </mx:DataGrid>

Para crear y llenar el arreglo, añade el siguiente código a tu aplicación:

Actionscript:
  1. <mx:Script>
  2.     <![CDATA[
  3.         private var data_provider:Array = new Array();
  4.        
  5.         private function llenaDataGrid() {
  6.         data_provider.push({titulo:"Dexter - The complete second season", protagonistas:"Michael C. Hall", precio:"$24.99", fecha:"2006", imagen:"Dexter.jpg"});
  7.         data_provider.push({titulo:"The Office - Season Four", protagonistas:"Steve Carell", precio:"$30.99", fecha:"2005", imagen:"The_Office.jpg"});
  8.         data_provider.push({titulo:"Gilmore Girls - The complete seventh season", protagonistas:"Lauren Graham, Alexis Bledel", precio:"$22.99", fecha:"2006", imagen:"Gilmore_Girls.jpg"});
  9.         data_provider.push({titulo:"21 Jump Street - The complete first season", protagonistas:"Peter DeLuise, Johnny Depp", precio:"$21.99", fecha:"1987", imagen:"21_Jump_Street.jpg"});
  10.         data_provider.push({titulo:"Friends - The complete ninth season", protagonistas:"Jennifer Aniston, Courteney Cox, Lisa Kudrow, Matt LeBlanc, Matthew Perry, David Schwimmer", precio:"$24.99", fecha:"2002", imagen:"Friends.jpg"});
  11.                
  12.         productos2_dg.dataProvider = data_provider;        
  13.         }
  14.     ]]>
  15. </mx:Script>

A pesar de que en este ejemplo estamos poniendo la información directamente en el código y no lo estamos obteniendo dinámicamente, te puedes dar cuenta que de esta segunda forma podemos obtener la información dinámicamente metiendo el código de push dentro de un ciclo for que recorra los registros regresados por un query.

Nota Este post es para explicar a grandes rasgos la finalidad y funcionalidad de un DataGrid. Este post nos servirá como entrada a una serie de tutoriales que pondré en unos días sobre cómo crear, almacenar y eliminar registro de una base SQLite con AIR. Dentro de estos tutoriales usaremos DataGrids para mostrar la información obtenida de la base de datos.

 

Evento ListEvent.CHANGE

Este evento es uno de los más importantes cuando se está trabajando con DataGrids. Este evento es disparado cuando un usuario selecciona alguno de los registros del DataGrid. Para ejemplificar su uso, mostraremos la imagen del DVD que el usuario seleccionó (sí, para eso le agregamos al arreglo data_provider el nombre de la imagen de cada DVD).
Después de la línea productos2_dg.dataProvider = data_provider; agrega las siguientes líneas:

Actionscript:
  1. productos2_dg.addEventListener(ListEvent.CHANGE, muestraImagen);

En la línea anterior de código le estamos diciendo al programa que cada vez que el evento CHANGE se ejecute, llame a la función muestraImagen.
Al finalizar la función llenaDataGrid, crea la función muestraImagen con el siguiente código:

Actionscript:
  1. private function muestraImagen(event:ListEvent) {
  2.     imagen_dvd.source = "dvds/" + event.target.selectedItem.imagen;
  3. }

En este código estamos recibiendo como parámetro un evento de tipo ListEvent. Este parámetro nos permite saber sobre qué registro del DataGrid el usuario hizo click (event.target.selectedItem). Además, estamos obteniendo la propiedad imagen (que nosotros establecimos en el dataProvider) de ese registro (event.target.selectedItem.imagen). Recuerda, que además de la propiedad imagen puedes obtener la propiedad event.target.selectedItem.titulo, event.target.selectedItem.precio, event.target.selectedItem.fecha, etc. Genial ¿no? De esta forma podríamos pasarle a cada registro su ID en la base de datos para cuando queramos modificarlo o eliminarlo.
Ya que tenemos la propiedad imagen, se lo pasamos a la propiedad source de image_dvd. Pero… ¿qué es imagen_dvd? imagen_dvd es un componente de tipo Image el cual nos permite cargar y mostrar imágenes en él. Este componente, al igual que el DataGrid,  se encuentra de la sección Control.

A continuación te muestro el código de este control. Antes de cerrar el tag Application (</mx:Application) inserta el siguiente código:

Actionscript:
  1. <mx:Image y="497" width="240" height="240" horizontalCenter="0" id="imagen_dvd" themeColor="#000000"/>

Por último nos queda llamar a la función llenaDataGrid, esta función la llamaremos cuando el segundo DataGrid se haya creado. Para eso usaremos la propiedad creationComplete:

Actionscript:
  1. <mx:DataGrid y="268" id="productos2_dg" width="638" height="188" creationComplete="llenaDataGrid()" horizontalCenter="0">

¡Listo! Con las líneas que acabamos de crear estamos insertando un control Image para desplegar los JPGs de cada DVD.

¿Te perdiste? No te preocupes, aquí va el código completo de la aplicación.

Actionscript:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
  3.     <mx:DataGrid y="50" id="productos_dg" width="638" height="188" horizontalCenter="0">
  4.                
  5.         <mx:columns>       
  6.             <mx:DataGridColumn headerText="Título DVD" dataField="titulo" width="250" sortable="false"/>
  7.             <mx:DataGridColumn headerText="Protagonistas" dataField="protagonistas"/>
  8.             <mx:DataGridColumn headerText="Precio" dataField="precio" width="50" draggable="false"/>
  9.             <mx:DataGridColumn headerText="Año" dataField="fecha" width="50"/>   
  10.         </mx:columns>
  11.        
  12. <mx:dataProvider>
  13.             <mx:Object titulo="Dexter - The complete second season" protagonistas="Michael C. Hall" precio="$24.99" fecha="2006" imagen="Dexter.jpg"/>
  14.             <mx:Object titulo="The Office - Season Four" protagonistas="Steve Carell"   precio="$30.99" fecha="2005" imagen="The_Office.jpg" />
  15.             <mx:Object titulo="Gilmore Girls - The complete seventh season" protagonistas="Lauren Graham, Alexis Bledel" precio="$22.99" fecha="2006" imagen="Gilmore_Girls.jpg"/>
  16.             <mx:Object titulo="21 Jump Street - The complete first season" protagonistas="Peter DeLuise, Johnny Depp" precio="$21.99" fecha="1987" imagen="21_Jump_Street.jpg" />
  17.             <mx:Object titulo="Friends - The complete ninth season" protagonistas="Jennifer Aniston, Courteney Cox, Lisa Kudrow, Matt LeBlanc, Matthew Perry, David Schwimmer" precio="$24.99" fecha="2002" imagen="Friends.jpg" />
  18.         </mx:dataProvider>
  19.         
  20.     </mx:DataGrid> 
  21.     <mx:Script>
  22.         <![CDATA[
  23.             import mx.events.ListEvent;
  24.             private var data_provider:Array = new Array();
  25.            
  26.             private function llenaDataGrid() {
  27.                 data_provider.push({titulo:"Dexter - The complete second season", protagonistas:"Michael C. Hall", precio:"$24.99", fecha:"2006", imagen:"Dexter.jpg"});
  28.                 data_provider.push({titulo:"The Office - Season Four", protagonistas:"Steve Carell", precio:"$30.99", fecha:"2005", imagen:"The_Office.jpg"});
  29.                 data_provider.push({titulo:"Gilmore Girls - The complete seventh season", protagonistas:"Lauren Graham, Alexis Bledel", precio:"$22.99", fecha:"2006", imagen:"Gilmore_Girls.jpg"});
  30.                 data_provider.push({titulo:"21 Jump Street - The complete first season", protagonistas:"Peter DeLuise, Johnny Depp", precio:"$21.99", fecha:"1987", imagen:"21_Jump_Street.jpg"});
  31.                 data_provider.push({titulo:"Friends - The complete ninth season", protagonistas:"Jennifer Aniston, Courteney Cox, Lisa Kudrow, Matt LeBlanc, Matthew Perry, David Schwimmer", precio:"$24.99", fecha:"2002", imagen:"Friends.jpg"});
  32.                
  33.                 productos2_dg.dataProvider = data_provider;
  34.                 productos2_dg.addEventListener(ListEvent.CHANGE, muestraImagen);                               
  35.             }
  36.            
  37.             private function muestraImagen(event:ListEvent) {
  38.                 imagen_dvd.source = "dvds/" + event.target.selectedItem.imagen;
  39.             }
  40.         ]]>
  41.     </mx:Script>
  42.     <mx:DataGrid y="268" id="productos2_dg" width="638" height="188" creationComplete="llenaDataGrid()" horizontalCenter="0">
  43.              
  44.         <mx:columns>       
  45.             <mx:DataGridColumn headerText="Título DVD" dataField="titulo" width="250"/>
  46.             <mx:DataGridColumn headerText="Protagonistas" dataField="protagonistas"/>
  47.             <mx:DataGridColumn headerText="Precio" dataField="precio" width="50"/>
  48.             <mx:DataGridColumn headerText="Año" dataField="fecha" width="50"/>   
  49.         </mx:columns>
  50.         
  51. </mx:DataGrid>
  52.     <mx:Image y="497" width="240" height="240" horizontalCenter="0" id="imagen_dvd" themeColor="#000000"/> 
  53. </mx:Application>


Ver Ejemplo
Enlaces recomendados:

» Adobe® Flex® 3 Language Reference

Entradas relacionadas:

» Web Services en Flex
» Cargar SWF en Flex

Tags: , ,

Si te gustó esta entrada anímate a escribir un comentario o suscribirte al feed y obtener los artículos futuros en tu lector de feeds.

Comentarios

[...] leíste el tutorial sobre Componente DataGrid y las cuatro entregas del tutorial Sistema de Clientes en AIR sabrás que podemos recorrer cada uno [...]

[...] donde llenamos el arreglo y se lo asignamos al DataGrid te recomiendo visitar la entrada sobre el Componente DataGrid que publiqué [...]

Escribe un comentario

Nota: Es posible que tu comentario requiera autorización, si es así tu comentario será publicado a la brevedad. Gracias.

(requerido)

(requerido)