1

我有这个数据网格,其中 dataProvider 是 2 种不同类型的对象(FolderVO 和 FileVO)的 ArrayCollection。我有一个 size 列,在 FolderVO 的情况下由一个名为 contentSize 的属性填充,而在 FileVO 的情况下,它由 size 属性填充(差异由 itemrenderer 处理)。

这意味着我需要为 size 列实现一个排序功能,这里是:

protected function sortSize(dataA:Object, dataB:Object):int{
        var order:int = 0;

        if(dataA is FolderVO && dataB is FolderVO){

            order = ObjectUtil.numericCompare(dataA.contentSize, dataB.contentSize);

        }else if(dataA is FileVO && dataB is FileVO){

            order = ObjectUtil.numericCompare(dataA.size, dataB.size);

        }else if(dataA is FolderVO && dataB is FileVO){

            order = 1;

        }else if(dataA is FileVO && dataB is FolderVO){

            order = -1;
        }

        return order;
    }

该函数运行得很好,但是在返回语句之后我得到了这个错误:

Error: Find criteria must contain at least one sort field value.
at mx.collections::Sort/findItem()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\collections\Sort.as:491]
at mx.collections::ListCollectionView/getItemIndex()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\collections\ListCollectionView.as:513]
at ListCollectionViewCursor/collectionEventHandler()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\collections\ListCollectionView.as:2154]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.collections::ListCollectionView/dispatchEvent()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\collections\ListCollectionView.as:833]
at mx.collections::ListCollectionView/internalRefresh()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\collections\ListCollectionView.as:1275]
at mx.collections::ListCollectionView/refresh()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\collections\ListCollectionView.as:402]
at mx.controls::DataGrid/sortByColumn()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\controls\DataGrid.as:3560]
at mx.controls::DataGrid/headerReleaseHandler()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\controls\DataGrid.as:4909]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.core::UIComponent/dispatchEvent()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\UIComponent.as:9298]
at mx.controls.dataGridClasses::DataGridHeader/mouseUpHandler()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\controls\dataGridClasses\DataGridHeader.as:1259]

如您所见,错误发生在 flex 框架本身,而不是我的代码中。所以我真的被困在这里了。帮助将不胜感激。

4

1 回答 1

4

好吧,我自己找的……

显然,错误是因为在某些时候 Flex 框架假定 ArrayCollection 中包含的所有对象都有一个size属性,因此即使我使用自定义排序功能,它也会尝试获取它的值。

解决方案是向我的 FolderVO 添加一个虚拟大小属性,默认值为 0。

希望这对那里的人有帮助。

干杯!

于 2009-12-28T21:53:37.363 回答