Добавить строку в Flex DataGrid без изменения dataProvider - PullRequest
2 голосов
/ 30 сентября 2010

Я создаю стандартный элемент управления «Нажмите, чтобы добавить строку», но я действительно не хочу загрязнять dataProvider «заполнителем», поскольку он привязан к модели и может оказаться в базе данных.Есть ли способ добавить строку, которая не представлена ​​в dataProvider?Я начал добавлять элемент непосредственно в listItems, но тогда для этого нужен элемент в rowInfo, а затем для него нужна ссылка в rowMap ....

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 30 сентября 2010

Ответ заключается в том, чтобы написать собственную реализацию IList и использовать ее в качестве поставщика данных для списка (который по умолчанию используется).

Что-то вроде ниже должно работать ...

public class NewItemIList implements IList {

    public var sourceCollection : ICollectionView;
    public var additionalCollection : ICollectionView;
    public var additionalPositioning : String = "end";

    public override function get length() : int {
        return sourceCollection.length + additionalCollection.length;
    }

    public override function getItemAt( index : int = 0, prefetch : int = 0) : Object {
        if ( additionalPositioning  == "end" ) {
            if ( index > sourceCollection.length ) {
                return additionalCollection.getItemAt(index - sourceCollection.length );
            } else {
                return sourceCollection.getItemAt(index);
            }
        } else {
            do same for other positions...
        }
    }
0 голосов
/ 30 сентября 2010

Не без расширения DataGrid.

Я подозреваю, что добавление строки в ваш dataProvider также не решит проблему. В DataGrid используется повторное использование средства визуализации, что означает, что он создает только строки для элемента, отображаемого на экране. Я предполагаю, что если вы хотите, чтобы строка «новый элемент» всегда отображалась. Благодаря утилизации рендерера, пользователь всегда должен будет прокрутить до конца списка, чтобы найти строку «новый элемент».

0 голосов
/ 30 сентября 2010

ОК, это не красиво и аккуратно, но работает.

Отработка некоторых примеров SOTC: http://www.switchonthecode.com/tutorials/adding-dynamic-rows-to-flex-datagrid

В основном я использую две коллекции. Я расширил DataGrid и добавил другое свойство для sourceDataProvider. В установщике для этого я создаю новую коллекцию ArrayCollection для dataProvider, чтобы они больше не были «связаны». Я также звоню, чтобы добавить объект "заполнитель" для "Нажмите здесь, чтобы добавить" в dataProvider.

[Bindable]
        public function get sourceDataProvider():ArrayCollection
        {
            return _sourceDataProvider;
        }

        public function set sourceDataProvider(value:ArrayCollection):void
        {
            _sourceDataProvider= value;
             dataProvider = new ArrayCollection(value.source.concat());
             addPlaceholderItem();
        }

Когда itemEditor готов к фиксации значений, я просто вручную обновляю _sourceDataProvider. Не пытайтесь использовать сеттер, добавьте в личную копию. На данный момент элемент-заполнитель был отредактирован, поэтому нам нужно снова вызвать метод для создания фиктивного объекта.

public function editEnd(e:DataGridEvent):void
        {
            // Adding a new task
            if(e.itemRenderer.data.condition != DUMMY_PLACEHOLDER_DATA && e.rowIndex == dataProvider.length - 1)
            {
                _sourceDataProvider.addItem(e.itemRenderer.data);
                destroyItemEditor();
                callLater(addPlaceholderItem);
                e.preventDefault();
            }
            dataProvider.refresh();
        }

Пожалуйста, имейте в виду, что я контролирую, когда editEnd вызывается в моем itemEditor. У меня есть нажатие кнопки запуска метода commitValues ​​().

private function commitValues():void
        {
            //change the "data" here


            //force datagrid to endEdit
            var grid:DataGrid = listData.owner as DataGrid;
            if(grid)
            {
                grid.editedItemPosition = null;
                grid.selectedIndex = -1;
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...