PDA

Просмотр полной версии : ItemEditEnd для DataGrid


vasyapunk
30.07.2010, 19:57
Почему если поставить для DataGrid функцию на событие ItemEditEnd, то эта функция срабатывает несколько раз?
Вот мой mxml:

<mx:DataGrid rowCount="8"
sortableColumns="false"
id="yearGrig" dataProvider="{buildGridData}"
height="100%" editable="true" itemEditEnd="onItemEditEnd(event)">
<mx:columns>
<mx:DataGridColumn headerText="Description\Year" dataField="label" width="160"
backgroundColor="#CCCCC9"
textAlign="right" fontWeight="bold" editable="false"
/>
<mx:DataGridColumn headerText="" width="90" editable="true"
id="yearMinusTwu" dataField="yearMinusTwo" labelFunction="format"/>
<mx:DataGridColumn headerText="" width="90" editable="true"
id="yearMinusOne" dataField="yearMinusOne" labelFunction="format"/>
<mx:DataGridColumn headerText="" width="90" editable="true"
id="todayYear" dataField="todayYear" labelFunction="format"/>
<mx:DataGridColumn headerText="" width="90" editable="true"
id="yearPlusOne" dataField="yearPlusOne" labelFunction="format"/>
<mx:DataGridColumn headerText="" width="90" editable="true"
id="yearPlusTwu" dataField="yearPlusTwo" labelFunction="format"/>
</mx:columns>
</mx:DataGrid>

И скрипт к нему:
private function onItemEditEnd(event:DataGridEvent):void{
var currentColumn:String;
if(event.columnIndex==1){
currentColumn="yearMinusTwu";
}else if(event.columnIndex==2){
currentColumn="yearMinusOne";
}else if(event.columnIndex==3){
currentColumn="todayYear";
}else if(event.columnIndex==4){
currentColumn="yearPlusOne";
}else if(event.columnIndex==5){
currentColumn="yearPlusTwu";
}
Alert.show(buildGridData[event.rowIndex]['label'].toString()+' = '+buildGridData[event.rowIndex][currentColumn].toString());

event.preventDefault();
yearGrig.destroyItemEditor();
}
Вот тот алерт выполняется сейчас 3 раза.Почему?
Если кто с таким сталкивался, помогите плиз)

GBee
30.07.2010, 23:50
И все три события с одним и тем же таргетом?

Dimitry_II
31.07.2010, 03:22
Может, язык не очень стелется в силу слабой теоретической подготовки, но причину вижу четко, так как сам в свое время наигрался с эдитами и рендерами, что и попытаюсь объяснить ...

К моменту вызова алерта строка находится в режиме редактирования (дестрой еще не наступил); напомню - это строка из коллекции, готорая гарантированно биндится. И в самом алерте происходит обращение к этой коллекции. При попытке получить значение поле (в первом случае "label", во втором - currentColumn) коллекция пытается получить значение поля редактируемой строки, что без "сброса" редактирования нельзя. Поэтому вызывается эвент окончания редактирования. В алерте два обращения - будет два повтора вызова функции.

Если поставить алерт после удаления эдитора, такой проблемы не будет.

P.S. Я сейчас не вспомню, в чем была загвоздка, но точно помню, что если event.preventDefault() вызван до дестроя эдитора, то что-то шло не так. Конечно, необъективно, но зерно в этом есть.

vasyapunk
02.08.2010, 11:56
да)оно так и было)поменял все местами

yearGrig.destroyItemEditor();
event.preventDefault();
Alert.show(event.dataField+' = '+buildGridData[event.rowIndex]['label'].toString()+' = '+buildGridData[event.rowIndex][currentColumn].toString());



и теперь вызывается алерт 1 раз)

спасибо большое)