Как сортировать в Flex AdvancedDataGrid - обратный вызов не вызывается - PullRequest
3 голосов
/ 01 октября 2008

У меня есть 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>

Ответы [ 4 ]

2 голосов
/ 10 сентября 2009

Похоже, что в первой строке содержатся нулевые данные или пустая строка, а параметр advanceddatagrid настроен на использование сгруппированных данных, тогда функция сортировки не вызывается.

это немного хак, да, но если вы можете вставить нереалистичный (скажем, 1/1/1770) постоянный фрагмент данных, который вы можете вставить на уровне чтения базы данных / файла / ввода данных, используйте Столбец 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 голосов
/ 17 октября 2013

Хотя в данном примере это не так, отсутствующее поле данных в столбце предотвратит сортировку. Системы в точности соответствуют описанию, функция sortCompareFunction никогда не вызывается.

Если у вас есть настраиваемое средство визуализации столбцов, которое самостоятельно извлекает поля из данных, легко пропустить заполнение атрибута dataField. В этом случае все будет работать нормально, пока вы не приступите к сортировке. Функция sortCompareFunction не будет вызываться.

Проверка путем отладки HierarchicalCollectionView.as, в строке 1259 или около того, в sortCanBeApplied.

0 голосов
/ 16 марта 2011

Я не думаю, что проблема заключается в сортировке сгруппированных данных с нулевыми или пустыми строковыми значениями (которые являются абсолютно допустимыми значениями); В документах четко указано, что свойство, представленное dataField, должно быть допустимым свойством в dataProvider [item], то есть оно должно существовать, быть нулевым или нет.

Хотя я и отдаю свой голос 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 голосов
/ 01 октября 2008

Это как-то связано с логикой функции SortCompare.

Поставьте dob:"01/01/1970" для всех групповых узлов, и сортировка работает, как и ожидалось, верно?

...