2008-09-21 7 views
0

J'utilise le widget AdvancedDataGrid et je veux que deux colonnes soient des boutons radio, où chaque colonne est son propre RadioButtonGroup. Je pensais avoir tout le mxxml nécessaire, mais je rencontre un problème de comportement étrange. Quand je défile de haut en bas, le bouton change les valeurs! Le bouton sélectionné est désélectionné et les boutons non sélectionnés sont sélectionnés. Quelqu'un at-il une idée de ce bug? Dois-je aller à ce sujet d'une manière différente. - Voici un exemple dépouillé de ce que j'essaie de faire.Création d'une colonne de RadioButtons dans Adobe Flex

<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> 
    <mx:RadioButtonGroup id="leftAxisGrp" /> 
    <mx:RadioButtonGroup id="rightAxisGrp"> 
    <mx:change> 
     <![CDATA[ 
     trace (rightAxisGrp.selection); 
     trace (rightAxisGrp.selection.data.name); 
     ]]> 
    </mx:change> 
    </mx:RadioButtonGroup> 
    <mx:AdvancedDataGrid 
     id="readingsGrid" 
     designViewDataType="flat" 
     height="150" width="400" 
     sortExpertMode="true" 
     selectable="false"> 
    <mx:columns> 
     <mx:AdvancedDataGridColumn 
      headerText="L" width="25" paddingLeft="6" 
      dataField="left" sortable="false"> 
     <mx:itemRenderer> 
      <mx:Component> 
      <mx:RadioButton groupName="leftAxisGrp" /> 
      </mx:Component> 
     </mx:itemRenderer> 
     </mx:AdvancedDataGridColumn> 
     <mx:AdvancedDataGridColumn 
      headerText="R" width="25" paddingLeft="6" 
      dataField="right" sortable="false"> 
     <mx:itemRenderer> 
      <mx:Component> 
      <mx:RadioButton groupName="rightAxisGrp" /> 
      </mx:Component> 
     </mx:itemRenderer> 
     </mx:AdvancedDataGridColumn> 
     <mx:AdvancedDataGridColumn headerText="" dataField="name" /> 
    </mx:columns> 
    <mx:dataProvider> 
     <mx:Array> 
     <mx:Object left="false" right="false" name="Reddish-gray Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Golden-brown Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Northern Rufous Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Sambirano Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Simmons' Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Pygmy Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Brown Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Madame Berthe's Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Goodman's Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Jolly's Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Mittermeier's Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Claire's Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Danfoss' Mouse Lemur" /> 
     <mx:Object left="false" right="false" name="Lokobe Mouse Lemur" /> 
     <mx:Object left="true" right="true" name="Bongolava Mouse Lemur" /> 
     </mx:Array> 
    </mx:dataProvider> 
    </mx:AdvancedDataGrid> 
</mx:WindowedApplication> 

MISE À JOUR (facture merci!)

Très bien! Va travailler. J'ai juste dû faire quelques changements par rapport à la suggestion de Bill. Principalement en utilisant ArrayCollection avec ObjectProxy donc il était à la fois lisible et dynamique. Une chose étrange - je ne pouvais pas sélectionner un bouton dans la première rangée si je remplissais le tableau au moment de la construction; J'ai dû retarder cela jusqu'à ce que l'événement creationComplete ait été déclenché (ce qui est bien, puisque je vais remplir la grille depuis un db de toute façon).

