[FLEX]Error: Cannot determine comparator for SortField with name

Programming/Flex 2009.01.28 23:01
DataGrid를 좀 고급스럽게 사용하려고 구조적인 데이터를 사용하는 중입니다.
헌데 컬럼을 눌러 정렬을 시킬때 문제가 발생했습니다.
아래와 같은 에러가 발생했죱.
Error: Cannot determine comparator for SortField with name 'backupDeveloperMember'.
    at mx.collections::SortField/nullCompare()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\collections\SortField.as:566]
    at mx.collections::SortField/http://www.adobe.com/2006/flex/mx/internal::internalCompare()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\collections\SortField.as:234]
    at mx.collections::Sort/internalCompare()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\collections\Sort.as:831]
    at mx.collections::Sort/findItem()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\collections\Sort.as:527]
    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]


위 에러는 소팅하는 소팅하는 대상을 지원하지 못한다는 말입니다.
한마디로 Compare가 되지 못한단 소리.
저 에러가 난 DataGrid의 DataProvider의 구조는

위와같이 계층 구조로 되어있습니다.
bean 안에 또다른 bean이 들어있습죠.
그러니 String, int 등의 데이터는 자체적으로 Compare가 가능하지만 Object는 Compare가 되지 않습니다.

그러므로 Compare를 재정의 해 줄 필요가 있겠죠?

Flex API를 보시면 DataGrid Class에는 SortCompareFunction이라는 것이 있습니다.

오호라~ 요녀석을 사용하면 뭔가 될 듯 하군요.

참. Flex에서 쓰이는 ObjectUtil Class에는 stringCompare 메소드가 있습니다.

ObjectUtil.stringCompare 자세히 >>


비교 대상이 단순 String 이라면 요녀석을 사용하면 간단해 지겠군요.

참. Flex의 String Class에 localeCompare()라는 메소드가 있어요. 이것도 비슷한 역할을 하긴하는데...
첨엔 저 메소드를 썼었는데 알수 없는 이유로 반응이 엄~~~~청나게 느려집니다.-_-;;
그래서 이유를 알아보려고 트래킹을 하다하다가 중도 포기했어요.-_-;;
혹시 이유를 아시는분은 알려주시면 정말 감사드리겠습니다.

private function backupDeveloperMemberSortCompareFunction(obj1:Object, obj2:Object) :int {
var fa:String = obj1.backupDeveloperMember.name;
var fb:String = obj2.backupDeveloperMember.name;
return ObjectUtil.stringCompare(fa, fb, false);
}
private function backupDeveloperMemberLabel(item:Object, column:Object):String {
                 var retVal:String = item.backupDeveloperMember!=null?item.backupDeveloperMember.name:"";
                return retVal;
}

<mx:DataGridColumn headerText="담당개발자" dataField="developerMember"  width="80" labelFunction="backupDeveloperMemberLabel"  sortCompareFunction="backupDeveloperMemberSortCompareFunction"/>

자~ 이제 다됬네요.

정렬을 시켜 볼까요~?

잘 동작하나요.^^?
저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License


티스토리 툴바