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
> >
>

Reply via email to