Thanks very much Tracy, that's exactly what I was missing. For the
record, here's the label function:
package com.myco.components {
import mx.controls.dataGridClasses.DataGridColumn;
import mx.formatters.DateFormatter;
public class DateRenderer {
private var _formatter:DateFormatter
public function DateRenderer() {
super();
_formatter = new DateFormatter();
_formatter.formatString="EEE, DD MMM YYYY at LL:NN A";
}
private function isoToDate(value:String):Date {
var dateStr:String = value;
dateStr = dateStr.replace(/-/g, "/");
dateStr = dateStr.replace("T", " ");
dateStr = dateStr.replace("Z", " GMT-0000");
return new Date(Date.parse(dateStr));
}
public function render( data:Object, column:DataGridColumn ) :
String {
if (! data) { return "n.a."; }
var dateString:String = data[column.dataField];
if (! dateString) { return "n.a."; }
var date:Date = isoToDate(String(dateString));
return _formatter.format(date);
}
}
}
I create an instance of this in my subclass of DataGrid, and then just
set
the labelFunction property of date columns to _dateRenderer.render.
--- In [email protected], "Tracy Spratt" <[EMAIL PROTECTED]> wrote:
>
> If really all you want to do is, "override the text", then this is
> overkill. Just use a labelFunction().
>
> But if you want to do an item renderer, I should think you would set
> the display in the set data() override. Well, rather in the the
> commitProperties function, after invalidating properties in set data
> ().
>
> Tracy
>
> --- In [email protected], "karlgold" karlgold@ wrote:
> >
> > I'm trying to implement a custom item renderer in ActionScript that
> > parses an ISO date string (which is the way the date is always
> > represented in my data feed) and formats it for display in a
> DataGrid
> > column.
> >
> > I have tried multiple variations on this:
> >
> > package com.mycompany.components {
> >
> > import mx.controls.dataGridClasses.DataGridItemRenderer;
> > import mx.controls.dataGridClasses.DataGridListData;
> > import mx.controls.listClasses.BaseListData;
> > import mx.formatters.DateFormatter;
> >
> > public class DateRenderer extends DataGridItemRenderer {
> >
> > private var _formatter:DateFormatter
> >
> > public function DateRenderer() {
> >
> > super();
> >
> > _formatter = new DateFormatter();
> > _formatter.formatString="EEE, DD MMM YYYY at LL:NN A";
> > }
> >
> > private function isoToDate(value:String):Date {
> >
> > var dateStr:String = value;
> >
> > dateStr = dateStr.replace(/-/g, "/");
> > dateStr = dateStr.replace("T", " ");
> > dateStr = dateStr.replace("Z", " GMT-0000");
> >
> > return new Date(Date.parse(dateStr));
> > }
> >
> > override public function set listData( row:BaseListData ) :
> void {
> >
> > super.listData = row;
> >
> > var data:String = row.label;
> > if (data) {
> > var date:Date = isoToDate(data);
> > super.text = _formatter.format(date);
> > } else {
> > super.text = "n.a.";
> > }
> >
> > super.invalidateDisplayList();
> > }
> > }
> > }
> >
> > However, the data grid always displays the raw ISO date rather than
> the
> > formatted one.
> >
> > I stepped through the code and noticed that
> > DataGridItemRenderer.validateProperties() always sets the text
> property
> > to _listData.label. I can see my formatted text value getting
> reset to
> > the raw data value every time.
> >
> > Is there some way around this short of copying and hacking up my own
> > version of DGIR?
> >
> > I also tried extending Label; this displayed the formatted date but
> all
> > the normal mouse behaviors (highlighting on mouseover, selecting on
> > click) stopped working in that column. Really all I want to do is
> > override the text that DGIR displays.
> >
> > Thanks for any guidance,
> >
> > Karl
> >
>