Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   ItemEditEnd для DataGrid (http://www.flasher.ru/forum/showthread.php?t=142795)

vasyapunk 30.07.2010 19:57

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

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

И скрипт к нему:
Код AS3:

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

да)оно так и было)поменял все местами
Код AS3:

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

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

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


Часовой пояс GMT +4, время: 05:11.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.