2008-09-30 2 views
3

데이터의 고객 그룹을 사용하는 AdvancedDataGrid가 있습니다. 모든 그룹이 계층 구조에서 동일한 수준에있는 것은 아니며 그룹에는 그룹과 구성원이 모두 포함될 수 있습니다. 정렬 콜백이 있지만 리프 최다 레벨의 그룹을 제외하고는 호출되지 않습니다. 예제를 보려면 아래 코드를 참조하십시오. - 모든 그룹을 확장 한 다음 "생년월일"의 정렬 열을 클릭하여 생년월일 별 역순 정렬을 가져옵니다. (이상하게도, 몇 가지 이유가 있기 때문에 첫 번째 오름차순 정렬이 작동합니다.)Flex AdvancedDataGrid에서 정렬하는 방법 - 콜백이 호출되지 않습니다.

그룹 회원과 동일한 수준으로 그룹화 된 데이터는 호출되지 않습니다.

어떻게 수정합니까?

감사합니다.

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
    layout="vertical" 
    verticalAlign="middle" 
    backgroundColor="white" > 
    <mx:Script> 
    <![CDATA[ 
     import mx.controls.advancedDataGridClasses.AdvancedDataGridColumn; 
     import mx.collections.HierarchicalData; 
     import mx.utils.ObjectUtil; 

     private var arrData : Array = [ 
     { name: "User A", dob: "04/14/1980" }, 
     { name: "User B", dob: "01/02/1975" }, 
     { name: "Group A", children: [ 
      { name: "User E", dob: "09/13/1972" }, 
      { name: "User F", dob: "11/22/1993" } 
      ] 
     }, 
     { name: "Group B", children: [ 
      { name: "Group B1", children: [ 
      { name: "User I", dob: "01/23/1984" }, 
      { name: "User J", dob: "11/10/1948" } 
      ] 
      }, 
      { name: "User G", dob: "04/09/1989" }, 
      { name: "User H", dob: "06/20/1963" } 
      ] 
     }, 
     { name: "User C", dob: "12/30/1977" }, 
     { name: "User D", dob: "10/27/1968" } 
     ]; 

     private function date_sortCompareFunc(itemA:Object, itemB:Object):int 
     { 
     if (itemA.hasOwnProperty("dob") && itemB.hasOwnProperty("dob")) 
     { 
      var dateA:Date = new Date(Date.parse(itemA.dob)); 
      var dateB:Date = new Date(Date.parse(itemB.dob)); 
      return ObjectUtil.dateCompare(dateA, dateB); 
     } 
     else if (itemA.hasOwnProperty("dob")) 
     { 
      return 1; 
     } 
     else if (itemB.hasOwnProperty("dob")) 
     { 
      return -1; 
     } 
     return ObjectUtil.stringCompare(itemA.name, itemB.name); 
     } 

     private function date_dataTipFunc(item:Object):String 
     { 
     if (item.hasOwnProperty("dob")) 
     { 
      return dateFormatter.format(item.dob); 
     } 
     return ""; 
     } 

     private function label_dob(item:Object, col:AdvancedDataGridColumn):String 
     { 
     var dob:String=""; 
     if(item.hasOwnProperty("dob")) 
     { 
      dob=item.dob; 
     } 
     return dob; 
     } 
    ]]> 
    </mx:Script> 

    <mx:DateFormatter id="dateFormatter" formatString="MMMM D, YYYY" /> 

    <mx:AdvancedDataGrid id="adgTest" dataProvider="{new HierarchicalData(this.arrData)}" designViewDataType="tree" width="746" height="400"> 
    <mx:columns> 
     <mx:AdvancedDataGridColumn headerText="Name" dataField="name"/> 
     <mx:AdvancedDataGridColumn dataField="dob" headerText="Date of birth" 
      labelFunction="label_dob" 
      sortCompareFunction="date_sortCompareFunc" 
      showDataTips="true" 
      dataTipFunction="date_dataTipFunc" /> 

    </mx:columns> 
    </mx:AdvancedDataGrid> 
</mx:Application> 
+0

안녕하세요 Shawn, 귀하의 경우 정렬이 왜 효과가 없다고 판단 했습니까?내가 sortCompareFunction와 비슷한 문제를 해결하기 위해 노력하고있어, 내 데이터가 너와 비슷하다 : 가지가 리프 객체와 정렬 콜백 만 처음 호출했을 때와 동일한 속성 집합을 갖고 있지 않다. Thx, 아이린 –

답변

0

이것은 SortCompareFunction의 논리와 관련이 있습니다.

모든 그룹 노드에 대해 dob:"01/01/1970"을 넣으면 예상대로 정렬 작업이 올바르게 수행됩니까?

+0

예, 작동합니다. 그러나 실제 솔루션에서는 각 개체에 필드를 추가하는 것이 항상 가능하지는 않습니다. 정렬 콜백에 중단 점이나 추적을 넣으면 정렬 콜백이 다른 행에 대해 호출되지 않습니다. "SortCompareFunction의 논리"를 사용하면 Flex 내부의 SortCompareFunction 또는 위의 콜백 함수를 참조하고 있습니까? "hasOwnProperty"를 사용하지 않는다면 이상한 SortCompareFunction에서 이상한 것을 볼 수 없습니다. –

