Flex DataGrid Usage Example
16 June 2010
The main problem was to make strings in the Flex DataGrid re-sizable according to content size without appearance of a scrolling…
This example can be easily rewritten for any Flex component containing strings such as List for instance
The main MXML
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"> <mx:Script> <![CDATA[ import mx.controls.TextInput; import mx.events.ItemClickEvent; import mx.events.DataGridEvent; import mx.collections.ArrayCollection; private var delay:uint = 100; private var repeat:uint = 1; private var myTimer:Timer = new Timer(delay, repeat); [Bindable] private var initDG:ArrayCollection = new ArrayCollection([ {Artist:'Pavement', Album:'Slanted and Enchanted', Price:11.99, Cover: 'http://groups.google.com/group/flex_india/icon?v=2&hl=ru'}, {Artist:'The section Default item rendering and cell editing shows a DataGrid control that displays information about albums by using three text fields. You could add a visual element to your DataGrid control to make it more compelling. To do that, you modify the data provider so that it contains a URL for a JPEG image of the album cover. :', Album:'Slanted and Enchanted', Price:11.99, Cover: 'http://groups.google.com/group/flex_india/icon?v=2&hl=ru'}, {Artist:'t item rendering and cell editing shows a DataGrid control that displays information about albu', Album:'Slanted and Enchanted', Price:11.99, Cover: 'http://groups.google.com/group/flex_india/icon?v=2&hl=ru'}, {Artist:'The section Default item rendering and cell editing shows a DataGrid control that displays information about albums by using three text fields. You could Default item rendering and cell editing shows a DataGrid control that displays information about albums by using three text fields. You could add a visual element to your DataGrid control to make it more compelling. To do that, you modify the data provider so that it contains a URL for a JPEG image of the album cover.The section Default item rendering and cell editing shows a DataGrid control that displays information about albums by using three text fields. You could add a visual element to your DataGrid control to make it more compelling. To do that, you modify the data provider so that it contains a URL for a JPEG image of the album cover.', Album:'Slanted and Enchanted', Price:11.99, Cover: 'http://groups.google.com/group/flex_india/icon?v=2&hl=ru'}, {Artist:'on Default item rendering and cell editing shows a DataGrid control that displays information about alb', Album:'Slanted and Enchanted', Price:11.99, Cover: 'http://groups.google.com/group/flex_india/icon?v=2&hl=ru'}, {Artist:'on Default item rendering and cell editing shows a DataGrid control that displays information about alb', Album:'Slanted and Enchanted', Price:11.99, Cover: 'http://groups.google.com/group/flex_india/icon?v=2&hl=ru'}, {Artist:'Pavement', Album:'Brighten the Corners', Price:11.99, Cover: 'http://groups.google.com/group/flex_india/icon?v=2&hl=ru'} ]); private function dataGridHeaderShift(e:DataGridEvent):void{ if(myTimer!=null)myTimer.stop(); myTimer.addEventListener(TimerEvent.TIMER_COMPLETE, function (e:TimerEvent):void{ myTimer.stop(); initDG.refresh(); }); myTimer.start(); } ]]> </mx:Script> <mx:DataGrid columnStretch="dataGridHeaderShift(event);" liveScrolling="true" horizontalScrollPolicy="on" wordWrap="true" id="myGrid" dataProvider="{initDG}" variableRowHeight="true" height="700"> <mx:columns> <mx:DataGridColumn dataField="Artist" itemRenderer="DynamicTextArea" /> <mx:DataGridColumn dataField="Album" itemRenderer=" mx.controls.TextInput" /> <mx:DataGridColumn dataField="Cover" itemRenderer="TestRenderer"/> <mx:DataGridColumn dataField="Price"/> </mx:columns> </mx:DataGrid> </mx:Application>
itemRenderer DynamicTextArea
package { import mx.controls.TextArea; import flash.events.Event; import mx.containers.Canvas; import mx.controls.TextArea; import mx.styles.*; public class DynamicTextArea extends TextArea{ public function DynamicTextArea(){ super(); super.horizontalScrollPolicy = "off"; super.verticalScrollPolicy = "off"; super.height = 15; this.addEventListener(Event.CHANGE, adjustHeightHandler); } private function adjustHeightHandler(event:Event = null):void{ if(height <= textField.textHeight + (textField.getLineMetrics(0).height)/2){ height = textField.measuredHeight+3; super.height = textField.measuredHeight+3; super.validateNow(); }else{ height = textField.measuredHeight+3; super.height = textField.measuredHeight+3; super.validateNow(); } } override public function set text(val:String):void{ textField.text = val; adjustHeightHandler(null); super.validateNow(); } override public function set htmlText(val:String):void{ textField.htmlText = val; adjustHeightHandler(null); super.validateNow(); } override public function set height(value:Number):void{ if(textField == null){ if(height <= value){ super.height = value; } }else{ var currentHeight:uint = textField.measuredHeight+3 + textField.getLineMetrics(0).height; if (currentHeight<= super.maxHeight){ if(textField.measuredHeight+3 != textField.getLineMetrics(0).height){ super.height = currentHeight; } }else{ super.height = super.maxHeight; } } } override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void{ super.height = (textField.measuredHeight+3) height = (textField.measuredHeight+3) super.updateDisplayList(unscaledWidth, unscaledHeight); } override public function get text():String{return textField.text;} override public function get htmlText():String{return textField.htmlText; } override public function set maxHeight(value:Number):void{ super.maxHeight = value; } override public function get maxWidth():Number{ return textField.maxWidth;} override public function set maxWidth(value:Number):void{super.maxWidth = value;} override public function set maxChars(value:int):void{ super.maxChars = value;} override public function get maxChars():int{ return textField.maxChars;} public function setMyStyle(styleProp:String, newValue:Object):void{super.setStyle(styleProp, newValue);} } }
itemRenderer containing image
</pre> </span> <mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" horizontalAlign="center" > <mx:Image id="albumImage" source="{data.Cover}"/> </mx:HBox> <span> <pre>
Leave a Comment