2015-11-17 8 views
0

je vais avoir des problèmes à utiliser correctement plusieurs composants RadioButton avec un RadioButtonGroup dans mon application quiz (quand ils sont rendus par ItemRenderer sous DataGridColumn).En utilisant RadioButton avec RadioButtonGroup dans un DataGridColumn (dans une application quiz)

La page quiz affiche une question avec 4 réponses possibles qui représentent par des composants RadioButton (ex aequo avec un RadioButtonGroup unique). Un quiz contient généralement de nombreuses questions à choix multiples.

Tout fonctionne bien jusqu'à ce que je navigue à la question suivante et revenir à la question précédente; alors je pouvais voir mon ancienne sélection de réponse dans le bouton radio bien que lorsque je change ma réponse et sélectionnez un bouton radio différent, il garde ma vieille sélection et d'ajouter le nouveau, ce qui est tout à fait déraisonnable (puisque RadioButtonGroup doit appliquer la sélection d'une option uniquement) .

Voici comment je définis la DataGridColumn:

<mx:DataGrid y="141" height="373" dataProvider="{currentQuestion.answers}" id="answersGrid" visible="false" styleName="NoStyleDataGrid" useRollOver="false" headerHeight="0" width="381" x="461" variableRowHeight="true">   
      <mx:columns>         
      <mx:DataGridColumn width="20" dataField="key"> 
       <mx:itemRenderer> 
         <mx:Component> 
         <mx:Canvas width="100%" height="100%" verticalScrollPolicy="off" horizontalScrollPolicy="off" top="0"> 
          <mx:Script> 
           <![CDATA[ 
            import mx.core.Application; 
           ]]> 
          </mx:Script> 

          <mx:RadioButton id="rb" value="{data.number}" selected="{outerDocument.isSelected(data.number,rb)}" group="{outerDocument.getGroup()}" click="outerDocument.setAnswerState(event,data.number)" width="100%" height="30" x="12" y="0" />         

         </mx:Canvas>          
         </mx:Component> 
       </mx:itemRenderer> 
      </mx:DataGridColumn> 

Je me assure que chaque question a son propre groupe unique de contenir les composants RadioButton (comme réponses) en utilisant ce code:

 public function getGroup():RadioButtonGroup{     
      if(radioGroupMap[currentQuestion.key]!=null){          
       return radioGroupMap[currentQuestion.key] as RadioButtonGroup;          
      }        
      radioGroupMap[currentQuestion.key] = new RadioButtonGroup(); 
      return radioGroupMap[currentQuestion.key] as RadioButtonGroup; 
     } 

Cette Le code fonctionne bien tant que je ne passe pas à la question suivante et que je reviens à la question précédente.

apprécierais toute aide sur cette question.

Merci!

+0

Si vous pouviez afficher la capture d'écran du problème ou ajouter un exemple d'application en cours d'exécution, il serait clair de comprendre votre problème. – gbdcool

+0

Ma première question est pourquoi utilisez-vous un itemrenderers et une grille de données au lieu de conteneurs simples avec radiobuttongroups :) Et deuxième question - quand vous dites "je navigue vers la question suivante et retourne à la question précédente" veux-tu dire défilement de la grille de données? Parce que si c'est le cas, cela arrive probablement parce que les itemrenderers sont réutilisés tout le temps - quand vous faites défiler et qu'un itemrenderer se déconnecte, il n'est pas supprimé mais réutilisé pour de nouveaux éléments. Donc, lorsque vous faites défiler vers le haut et vers le bas, il se peut que vous ayez des éléments de questions précédentes. – Philarmon

+0

Peut-être que je devrais utiliser des conteneurs simples, j'ai d'abord utilisé DataGrid depuis que j'affiche un nombre inconnu de réponses et j'ai besoin de chaque réponse pour contenir le numéro de réponse/lettre, le contenu et l'indication faux/droit. Cela semble être l'utilisation classique de la grille de données. Je peux utiliser d'autres conteneurs bien que je doive dynamiquement construire l'interface utilisateur puisque le nombre de réponses change entre les questions. – Uri

Répondre

0

Après avoir fait quelques recherches, il semble que renderers contenant l'objet RadioButtons ainsi RadioButtonGroup sur la colonne de grille de données ne sont pas un bon choix de conception. Apparemment, plus de moteurs de rendu d'éléments sont créés que réellement nécessaires pour des raisons de performances, ce qui rend l'interface utilisateur imprévisible.

J'ai utilisé VBOX à la place et créé dynamiquement RadioButton avec RadioButtonGroup en utilisant ActionScript. Voici un exemple de code:

  function populateAnswers(){ 
       var rbg:RadioButtonGroup = new RadioButtonGroup(); 
       for each (var ans:Answer in currentQuestion.answers){ 
        var row:HBox = new HBox(); 
        var rb:RadioButton = new RadioButton(); 
        rb.group = rbg; 
        rb.id = ""+ans.number; 
        var num:int = ans.number; 
         rb.addEventListener(MouseEvent.CLICK,setAnswerState); 
       rb.selected = isSelected(ans.number);      
         row.addChild(rb);      

        var answerBoby:Text = new Text(); 
        answerBoby.enabled = false; 
        answerBoby.styleName = "readOnlyTA"; 
        answerBoby.selectable = false; 
        answerBoby.htmlText = ans.body; 
        row.addChild(answerBoby); 
        quizAnswersPanel.addChild(row);      

       }