在不更改dataProvider的情况下向Flex DataGrid添加行

时间:2010-09-30 16:12:26

标签: flex datagrid

我正在创建标准的“Click to add row”控件,但我真的不想将dataProvider弄脏为“占位符”,因为它绑定到模型并最终可能在数据库中。有没有办法添加一个未在dataProvider中表示的行?我开始将项目直接添加到listItems,但后来需要rowInfo中的项目,然后需要在rowMap中引用....

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

好吧,这不好看又干净但是有效。

解决一些SOTC的例子: http://www.switchonthecode.com/tutorials/adding-dynamic-rows-to-flex-datagrid

基本上,我使用的是两个系列。我扩展了DataGrid并为sourceDataProvider添加了另一个属性。在这个setter中,我为dataProvider创建了一个新的ArrayCollection,因此它们不再“链接”。我还打电话给“dataUnvider”添加“点击此处添加”的“占位符”对象。

[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。不要尝试使用setter,添加到私有副本。此时,占位符项现在已经被编辑,因此我们需要再次调用该方法来创建虚拟对象。

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();
        }

请记住,我正在控制在itemEditor中调用editEnd的时间。我按下了一个按钮,运行方法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;
            }
        }

答案 1 :(得分:0)

答案是编写自己的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...
        }
    }

答案 2 :(得分:0)

不是没有扩展DataGrid。

我怀疑在dataProvider中添加一行也无法解决问题。 DataGrid使用渲染器回收,这意味着它只为屏幕上的项目创建行。我假设您希望始终显示“新项目”行。由于渲染器回收,用户总是必须滚动到列表的底部才能找到“新项目”行。