2

첫 번째 행에 null 데이터 또는 빈 문자열이 들어 있고 advanceddatagrid가 그룹화 된 데이터를 사용하도록 설정되어있는 것처럼 보이면 정렬 함수가 호출되지 않습니다.

해킹이 약간 그렇지만 데이터베이스/파일 읽기/데이터 입력 레벨에 삽입 할 수있는 비현실적인 (예 : 1/1/1770) 일정한 데이터 조각을 넣을 수 있다면 데이터가 해당 열과 일치하면 null로 렌더링되는 열 labelFunction, 작동해야하며, 적어도 정렬 함수가 호출됩니다. 너무 늦게 응답에 대한 미안하지만 다른 사람이 답을 찾기 위해 시도하는 경우 적어도, 그들이이 표시 될 수 있습니다

public function dateCellLabel(item:Object, column:AdvancedDataGridColumn):String 
    { 
     var date:String = item[column.dataField]; 

     if (date=="1/1/1770") 
      return null; 
     else 
      return date; 
    } 

.

0

null 또는 빈 문자열 값 (완벽하게 유효한 값)을 사용하여 그룹화 된 데이터를 정렬하는 것과 관련이 있다고 생각하지 않습니다. 문서에서는 dataField이 나타내는 속성이 dataProvider [item]의 유효한 속성 (즉, 존재해야 함, null 또는 기타)이어야한다는 것을 명확히 명시합니다.

RaySir에게 내 투표를하는 동안 해킹이라고 생각하지 않지만 오히려 데이터를 정상화하고 있다고 생각합니다. 나는 완벽하게 훌륭한 프리젠 테이션 계층의 일이라고 생각합니다. 그것이이 예제의 경우가 표시되지 않지만

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
    layout="vertical" 
    verticalAlign="middle" 
    backgroundColor="white" > 
    <mx:Script> 
     <![CDATA[ 
      import mx.collections.HierarchicalData; 
      import mx.controls.advancedDataGridClasses.AdvancedDataGridColumn; 
      import mx.utils.ObjectUtil; 

      private var arrData : Array = [ 
       { name: "User A", dob: "04/14/1980" }, 
       { name: "User B", dob: "01/02/1975" }, 
       { name: "Group A", dob: null, children: [ 
        { name: "User E", dob: "09/13/1972" }, 
        { name: "User F", dob: "11/22/1993" } 
       ] 
       }, 
       { name: "Group B", dob: null, children: [ 
        { name: "Group B1", dob: null, children: [ 
         { name: "User I", dob: "01/23/1984" }, 
         { name: "User J", dob: "11/10/1948" } 
        ] 
        }, 
        { name: "User G", dob: "04/09/1989" }, 
        { name: "User H", dob: "06/20/1963" } 
       ] 
       }, 
       { name: "User C", dob: "12/30/1977" }, 
       { name: "User D", dob: "10/27/1968" } 
      ]; 

      private function dob_sort(itemA:Object, itemB:Object):int { 
       var dateA:Date = itemA.dob ? new Date(itemA.dob) : null; 
       var dateB:Date = itemB.dob ? new Date(itemB.dob) : null; 
       return ObjectUtil.dateCompare(dateA, dateB); 
      } 

      private function dob_dataTip(item:Object):String { 
       if (!item.hasOwnProperty('children') && item.hasOwnProperty("dob")) { 
        return dateFormatter.format(item.dob); 
       } 
       return null; 
      } 

      private function dob_label(item:Object, col:AdvancedDataGridColumn):String { 
       if(!item.hasOwnProperty('children') && item.hasOwnProperty("dob")) { 
        return item.dob; 
       } 
       return null; 
      } 
     ]]> 
    </mx:Script> 

    <mx:DateFormatter id="dateFormatter" formatString="MMMM D, YYYY" /> 

    <mx:AdvancedDataGrid id="adgTest" dataProvider="{new HierarchicalData(arrData)}" designViewDataType="tree" width="746" height="400"> 
     <mx:columns> 
      <mx:AdvancedDataGridColumn headerText="Name" dataField="name"/> 
      <mx:AdvancedDataGridColumn headerText="Date of birth" dataField="dob" 
       labelFunction="dob_label" 
       dataTipFunction="dob_dataTip" 
       sortCompareFunction="dob_sort" 
       showDataTips="true" /> 

     </mx:columns> 
    </mx:AdvancedDataGrid> 
</mx:Application> 
0

, 열에 누락 된 데이터 필드가 일어나는 일종의 방지 할 수 있습니다 :

여기에는 다시 일 예이다. 시스템은 정확하게 설명 된대로 sortCompareFunction이 호출되지 않습니다.

필드를 자체적으로 데이터에서 가져 오는 사용자 지정 열 렌더러를 사용하는 경우 dataField 특성을 쉽게 간과 할 수 있습니다. 당신이 정렬 할 때까지 모든 것이 잘 작동합니다. sortCompareFunction은 호출되지 않습니다.

sortCanBeApplied에서 1259 행의 HierarchicalCollectionView.as를 디버깅하여 검사하십시오.

관련 문제