<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> 
    <mx:Script> 
    <![CDATA[ 
     import mx.utils.ObjectProxy; 
     import mx.collections.ArrayCollection; 

     [Bindable] 
     private var myData:ArrayCollection = new ArrayCollection(); 

     private function selectItem (selObject:Object, property:String) : void 
     { 
     for each (var obj:ObjectProxy in myData) { 
      obj[property] = (obj.name === selObject.name); 
     } 
     readingsGrid.invalidateDisplayList(); 
     } 
    ]]> 
    </mx:Script> 
    <mx:RadioButtonGroup id="leftAxisGrp"> 
    <mx:change> 
     <![CDATA[ 
     selectItem (leftAxisGrp.selectedValue, 'left'); 
     ]]> 
    </mx:change> 
    </mx:RadioButtonGroup> 
    <mx:RadioButtonGroup id="rightAxisGrp"> 
    <mx:change> 
     <![CDATA[ 
     selectItem (rightAxisGrp.selectedValue, 'right'); 
     ]]> 
    </mx:change> 
    </mx:RadioButtonGroup> 
    <mx:AdvancedDataGrid 
     id="readingsGrid" 
     designViewDataType="flat" 
     dataProvider="{myData}" 
     sortExpertMode="true" 
     height="150" width="400" 
     selectable="false"> 
    <mx:columns> 
     <mx:AdvancedDataGridColumn id="leftCol" 
      headerText="L" width="25" paddingLeft="6" sortable="false"> 
     <mx:itemRenderer> 
      <mx:Component> 
      <mx:RadioButton groupName="leftAxisGrp" 
       buttonMode="true" value="{data}" selected="{data.left}" /> 
      </mx:Component> 
     </mx:itemRenderer> 
     </mx:AdvancedDataGridColumn> 
     <mx:AdvancedDataGridColumn id="rightCol" 
      headerText="R" width="25" paddingLeft="6" sortable="false"> 
     <mx:itemRenderer> 
      <mx:Component> 
      <mx:RadioButton groupName="rightAxisGrp" 
       buttonMode="true" value="{data}" selected="{data.right}" /> 
      </mx:Component> 
     </mx:itemRenderer> 
     </mx:AdvancedDataGridColumn> 
     <mx:AdvancedDataGridColumn headerText="" dataField="name" /> 
    </mx:columns> 
    <mx:creationComplete> 
     <![CDATA[ 
     myData.addItem(new ObjectProxy ({ left:true, right:true, name:"Golden-brown Mouse Lemur" })); 
     myData.addItem(new ObjectProxy ({ left:false, right:false, name:"Reddish-gray Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Northern Rufous Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Sambirano Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Simmons' Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Pygmy Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Brown Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Madame Berthe's Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Goodman's Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Jolly's Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Mittermeier's Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Claire's Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Danfoss' Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Lokobe Mouse Lemur" })); 
     myData.addItem( new ObjectProxy ({ left:false, right:false, name:"Bongolava Mouse Lemur" }));    
     ]]> 
    </mx:creationComplete> 
    </mx:AdvancedDataGrid> 
</mx:WindowedApplication> 

Répondre

1

En l'occurrence, Flex crée uniquement des instances itemRenderer pour les colonnes visibles. Lorsque vous faites défiler, ces instances sont recyclées. Donc, si vous faites défiler vers le bas, l'objet RadioButton qui dessinait la première colonne de la première rangée peut maintenant avoir changé pour dessiner la première colonne de la septième rangée. Flex réinitialise la propriété "data" de itemRenderer chaque fois que cela se produit.

Alors qu'il y a 15 rangées de données, il n'y a jamais que 12 RadioButtons (6 pour la "gauche", et 6 pour la "droite" pour les 6 rangées visibles), pas 30 RadioButtons, comme on peut s'y attendre. Ce n'est pas un gros problème si vous êtes seulement affichant la sélection, mais cela devient plus un problème lorsque vous autorisez les mises à jour.

Pour résoudre le problème d'affichage, au lieu de définir "dataField" sur la colonne, vous pouvez lier la propriété "selected" du composant RadioButton à la valeur data.left (ou right) de itemRenderer. Vous devrez ensuite créer les éléments dans votre fournisseur de données "Bindable".

Pour résoudre le problème de mise à jour, puisque vous liez directement les valeurs de l'élément dataProvider, vous devez vous assurer de les mettre à jour. Comme il n'y a pas un seul article RadioButton, vous aurez besoin d'un autre schéma pour cela. Dans ce cas, je mets dans un gestionnaire qui va et place la propriété gauche/droite de chaque élément à "faux", sauf pour le "sélectionné", qui est mis à "vrai". J'ai mis à jour votre code d'exemple en fonction de ces pensées.

