Моя проблема заключается в том, что когда пользователь щелкает ячейку таблицы данных, в которой есть редактор комбинированного списка, а затем сразу же щелкает мышью вне ячейки, текстовое значение в этой ячейке исчезает.
У меня есть обработчик itemEditEnd в сетке данных, и он прекрасно показывает значение свойства, которое я использую в качестве editorDataField. Но labelFunction (которая вызывается после обработчика itemEditEnd) в этом столбце сетки видит его как ноль.
Почему labelFunction и редактор элементов не работают вместе?
Вот столбец DataGridColumn:
<mx:DataGridColumn
headerText="Field Name"
dataField="attribId"
editorDataField="attributeId"
labelFunction="getFieldName">
Вот редактор элементов
<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>
и вот функция метки для 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;
}
А вот код, выполненный в itemEditEndHandler для сетки данных:
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;
}
Теперь обработчик редактирования элемента показывает допустимое значение для 'attribId':
newFieldsDp[ rowCount ].attribId = attribCombo.selectedItem.attribId;
Однако функция label выполняется после этого, и значение item.attribId равно 0. И именно поэтому fieldName является пустой строкой, потому что совпадения нет.