Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Обратная связь между dataProvider и DataGrid (http://www.flasher.ru/forum/showthread.php?t=180128)

andrew2312 28.05.2012 15:11

Обратная связь между dataProvider и DataGrid
 
Здравствуйте! Есть у меня ArrayCollection
Код AS1/AS2:

var initDG2:ArrayCollection = new ArrayCollection([
{Column1:'x11', Column2:'x12', Column3:'x13'}
{Column1:'x21', Column2:'x22', Column3:'x23'}
{Column1:'x31', Column2:'x32', Column3:'x33'}
]);

И есть DataGrid, для которого этот ArrayCollection - поставщик данных.
Код:

<mx:DataGrid id="myGrid2" dataProvider="{initDG2}" editable="true" selectable="true">
Пользователь может вносить изменения в таблицу. Как можно сделать, чтобы эти изменения сохранялись в initDG2? Т.е. при изменении текста в ячейке изменялся соответственный элемент в ArrayCollection.
Спасибо большое.

Astraport 28.05.2012 16:16

1. Кажется у вас в синтаксисе ошибка - объекты нужно через запятую.
2.
Код AS3:

[Bindable] private var initDG2:ArrayCollection = new ArrayCollection...........

3. Примерно так:
Код AS3:

initDG2.setItemAt({Column1:'x11', Column2:'x12', Column3:'x13'}, myGrid2.selectedIndex);


andrew2312 29.05.2012 13:27

Спасибо. Уважаемый Astraport, не могли бы Вы посмотреть следующую тему
http://flasher.ru/forum/showthread.php?t=179022
Там вопрос о повороте HeaderText в DataGrid.
Спасибо ещё раз.

Добавлено через 51 час 13 минут
Извините, Astraport. А если изменяется только один элемент, т.е. только в одном Column, то как делать?
Пробовал так
initDG2[myGrid2.selectedIndex].setItemAt(xxx,2);
т.е. заношу значение переменной xxx в initDG2[myGrid2.selectedIndex] на второе место (в Column2).
но выскакивает ошибка.

Astraport 01.06.2012 00:31

Могу ошибаться, не могу проверить, но примерно так:
Код AS3:

var obj:Object = new Object();
obj['Column2'] = 'x12'; // или obj.Column2 = 'x12';
initDG2.setItemAt(obj, myGrid2.selectedIndex);


andrew2312 01.06.2012 11:32

Astraport спасибо, но не работает. Беда какая-то. С первой строкой всё в порядке. Пользователь внёс данные в ячейку Column1 и ячейку Column2. В третью ячейку заносится автоматически, например, их сумма. Ок, в провайдере это есть. Начинаем работать со второй строкой. Заполнили первую и вторую ячейки и вместо того, чтобы в третьей появилась сумма, весь провайдер обнуляется - во всех строках все ячейки становятся пустыми. Блин. Задача простая. Не могу понять, где неточность. Весь код:
Код AS1/AS2:

[Bindable] var initDG2:ArrayCollection = new ArrayCollection([
{Column1:'', Column2:'', Column3:''},
{Column1:'', Column2:'', Column3:''},
{Column1:'', Column2:'', Column3:''}
]);
 
private function func3(item:Object, column:DataGridColumn):String
  var string3:String=(Number(item.Column1)+Number(item.Column2)).toString();
  initDG2[myGrid2.SelectedIndex]=string3;
  return string3;
}

Код:

<mx:DataGrid id="myGrid2" dataProvider="{initDG2}" editable="true" selectable="true">
  <mx:columns>
    <mx:DataGridColumn dataField="Column1"/>
    <mx:DataGridColumn dataField="Column2"/>
    <mx:DataGridColumn dataField="Column3" editable="false" labelFunction="func3"/>
  </mx:columns>
</mx:DataGrid>

Добавлено через 37 минут
Извините, в определении функции конечно
Код AS1/AS2:

initDG2[myGrid2.SelectedIndex].Column3=string3;


Astraport 01.06.2012 13:04

Во-первых, обращаться к АС нужно initDG2.setItemAs();
Во-вторых, мне кажется нельзя одновременно через labelFunction изменять и AC и отображение. Правильнее менять AC и она уже отобразит все как нужно. В данном случае это можно сделать через itemEditEnd http://livedocs.adobe.com/flex/3/htm...leditor_7.html

andrew2312 01.06.2012 17:15

Уважаемый Astraport! Спасибо большое! Действительно, через itemEditEnd всё работает!


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

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