2008-09-30 7 views
3

J'ai un AdvancedDataGrid qui utilise le regroupement de données de client. Tous les groupes ne seront pas au même niveau dans la hiérarchie et les groupes peuvent contenir à la fois des groupes et des membres. Nous avons un rappel de tri, mais il n'est pas appelé, sauf pour les groupes situés à l'extrémité des feuilles. Voir le code ci-dessous pour un exemple - développez tous les groupes, puis cliquez sur la colonne de tri sur "date de naissance" pour obtenir un tri inverse par date de naissance. (Bizarrement, pour une raison insondable, le premier tri ascendant fonctionne.)Comment faire pour trier dans un Flex AdvancedDataGrid - callback n'est pas appelé

Nous n'appelons aucune des données regroupées au même niveau qu'un membre du groupe.

Comment résoudre ce problème?

Merci.

<?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

Salut Shawn, Avez-vous savoir, pourquoi le tri est fonctionne pas dans votre cas?J'essaie de résoudre un problème similaire avec sortCompareFunction, mes données sont similaires aux vôtres: les branches n'ont pas le même ensemble de propriétés que les objets feuilles et le rappel de tri seulement appelé la première fois. Thx, Irene –

Répondre

0

Cela a quelque chose à voir avec la logique de la fonction SortCompareFunction.

Mettez dob:"01/01/1970" pour tous les nœuds de groupe et le tri fonctionne comme prévu, est-ce correct?

+0

Oui, cela fonctionne. Mais dans la solution actuelle, il n'est pas toujours possible d'ajouter le champ à chaque objet. Si je mets un point d'arrêt ou un suivi au rappel de tri, le rappel de tri n'est jamais appelé pour les autres lignes. Par "logique de la fonction SortCompareFunction", faites-vous référence à la fonction SortCompareFunction dans Flex, ou à la fonction de rappel ci-dessus? Je ne peux pas voir quelque chose d'étrange dans la fonction SortCompareFunction ci-dessus qui causerait un problème, sauf si je ne suis pas censé utiliser "hasOwnProperty"? –

2

Il semble que la première ligne contienne des données nulles ou une chaîne vide, et que l'attribut advanceddatagrid est défini pour utiliser des données groupées, la fonction de tri n'est pas appelée.

c'est un peu un hack, oui, mais si vous pouvez mettre dans un irréaliste (disons 1/1/1770), morceau de données constant que vous pourriez insérer au niveau de base de données/lecture de fichier/entrée de données puis utiliser la colonne labelFunction à rendre en tant que null si les données correspondent à cette colonne, cela devrait fonctionner, ou au moins la fonction de tri sera appelée.

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

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

Désolé pour répondre si tard, mais au moins si quelqu'un d'autre essaie de trouver la réponse, ils pourraient le voir.

0

Je ne pense pas que le problème soit lié au tri de données groupées avec des valeurs de chaînes nulles ou vides (qui sont des valeurs parfaitement valides); les docs indiquent clairement que la propriété représentée par dataField doit être une propriété valide sur le dataProvider [item], c'est-à-dire qu'elle doit exister, null ou autre. Alors que je donne mon vote à RaySir, je ne suis pas tout à fait d'accord pour dire que c'est un hack, mais plutôt que vous normalisez vos données, ce que je pense être une excellente couche de présentation.

Voici un exemple retravaillé:

<?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

Bien qu'il ne semble pas être le cas dans cet exemple, une dataField manquante sur une colonne empêchera sorte de se produire. Les systèmes sont exactement tels que décrits, le sortCompareFunction n'est jamais appelé.

Si vous disposez d'un moteur de rendu de colonnes personnalisé qui extrait des champs de ses propres données, il est facile d'ignorer le remplissage d'un attribut dataField. Tout ira bien, dans ce cas, jusqu'à ce que vous alliez trier. Le sortCompareFunction ne sera pas appelé.

Vérifiez en déboggeant HierarchicalCollectionView.as, à la ligne 1259 ou plus, dans sortCanBeApplied.

Questions connexes