I have a moderately complex standard DataGrid, using an
XMLListCollection dataProvider.  In the DG change event handler, I
assign a reference to the selectedItem(an XML node) to an instance
variable.  One column of the DG is a CheckBox ItemRenderer.

On the first interaction with the DG, if I directly click the checkbox,
without first selecting that row,  the event.target.selectedItem is the
Booean value, "true", and not the XML node I expect.  If I select the
row first, then click the CheckBox renderer, the
event.target.selectedItem is the xml node I want.

event.target.selectedIndex is reported correctly, so I have a
work-around, but does anyone have any suggestions about why this might
be happening?  I have never seen anything like this before, and have
done similar stuff a lot.

Obviously, I suspect the CheckBox item renderer is playing a role, and
will investigate further, but, any thoughts?  The mxml item renderer is
pretty short so I'll post it below.

Tracy


<?xml version="1.0" encoding="utf-8"?>
<!-- RendererCheckBox
  special version, uses Status code (W,A) to set/save value -->
<mx:CheckBox xmlns:mx="http://www.adobe.com/2006/mxml";
        click="onClick()">
        
<mx:Script><![CDATA[
  import mx.controls.dataGridClasses.DataGridListData

  public var _xmlItem:XML;    //holds the current item xml node
  private var _dgListData:DataGridListData; 
  private var _sDataField:String
  
  public var value:String = "W";
  
  //Sets the state of the checkbox to the value of the selected
attribute
  //If there is no selected attribute, create on and set it to false
  override public function set data(oItem:Object):void
  {
    _xmlItem = XML(oItem);
    _dgListData = DataGridListData(listData);
    _sDataField = _dgListData.dataField;
    var sStatusCode:String = _xmlItem[_sDataField];
    var bSelected:Boolean = (sStatusCode == "A");
    this.selected = bSelected;                        //set the checkbox
state to the local var
  }//set data
  
  /**
   *  center the contentHolder
   */
  override protected function updateDisplayList(w:Number, h:Number):void
  {
    super.updateDisplayList(w, h);

    var n:int = numChildren;
    for (var i:int = 0; i < n; i++)
    {
      var c:DisplayObject = getChildAt(i);
      if (!(c is TextField))
      {
        c.x = (w - c.width) / 2;
        c.y = 0;
      }
    }
  }  
  
  override public function get data():Object
  {
    return this.selected;
  }//

  //called by click of the checkbox
  private function onClick():void
  {
    if (this.selected)  {
      _xmlItem[_sDataField] = "A";
    }
    else  {
      _xmlItem[_sDataField] = "W";
    }
    dispatchEvent(new Event("IRCbxApprovedClick", true));
  }
                
]]></mx:Script>
        
</mx:CheckBox>

Reply via email to