Hi Alex, Alex Harui wrote: > are you dispatchng events when the dataprovider item changes or calling > itemUpdated on the collection?
No, I am not dispatching any events. I assumed the grid renderer would notice the value had changed. I guess I need to dispatch an event for this to occur. But I dont know where I'd need to do that. I've got a basic working solution at the moment. Instead of extending Label for my renderer i'm extending DataGridItemRenderer. I think extending Label was the cause of my original problem. I would still like to understand how to make it work when extending Label though. I have the feeling that it should have been trivial (if you'd like to write a blog entry about how it do it that would be great:). Here is the current implementation. Note: Ive only tested this with a dataProvider that contained one object(row). <mx:DataGridColumn headerText="Column 1" dataField="col1" itemEditor="view.CurrencyEditor" itemRenderer="view.CurrencyRenderer" editorDataField="fNumber" rendererIsEditor="false" /> package view { import helper.FNumber; import mx.controls.TextInput; import mx.controls.dataGridClasses.DataGridColumn; import mx.controls.DataGrid; import mx.formatters.CurrencyFormatter; public class CurrencyEditor extends TextInput { private var cformatter:CurrencyFormatter; private var _fNumber:FNumber; public function CurrencyEditor(){ cformatter = new CurrencyFormatter(); cformatter.precision=2; cformatter.rounding="none"; //Only allow the following characters to be entered. restrict = "$0-9\\.\\,"; } override public function set data(value:Object):void{ if (value != null){ super.data = value; var dg:DataGrid = DataGrid(listData.owner); var column:DataGridColumn = dg.columns[listData.columnIndex]; fNumber = data[column.dataField]; this.text = cformatter.format(fNumber.toString()); } } public function get fNumber():FNumber{ var dollarExp:RegExp = new RegExp("\\$","g"); var commaExp:RegExp = new RegExp(",","g"); var x:String = text.replace(dollarExp,""); x = x.replace(commaExp,""); return new FNumber(new Number(x)); } public function set fNumber(v:FNumber):void{ this._fNumber = v; } } } package view { import mx.formatters.CurrencyFormatter; import mx.controls.dataGridClasses.DataGridItemRenderer; public class CurrencyRenderer extends DataGridItemRenderer { private var cformatter:CurrencyFormatter; public function CurrencyRenderer(){ cformatter = new CurrencyFormatter(); cformatter.precision=2; } override public function validateProperties():void{ super.validateProperties(); this.text = cformatter.format(text); } } } > From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On > Behalf Of shaun etherton > Sent: Thursday, April 12, 2007 12:40 AM > To: [EMAIL PROTECTED] > Subject: [flexcoders] custom datagrid item render not seeing changes > made by custom datagrid item editor > > > > Hi, > > I'm having some trouble with a datagrid item editor and renderer. I > think I must have missed something obvious. > > I have a datagrid with editable cells which are bound to Number-like > properties of an object. I want to display these values using the > CurrencyFormatter. I want to edit these as Numbers without the dollar > sign. > > I am trying to make these renders/editors "lightweight" because the grid > > has a lot of columns and rows(its basically a spreadsheet) so i'm trying > > to use actionscript to extend rather than using composition and > containers in MXML. > > I have an item editor that extends TextInput. > I have a renderer that extends Label. > The renderer displays its value correctly as $100.00. > > The editor updates the property of the object when I mouse click outside > > of the cell. > > My gridcolumn has: > > dataField="columnOne" > itemEditor="path.to.editor" > itemRender="path.to.renderer" > editorDataField="newValue" > > newValue is a function of my editor that returns the updated value, it > seems to be doing the right thing as I can see the value updated in the > set function of my object. > > I'm not really sure what my render should look like code-wise. I have > something like the following at the moment. > > class renderer extends Label{ > public function set data(value:Object):void{ > if (value != null){ > super.data = value; > text = formatter.format(text); > } > } > } > > Any ideas where Ive gone wrong or what I might have missed? > > cheers, > shaun > cheers, shaun