Flex - Problem with auto resizing datagrid

Posted by Marty Pitt on Stack Overflow See other posts from Stack Overflow or by Marty Pitt
Published on 2009-03-04T10:15:30Z Indexed on 2010/03/20 6:21 UTC
Read the original article Hit count: 390

Filed under:

Hi All

I'm trying to create a datagrid which will resize vertically to ensure all the renderers are displayed in full. Additionally,

  • Renderers are of variable height
  • Renderers can resize themselves

Generally speaking, the flow of events is as follows :

  • One of the item renderers resizes itself (normally in response to a user click etc)
  • It dispatches a bubbling event which the parent datagrid picks up
  • The DataGrid attempts to resize to ensure that all renderers remain visible in full.

I'm currently using this code within the datagrid to calculate the height:

height = measureHeightOfItems(0, dataProvider.length ) + headerHeight;

This appears to get an incorrect height. I've tried a number of variations including callLater ( to ensure the resize has completed so measure can work correctly), and overriding meausre() and calling invalidateSize() / validateSize(), but neither works.

Below are 3 classes which will illustrate the problem. Clicking the button in the item renderers resizes the renderer. The grid should also expand so that all of the 3 renderers are shown in their entirety.

Any suggestions would be greatly appreciated.

Regards

Marty

DataGridProblem.mxml (Application file)

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
    xmlns:view="view.*">
    <mx:ArrayCollection id="dataProvider">
    	<mx:String>Item A</mx:String>
    	<mx:String>Item B</mx:String>
    	<mx:String>Item C</mx:String>
    </mx:ArrayCollection>
    <view:TestDataGrid
    	id="dg" 
    	dataProvider="{ dataProvider }"
    	width="400">
    	<view:columns>
    		<mx:DataGridColumn dataField="text" />
    		<mx:DataGridColumn itemRenderer="view.RendererButton" />
    	</view:columns>
    </view:TestDataGrid>
</mx:Application>

view.TestDataGrid.as

package view
{
    import flash.events.Event;

    import mx.controls.DataGrid;
    import mx.core.ScrollPolicy;

    public class TestDataGrid extends DataGrid
    {
    	public function TestDataGrid()
    	{
    		this.verticalScrollPolicy = ScrollPolicy.OFF;
    		this.variableRowHeight = true;
    		this.addEventListener( RendererButton.RENDERER_RESIZE , onRendererResize );
    	}
    	private function onRendererResize( event : Event ) : void
    	{
    		resizeDatagrid();
    	}
    	private function resizeDatagrid():void
    	{
    		height = measureHeightOfItems(0, dataProvider.length ) + headerHeight;
    	}
    }
}

view.RendererButton.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Button width="50" height="50"
    	click="onClick()" />

    <mx:Script>
    	<![CDATA[

    		public static const RENDERER_RESIZE : String = "resizeRenderer";
    		private function onClick() : void
    		{
    			this.height += 20;
    			dispatchEvent( new Event( RENDERER_RESIZE , true ) );
    		}
    	]]>
    </mx:Script>
</mx:HBox>

© Stack Overflow or respective owner

Related posts about flex