How to sort in Flex AdvancedDataGrid - callback not called

I have an AdvancedDataGrid that uses client data grouping. Not all groups will be at the same level in the hierarchy, and groups can contain both groups and members. We have a sort callback, but it is not called, with the exception of groups on a variety of sheets. See the code below for an example — expand all groups, then click the sort column in the date of birth field to get reverse sorting by date of birth. (Oddly enough, for some incomprehensible reason, the first upstream sorting works.)

We do not call any of the data grouped at the same level as a member of the group.

How to fix it?

Thank.

<?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>
+3
source share
4

, , advanceddatagrid , .

, , (, 1/1/1770), , / /, column labelFunction null, , , , .

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

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

, , , , - , .

+2

- SortCompareFunction.

dob:"01/01/1970" , , ?

0

, ( ); docs , , 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

, DataField . , sortCompareFunction .

If you have your own column renderer that pulls fields from data by itself, it's easy to miss filling out the dataField attribute. In this case, everything will work fine until you start sorting. SortCompareFunction will not be called.

Check by debugging HierarchicalCollectionView.as, at line 1259 or so, in sortCanBeApplied.

0
source

Source: https://habr.com/ru/post/1697749/


All Articles