Documentos de Académico
Documentos de Profesional
Documentos de Cultura
• private function
getFormattedLabel(item:Object,
• column:DataGridColumn):String
• Podemos aplicar formatos
• Por ejemplo el formato de un número de tfno con parentesis en
el prefijo
– se puede hacer de varias maneras
• utilizando formateadores
– <mx:PhoneFormatter id=”formatter”/>
• creando una función personalizada para dar formato
• return formatter.format(phoneValue);
Ejemplo
• Alimentamos un DG pero aplicamos un
formateador para cambiar el formato de los
datos en algunas columnas utilizando la
propiedad labelFunction
Solución - DataGridFormatLabels
• <?xml version="1.0" encoding="utf-8"?>
• <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
• xmlns:s="library://ns.adobe.com/flex/spark"
• xmlns:mx="library://ns.adobe.com/flex/mx">
• <fx:Script>
• <![CDATA[
• import mx.controls.dataGridClasses.DataGridColumn;
• private function getPhoneLabel(
• item:Object, column:DataGridColumn):String
• {
• /*The regular expression consists of a hyphen
• (the value being replaced) and the /g global flag
• to replace ALL instances of the hyphen
• */
• var pattern:RegExp = /-/g;
• var phoneValue:String = item.phone.replace(pattern, "");
• return formatter.format(phoneValue);
• }
• ]]>
• </fx:Script>
• <fx:Declarations>
• <fx:Model id="contactData" source="data/contacts.xml"/>
• <s:ArrayList id="contactAC" source="{contactData.row}"/>
• <mx:PhoneFormatter id="formatter"/>
• </fx:Declarations>
• <mx:DataGrid id="contactGrid" dataProvider="{contactAC}"
• horizontalCenter="0" top="20">
• <mx:columns>
• <mx:DataGridColumn dataField="firstname" headerText="First Name"
• width="100"/>
• <mx:DataGridColumn dataField="lastname" headerText="Last Name"
• width="100"/>
• <mx:DataGridColumn dataField="email" headerText="Email Address"
• width="250"/>
• <mx:DataGridColumn dataField="phone" headerText="Phone Number"
• width="150" labelFunction="getPhoneLabel"/>
• </mx:columns>
• </mx:DataGrid>
• </s:Application>
Item Renderes y Editores
• Muchos controles soportan la personalización
con controles item renderer y editores
• En el control MX DataGrid, un item renderer o
un editor se usa en una columna específica
– propiedades itemRenderer y itemEditor se
implementan en el componente DataGridColumn
• Los item renderer y editor se pueden declarar en
DataGridColumn de tres maneras:
– Drop-in renderers
• son componentes visuales que podemos asignar a un control lista sin
cambios en la propiedad renderer del componente o en estilos
– Inline renderers.
• son componentes que definimos en la declaración MXML del control list
– Component renderers.
• son componentes visuales separados que definimos como componentes
MXML o clases AS y asignamos al control list usando la propiedad
itemRenderer
dataChange event
• Tenemos un componente DG que muestra información de contacto
del fichero contacts.xml
• En la primera columna el DG, el nombre y apellido del contacto se
muestra unido concatenando strings.
• Lo podemos hacer muy fácil con una función formateadora de label
• <mx:DataGridColumn dataField=”selected”
• itemEditor=”mx.controls.CheckBox”
• ... remainder of declaration ...
• />
itemEditor y propiedad editorDataField
• <mx:DataGridColumn dataField=”selected”
• itemEditor=”mx.controls.CheckBox”
• editorDataField=”selected”
• headerText=”” width=”50”/>
rendererIsEditor property
• Tb se puede hacer así
• <mx:DataGridColumn dataField=”selected”
• itemRenderer=”mx.controls.CheckBox”
• rendererIsEditor=”true”
• editorDataField=”selected”
• headerText=”” width=”50”/>
Ejemplo
• Suamos un itemRenderer en el primer
DataGrid que ponemos rendererIsEditor como
true
• El renderer es un componente drop-in basado
en mx.controls.CheckBox
• cuando la aplicación arranca, llamamos al
método initApp() que alimenta el DG con un
ArrayList
Solución - DataGridDropinEditor
• <?xml version="1.0" encoding="utf-8"?>
• <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
• xmlns:s="library://ns.adobe.com/flex/spark"
• xmlns:mx="library://ns.adobe.com/flex/mx"
• creationComplete="app_creationCompleteHandler(event)">
• <s:layout>
• <s:VerticalLayout horizontalAlign="center" paddingTop="20"/>
• </s:layout>
• <fx:Script>
• <![CDATA[
• import mx.events.FlexEvent;
• import mx.collections.ArrayList;
• [Bindable]
• protected var selectedData:ArrayList = new ArrayList();
• protected function app_creationCompleteHandler(event:FlexEvent):void
• {
• //Add a selected property to each data object on startup
• for (var i:int=0;i < collection.length; i++)
• {
• var contact:Object = collection.getItemAt(i);
• contact.selected=false;
• }
• }
• protected function button1_clickHandler(event:MouseEvent):void
• {
• selectedData = new ArrayList();
• for (var i:Number=0; i<collection.length; i++)
• {
• if (collection.getItemAt(i).selected)
• {
• selectedData.addItem(collection.getItemAt(i));
• }
• }
• }
• ]]>
• </fx:Script>
• <fx:Declarations>
• <fx:Model id="contactData" source="data/contacts.xml"/>
• <s:ArrayList id="collection" source="{contactData.row}"/>
• </fx:Declarations>
• <s:HGroup>
• <s:Panel title="Available Data">
• <mx:DataGrid id="contactGrid" dataProvider="{collection}"
• editable="true" selectable="false">
• <mx:columns>
• <mx:DataGridColumn dataField="selected" itemRenderer="mx.controls.CheckBox"
• rendererIsEditor="true" editorDataField="selected"
• width="20" headerText=""/>
• <mx:DataGridColumn dataField="firstname" headerText="First Name"
• width="100" editable="false"/>
• <mx:DataGridColumn dataField="lastname" headerText="Last Name"
• width="100" editable="false"/>
• </mx:columns>
• </mx:DataGrid>
• </s:Panel>
• <s:Panel title="Selected Data">
• <mx:DataGrid id="selectedGrid" dataProvider="{selectedData}">
• <mx:columns>
• <mx:DataGridColumn dataField="firstname" headerText="First Name"/>
• <mx:DataGridColumn dataField="lastname" headerText="Last Name"/>
• </mx:columns>
• </mx:DataGrid>
• </s:Panel>
• </s:HGroup>
• <s:Button label="Show Selected" click="button1_clickHandler(event)"/>
• </s:Application>
HorizontalList and TileList controls
• Comparten muchas características con DG
– evento change notifica que el usuario ha
seleccionado un dato
– propiedad selectedItem devuelve una referencia al
elemento seleccionado
– propiedad allowMultipleSelection permite
seleccionar varios elementos con Ctrl
– si existe el scroll, los datos son reutilizados y
rellenan nuevos datos
• La diferencia entre estos controles es el layout
– HorizontalList muestra sus celdas en una única fila
– TileList las muestra como una rejilla
Ejemplo
• Aplicación que usa el control TileList y un
renderer para mostrar el contenido de un
fichero XML que se refiere a ficheros de imagen
almacenados en una carpeta del proyecto
• El componente renderer usa la propiedad slide
de cada elemento XML para presentar una
imagen
• Todo lo envolvemos en un contenedor VBox
Solución - MXTileList
• <?xml version="1.0" encoding="utf-8"?>
• <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
• xmlns:s="library://ns.adobe.com/flex/spark"
• xmlns:mx="library://ns.adobe.com/flex/mx">
• <s:layout>
• <s:VerticalLayout horizontalAlign="center" paddingTop="20"/>
• </s:layout>
• <fx:Declarations>
• <fx:Model id="slideModel" source="data/slideshow.xml"/>
• <s:ArrayCollection id="slideAC" source="{slideModel.slide}"/>
• </fx:Declarations>
• <s:Panel title="My Photos" height="430" width="525">
• <s:layout>
• <s:VerticalLayout
• paddingLeft="10" paddingRight="10"
• paddingTop="10" paddingBottom="10"/>
• </s:layout>
• <mx:TileList
• id="slideList" dataProvider="{slideAC}"
• width="100%" height="100%"
• rowHeight="125" columnWidth="120">
• <mx:itemRenderer>
• <fx:Component>
• <mx:VBox horizontalScrollPolicy="off" verticalScrollPolicy="off"
• verticalAlign="middle" horizontalAlign="center">
• <mx:Image source="assets/thumbs/{data.source}"/>
• <mx:Label text="{data.caption}"/>
• </mx:VBox>
• </fx:Component>
• </mx:itemRenderer>
• </mx:TileList>
• </s:Panel>
• <s:Panel title="Selected Photo" width="372" height="320">
• <s:layout>
• <s:VerticalLayout
• paddingLeft="10" paddingRight="10"
• paddingTop="10" paddingBottom="10"
• horizontalAlign="center"/>
• </s:layout>
• <mx:Image source="assets/{slideList.selectedItem.source}"/>
• <s:Label text="{slideList.selectedItem.caption}"
• fontSize="14" fontWeight="bold"/>
• </s:Panel>
• </s:Application>
Ejemplo
• El control HorizontalList utiliza la misma
arquitectura, permitiendo usar un scroll
• el evento change guarda el selectedItem
actual en un Objeto bindable
• Cuando el elemento es selected, el
contenedor Vbox en la parte inferior de la
aplicación hace visible la imagen
Solución - HorizontalListDemo
• <?xml version="1.0" encoding="utf-8"?>
• <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
• xmlns:s="library://ns.adobe.com/flex/spark"
• xmlns:mx="library://ns.adobe.com/flex/mx">
• <fx:Script>
• <![CDATA[
• import mx.events.ListEvent;
•
• protected function slideList_changeHandler(event:ListEvent):void
• {
• currentImage=event.target.selectedItem;
• detailPanel.visible=true;
• }
• ]]>
• </fx:Script>
• <s:layout>
• <s:VerticalLayout horizontalAlign="center" paddingTop="20"/>
• </s:layout>
• <fx:Declarations>
• <fx:Model id="slideModel" source="data/slideshow.xml"/>
• <s:ArrayCollection id="slideAC" source="{slideModel.slide}"/>
• <fx:Object id="currentImage"/>
• </fx:Declarations>
• <s:Panel title="My Photos" width="80%">
• <s:layout>
• <s:VerticalLayout
• paddingLeft="10" paddingRight="10"
• paddingTop="10" paddingBottom="10"/>
• </s:layout>
• <mx:HorizontalList
• id="slideList" dataProvider="{slideAC}"
• width="100%" height="125" rowHeight="125" columnWidth="120"
• change="slideList_changeHandler(event)">
• <mx:itemRenderer>
• <fx:Component>
• <mx:VBox horizontalScrollPolicy="off" verticalScrollPolicy="off"
• verticalAlign="middle" horizontalAlign="center">
• <mx:Image source="assets/thumbs/{data.source}"/>
• <mx:Label text="{data.caption}"/>
• </mx:VBox>
• </fx:Component>
• </mx:itemRenderer>
• </mx:HorizontalList>
• </s:Panel>
• <mx:Spacer height="50"/>
• <s:Panel id="detailPanel" title="Selected Photo"
• width="372" height="320" visible="false">
• <s:layout>
• <s:VerticalLayout
• paddingLeft="10" paddingRight="10"
• paddingTop="10" paddingBottom="10"
• horizontalAlign="center"/>
• </s:layout>
• <mx:Image source="assets/{currentImage.source}"/>
• <s:Label text="{currentImage.caption}"
• fontSize="14" fontWeight="bold"/>
• </s:Panel>
• </s:Application>
Ejemplo
• la versión Spark del control List soporta la
propiedad layout que puede ser establecida
como una instancia de HorizontalLayout o
TileLayout.
• Usamos itemRenderer como la clase base de
sus item renderes personalizados
Solución - SparkTileList
• <?xml version="1.0" encoding="utf-8"?>
• <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
• xmlns:s="library://ns.adobe.com/flex/spark"
• xmlns:mx="library://ns.adobe.com/flex/mx">
• <s:layout>
• <s:VerticalLayout horizontalAlign="center" paddingTop="20"/>
• </s:layout>
• <fx:Declarations>
• <fx:Model id="slideModel" source="data/slideshow.xml"/>
• <s:ArrayCollection id="slideAC" source="{slideModel.slide}"/>
• </fx:Declarations>
• <s:Panel title="My Photos" height="430" width="550">
• <s:layout>
• <s:VerticalLayout
• paddingLeft="10" paddingRight="10"
• paddingTop="10" paddingBottom="10"/>
• </s:layout>
• <s:List
• id="slideList" dataProvider="{slideAC}"
• width="100%" height="100%" >
• <s:layout>
• <s:TileLayout rowHeight="125" columnWidth="120"/>
• </s:layout>
• <s:itemRenderer>
• <fx:Component>
• <s:ItemRenderer>
• <s:layout>
• <s:VerticalLayout horizontalAlign="center"/>
• </s:layout>
• <mx:Image source="assets/thumbs/{data.source}"/>
• <s:Label text="{data.caption}"/>
• </s:ItemRenderer>
• </fx:Component>
• </s:itemRenderer>
• </s:List>
• </s:Panel>
• <s:Panel title="Selected Photo" width="372" height="320">
• <s:layout>
• <s:VerticalLayout
• paddingLeft="10" paddingRight="10"
• paddingTop="10" paddingBottom="10"
• horizontalAlign="center"/>
• </s:layout>
• <mx:Image source="assets/{slideList.selectedItem.source}"/>
• <s:Label text="{slideList.selectedItem.caption}"
• fontSize="14" fontWeight="bold"/>
• </s:Panel>
• </s:Application>
AdvancedDataGrid Control
• El ADG es una versión extendida del control DG que
añade características como: