Flex - DataGrid Edit - ошибка или правильный способ разрешить редактирование в сетке данных? - PullRequest
1 голос
/ 12 декабря 2011

Когда я редактирую последнюю строку сетки, вызывается мой метод события itemEditEnd, но данные в моей коллекции ArrayCollection не обновляются, чтобы отразить сделанные изменения. Все остальные столбцы работают, похоже, только в последнем столбце есть проблема. Я не уверен, если это ошибка, или мне нужно сделать что-то другое? (Flash Builder 4.5 / Flex 4.5.1)

У меня есть простая редактируемая DataGrid с ArrayCollection в качестве поставщика данных. Он заполняется, и я могу редактировать. Я перехватываю событие itemEditEnd и получаю строку из моей коллекции массивов для передачи обратно на сервер:

public var _recs:ArrayCollection = new ArrayCollection;

<mx:DataGrid id="recsDG" dataProvider="{_recs}" 
                 editable="true" itemEditEnd="recsDG_itemEditEndHandler(event)">
        <mx:columns>
            <mx:DataGridColumn headerText="id" dataField="id" editable="false"/>
            <mx:DataGridColumn headerText="type" dataField="type"/>
... more columns ...
        </mx:columns>
    </mx:DataGrid>



protected function recsDG_itemEditEndHandler(event:DataGridEvent):void
        {
                    // THIS IS MY ARRAY COLLECTION/ROW(?):  _recs[event.rowIndex]
           }

Если я щелкну последний столбец во второй раз и изменим его снова, я вижу, что значение в коллекции массивов теперь изменяется на изменение, которое я только что сделал. Например, при трассировке отладчика, скажем, мое первоначальное значение «AAA», я меняю его на «BBB» и нажимаю tab, в отладчике в itemEditEnd отображается «AAA» (только для этого последнего столбца). Затем я изменяю значение на «CCC» и вкладку, и в отладчике я вижу «BBB»!

Я также пробовал свойство 'event.currentTarget.itemEditorInstance.data', и оно также не обновляется с введенным новым значением.

В качестве временного решения я добавил редактируемый столбец в конце сетки, без заголовка столбца, шириной 1 пиксель. Кажется, это работает, когда я выкладываю вкладку, теперь, когда это уже не последний столбец, кажется, что он работает. Хотя это своего рода клуге.

О, я только что заметил, когда я нажимаю, ни одно из них не обновляется, это только когда я вкладываю! Так что это еще одна проблема ??

1 Ответ

0 голосов
/ 15 декабря 2011

Убедитесь, что ваш поставщик данных помечен как [Bindable]. Также попробуйте _recs.refresh() в вашем методе обработчика itemEditEnd. Я настроил приведенный ниже код в простом проекте, и он, кажется, работает нормально (все ячейки обновляют коллекцию массивов сразу после нажатия клавиши Tab). Также я использую Flex 4.5.1 SDK. Если это не решит вашу проблему, вы можете опубликовать полный код, который вы используете, или предоставить пример приложения, которое воспроизводит проблему?

<?xml version="1.0" encoding="utf-8"?>

</fx:Declarations>

<fx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;
        import mx.events.DataGridEvent;

        [Bindable]
        public var _data:ArrayCollection = new ArrayCollection([
            {id:1,name:'Ted',pos:'Mgr'},
            {id:2,name:'Bob',pos:'Mgr'},
            {id:3,name:'Jeb',pos:'Mgr'}
        ]);

        protected function dg_itemEditEndHandler(event:DataGridEvent):void
        {
            _data.refresh();
        }

    ]]>
</fx:Script>

<s:Panel title="Halo DataGrid Control Example"
         width="75%" height="75%" 
         horizontalCenter="0" verticalCenter="0">
    <s:VGroup left="10" right="10" top="10" bottom="10">
        <s:Label width="100%" color="blue"
                 text="Select a row in the DataGrid control."/>

        <mx:DataGrid id="dg" width="100%" height="100%" rowCount="5" dataProvider="{_data}" editable="true" itemEditEnd="dg_itemEditEndHandler(event)">
            <mx:columns>
                <mx:DataGridColumn dataField="id" headerText="ID"/>
                <mx:DataGridColumn dataField="name" headerText="NAME"/>
                <mx:DataGridColumn dataField="pos" headerText="POSITION"/>
            </mx:columns>
        </mx:DataGrid>

        <mx:DataGrid id="dg2" width="100%" height="100%" rowCount="5" dataProvider="{_data}" editable="false" >
            <mx:columns>
                <mx:DataGridColumn dataField="id" headerText="ID"/>
                <mx:DataGridColumn dataField="name" headerText="NAME"/>
                <mx:DataGridColumn dataField="pos" headerText="POSITION"/>
            </mx:columns>
        </mx:DataGrid>
    </s:VGroup>
</s:Panel>

...