My issue is that when a user clicks a datagrid cell that has a combobox editor and then immediately clicks away from the cell, the text value in that cell disappears.
I have an itemEditEnd handler on the datagrid and it shows the value of the property I use as the editorDataField just fine. But the labelFunction (which gets called after the itemEditEnd handler) on that grid column sees it as zero.
Why aren't the labelFunction and item editor playing together nicely?
Here is the DataGridColumn:
<mx:DataGridColumn
headerText="Field Name"
dataField="attribId"
editorDataField="attributeId"
labelFunction="getFieldName">
Here is the Item editor
<mx:itemEditor>
<mx:Component>
<mx:ComboBox
dataProvider="{this.outerDocument.lendersModel.fileAttributes}"
creationComplete="{outerDocument.selectAttribute();}"
labelField="fileAttribDesc"
change="updateAttribute(event);"
selectedIndex="-1">
<mx:Script>
<![CDATA[
[Bindable]
public var attributeId:int;
private var fileDetailRecordType:String;
override public function set data( value:Object ):void{
this.attributeId = value.attribId; // adding this line appears to be the fix.
var category:String = value.category;
this.filterFileAttributes( category );
}
/** Change handler for combobox in Record Type column.
*/
private function filterFileAttributes( recordType:String ):void{
this.fileDetailRecordType = recordType;
this.dataProvider.filterFunction = filterByRecordType;
this.dataProvider.refresh();
}
/** Filters the file attributes collection based on the record type.
*/
private function filterByRecordType( item:Object ):String{
return item.category.match( this.fileDetailRecordType );
}
private function updateAttribute( event:* ):void{
attributeId = event.currentTarget.selectedItem.attribId;
this.outerDocument.selectedAttributeId = attributeId;
}
]]>
</mx:Script>
</mx:ComboBox>
</mx:Component>
</mx:itemEditor>
and here is the label function for the DataGridColumn.
private function getFieldName( item:Object, dgc:DataGridColumn ):String{
var fieldName:String = '';
/* At this point the lendersModel.fileAttributes collection is
filtered based on the record type. We need to remove the filter
so we can search the entire collection, not just the filtered subset. */
lendersModel.fileAttributes.filterFunction = refreshFilter;
lendersModel.fileAttributes.refresh();
for each( var attrib:FileAttributeDTO in lendersModel.fileAttributes ){
if( attrib.attribId == item.attribId )
fieldName = attrib.fileAttribDesc;
}
return fieldName;
}
And here is the code executed in the itemEditEndHandler for the Datagrid:
var rowCount:int = fieldsGridEmpty.selectedIndex; var attribCombo:ComboBox = ComboBox( fieldsGridEmpty.itemEditorInstance );
if( rowCount != -1 && attribCombo.selectedItem != null )
{
newFieldsDp[ rowCount ].fileAttribute.dataType = attribCombo.selectedItem.dataType;
newFieldsDp[ rowCount ].fileAttribute.dataLength = attribCombo.selectedItem.dataLength;
newFieldsDp[ rowCount ].fileAttribute.fileAttribDesc = attribCombo.selectedLabel;
newFieldsDp[ rowCount ].dataLength = attribCombo.selectedItem.dataLength;
newFieldsDp[ rowCount ].attribId = attribCombo.selectedItem.attribId;
}
Now, the item edit handler shows a valid value for 'attribId':
newFieldsDp[ rowCount ].attribId = attribCombo.selectedItem.attribId;
However, the label function gets executed after this and the value for item.attribId is 0. And that's the reason 'fieldName' is an empty String, because there's no match.