문제

AdvancedDatagrid의 프로그래밍 방식 멀티 열 정렬을해야합니다. 문제는 현재 그리드에서 페이징을 구현하고 있다는 것입니다. 따라서 데이터를 정렬하면 Perticular 페이지 만 정렬됩니다. 따라서 전체 목록을 열 기준별로 정렬해야합니다.

HeaderRelease 이벤트를 시도했지만 정렬 된 데이터를 얻기 위해 서버로 왕복 호출을해야하기 때문에 사용하지 않는다고 생각합니다. 내가 그것을 구현할 수있는 방법이 있습니까? 또한 열 헤더의 오른쪽 위치에 정렬 마커를 표시해야하며 정렬 번호와 방향을 나타냅니다.

'정말 감사합니다

감사 :)

도움이 되었습니까?

해결책

데이터가 PAGED 인 경우 어쨌든 데이터를 검색하려면 서버로 이동해야합니다. 데이터의 일부만이 클라이언트쪽에 저장되는 경우 서버에만 모든 데이터가 있으므로 서버를 정렬하는 것이 좋습니다.

다른 팁

AdvancedDatagrid를 확장하고 Sorthandler를 재정의해야합니다.

public var orderBy:String; 
override protected function sortHandler(event:AdvancedDataGridEvent):void {
     super.sortHandler(event); 
     var arry:Array = [];  
     for each(var o:SortField in collection.sort.fields){
         arry.push(o.name+' '+(o.descending?'DESC':'ASC'));     
     }
     orderBy = arry.join(',');
}

아래 예제에 주어진대로 자신의 사용자 정의 사전 데이터 그라이드를 만듭니다. 정렬 된 열의 배열과 순서가 있습니다. Cutom 이벤트를 보내고이 배열을 전달하십시오. 서버 측 기술은 그에 따라 쿼리를 만들고 결과를 반환합니다.

        import mx.events.CollectionEvent;
        import mx.binding.utils.BindingUtils;
        import mx.collections.SortField;
        import mx.collections.Sort;
        import mx.collections.ArrayCollection;
        import mx.events.AdvancedDataGridEvent;

        private var sortOrder:Boolean = true;
        [Bindable]
        public var headerHt:int = 30;


        [Inspectable(defaultValue="true", type="Boolean", enumeration="true,false", inherit="yes")]
        [Bindable]
        public var allowHeaderWordWrap:Boolean = true;

        public function sortCaseInsensitive(event:AdvancedDataGridEvent):void{
            var genericDataProvider:Object  = this.dataProvider as Object;
            sortOrder = !sortOrder; 
            //genericDataProvider.sort = new Sort();
            if(genericDataProvider.sort == null){
                genericDataProvider.sort = new Sort();
            } 
            var sortField:SortField = new SortField(event.dataField,true,sortOrder);
            switch (event.dataField) {
                  case "assmtId":
                      sortField.numeric = true;
                break;

            }//switch

            //genericDataProvider.sort.fields = [sortField];
            if(genericDataProvider.sort.fields == null){
                genericDataProvider.sort.fields = [sortField];
            }else{
                //if dataField is not already present in sort fields array 
                if(genericDataProvider.sort.fields.indexOf(sortField) != -1){
                    genericDataProvider.sort.fields = genericDataProvider.sort.fields.concat(sortField);
                }
             }
            genericDataProvider.refresh();

                 // Send custom event to server and pass the array of sort to it the server side technology will make dynamic query and return the result
        }//sortCaseInsensitive

    ]]>
</mx:Script>

죄송합니다! 코드의 Inital 부분을 놓쳤습니다 .... 여기 올바른 코드가 있습니다.

<:AdvancedDataGrid headerWordWrap="{allowHeaderWordWrap}"   headerRelease="sortCaseInsensitive(event)" headerHeight="{headerHt}">

    <:Script>
        <[CDATA[
            import mx.events.CollectionEvent;
                import mx.binding.utils.BindingUtils;
                import mx.collections.SortField;
                import mx.collections.Sort;
                import mx.collections.ArrayCollection;
                import mx.events.AdvancedDataGridEvent;

                private var sortOrder:Boolean = true;
                [Bindable]
                public var headerHt:int = 30;


                [Inspectable(defaultValue="true", type="Boolean", enumeration="true,false", inherit="yes")]
                [Bindable]
                public var allowHeaderWordWrap:Boolean = true;

                public function sortCaseInsensitive(event:AdvancedDataGridEvent):void{
                var genericDataProvider:Object  = this.dataProvider as Object;
                        sortOrder = !sortOrder; 
                        //genericDataProvider.sort = new Sort();
                        if(genericDataProvider.sort == null){
                                genericDataProvider.sort = new Sort();
                        } 
                        var sortField:SortField = new SortField(event.dataField,true,sortOrder);
                switch (event.dataField) {
                      case "assmtId":
                      sortField.numeric = true;
                break;

                }//switch

                //genericDataProvider.sort.fields = [sortField];
                if(genericDataProvider.sort.fields == null){
                        genericDataProvider.sort.fields = [sortField];
                }else{
                        //if dataField is not already present in sort fields array 
                        if(genericDataProvider.sort.fields.indexOf(sortField) != -1){
                                genericDataProvider.sort.fields = genericDataProvider.sort.fields.concat(sortField);
                        }
                 }
            genericDataProvider.refresh();

                 // Send custom event to server and pass the array of sort to it the server side technology will make dynamic query and return the result
                }//sortCaseInsensitive

        ]]>
<:Script>
<:AdvancedDataGrid>

정렬 이벤트의 이벤트 우선 순위를 modifiyng 시도해보십시오. 정렬 핸들러를 무시할 필요가 없지만 MXML에서는 할 수 없습니다.

protected function dataGrid_initializeHandler(event:FlexEvent):void {
    dataGrid.addEventListener(AdvancedDataGridEvent.SORT, dataGrid_sortHandler, false, -50);
}

protected function dataGrid_sortHandler(event:FlexEvent):void {
    dataGrid.dataProvider.sort; // now up to date!
}


<mx:AdvancedDataGrid id="dataGrid" initialize="dataGrid_initializeHandler(event)" dataProvider="{model.dataProvider}" />

당신은 또한 볼 수 있습니다 AdvancedDataGridSortItemRenderer 수업. 이것은 정렬 항목 렌더러를 사용자 정의하는 데 도움이됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top