Essayez quelque chose comme ceci:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application layout="absolute" 
    xmlns:my="*" 
    xmlns:mx="http://www.adobe.com/2006/mxml"> 
    <mx:RadioButtonGroup id="leftAxisGrp" 
     change="selectItem(leftAxisGrp.selectedValue, 'left');"/> 
    <mx:RadioButtonGroup id="rightAxisGrp" 
     change="selectItem(rightAxisGrp.selectedValue, 'right');"> 
    </mx:RadioButtonGroup> 
    <mx:AdvancedDataGrid 
     id="readingsGrid" 
     designViewDataType="flat" 
     height="150" width="400" 
     sortExpertMode="true" 
     selectable="false" 
     dataProvider="{adgData.object}"> 
    <mx:columns> 
     <mx:AdvancedDataGridColumn 
      headerText="L" width="25" paddingLeft="6" 
      sortable="false"> 
     <mx:itemRenderer> 
      <mx:Component> 
      <mx:RadioButton groupName="leftAxisGrp" 
       value="{data}" selected="{data.left}"/> 
      </mx:Component> 
     </mx:itemRenderer> 
     </mx:AdvancedDataGridColumn> 
     <mx:AdvancedDataGridColumn 
      headerText="R" width="25" paddingLeft="6" 
      sortable="false"> 
     <mx:itemRenderer> 
      <mx:Component> 
      <mx:RadioButton groupName="rightAxisGrp" 
       value="{data}" selected="{data.right}"/> 
      </mx:Component> 
     </mx:itemRenderer> 
     </mx:AdvancedDataGridColumn> 
     <mx:AdvancedDataGridColumn headerText="" dataField="name" /> 
    </mx:columns> 
    </mx:AdvancedDataGrid> 
    <mx:Model id="adgData"> 
     <root> 
     <object left="false" right="false" name="Reddish-gray Mouse Lemur" /> 
     <object left="false" right="false" name="Golden-brown Mouse Lemur" /> 
     <object left="false" right="false" name="Northern Rufous Mouse Lemur" /> 
     <object left="false" right="false" name="Sambirano Mouse Lemur" /> 
     <object left="false" right="false" name="Simmons' Mouse Lemur" /> 
     <object left="false" right="false" name="Pygmy Mouse Lemur" /> 
     <object left="false" right="false" name="Brown Mouse Lemur" /> 
     <object left="false" right="false" name="Madame Berthe's Mouse Lemur" /> 
     <object left="false" right="false" name="Goodman's Mouse Lemur" /> 
     <object left="false" right="false" name="Jolly's Mouse Lemur" /> 
     <object left="false" right="false" name="Mittermeier's Mouse Lemur" /> 
     <object left="false" right="false" name="Claire's Mouse Lemur" /> 
     <object left="false" right="false" name="Danfoss' Mouse Lemur" /> 
     <object left="false" right="false" name="Lokobe Mouse Lemur" /> 
     <object left="true" right="true" name="Bongolava Mouse Lemur" /> 
     </root> 
    </mx:Model> 
    <mx:Script> 
    <![CDATA[ 
     private function selectItem(selObject:Object, property:String) : void { 
      for each(var obj:Object in adgData.object) { 
       obj[property] = (obj === selObject); 
      } 
      readingsGrid.invalidateDisplayList(); 
     } 
    ]]> 
    </mx:Script> 
</mx:Application> 
0

Reproduit cette image. Probablement un bug ADG, nous en avons rencontré quelques-uns ici. (N'a pas trouvé celui-ci sur bugs.adobe.com, mais leur recherche est nulle). Vous pouvez essayer Flex 3.0.3, ou un here de nuit (avertissement, peut être assez cassé), et voir si ils l'ont corrigé, ou vous pourriez essayer d'implémenter un moteur de rendu personnalisé, mais c'est une aller droit.

Questions connexes