2011-01-27 3 views
0

以下は私のコードです。これはまだ進行中です。そのため、空のコンテンツを持つ関数がいくつか表示されます。さらに、これが私の最初のFlexアプリケーションです。私と一緒に抱きしめてください。Flexで動的に生成されるラジオボタンとチェックボックスのユーザー選択を確認するにはどうすればよいですか?

これは、ColdFusion Webサービスから各質問に質問と回答を得るクイズアプリケーションです。 TrueまたはFalseの3種類の質問、1つの選択肢を持つ複数の選択肢、複数の選択肢を持つ複数の選択肢があります。したがって、質問タイプに基づいて、アプリケーションは、ユーザーが選択するための適切な量のラジオボタンまたはチェックボックスを動的に生成します。私はこれらの仕事を得た。私が抱えている問題は、ユーザーが実際に何を選択したかを確認する方法がわかりません。他のフォーラムや他のWebサイトの記事では、event.currentTarget.selectedValueを使用してユーザーの選択を取得できると述べています。しかし、実際に実行すると、「selectedValueプロパティがmx.controls.FormItemに見つかりません。既定値がありません」というランタイムエラーが発生しました。私の質問は、ユーザーの選択をキャプチャするために何をする必要がありますか?事前に

おかげで、

モンテ

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx" 
    creationComplete="initVars()"> 
    <fx:Declarations>  
     <s:RemoteObject id="CFCertService" destination="ColdFusion" source="CFCertExam.cfquiz"> 
     <s:method name="returnQuestions" result="resultHandler(event)"/> 
     <s:method name="returnAnswers" result="answerHandler(event)"/> 
     </s:RemoteObject> 
    </fx:Declarations> 
    <fx:Script> 
     <![CDATA[ 
      import mx.collections.ArrayCollection; 
      import mx.containers.FormItem; 
      import mx.controls.Alert; 
      import mx.controls.CheckBox; 
      import mx.controls.RadioButton; 
      import mx.rpc.events.ResultEvent; 
      import mx.rpc.remoting.RemoteObject; 

      [Bindable] 
      private var questionArray:ArrayCollection; 
      private var questionType:String; 
      private var answerItem:FormItem; 

      [Bindable] 
      private var currentQuestionCounter:int; 

      [Bindable] 
      private var answerArray:ArrayCollection; 
      private var myOptionButton:RadioButton = new RadioButton(); 
      private var myOptionButton2:RadioButton = new RadioButton(); 

      private function initVars():void { 
       currentQuestionCounter = 0; 
       btnPrev.enabled = false; 
       btnNext.enabled = false; 
      } 

      private function answerHandler(event:ResultEvent):void { 
       answerArray = event.result as ArrayCollection; 
       var i:int; 
       answerForm.removeAllChildren(); 
       answerItem = new FormItem(); 
       answerForm.addChild(answerItem); 

       switch (questionType) { 
        case "True or False": 
        { 
          myOptionButton.label = "True"; 
          if (answerArray.getItemAt(0).Answer_Choice == "True") { 
           myOptionButton.value = 1; 
          } else { 
           myOptionButton.value = 0; 
          } 


          answerItem.addChild(myOptionButton);        

          myOptionButton2.label = "False";    
          if (answerArray.getItemAt(0).Answer_Choice == "False") { 
           myOptionButton2.value = 1; 
          } else { 
           myOptionButton2.value = 0; 
          } 
          answerItem.addChild(myOptionButton2);      
          answerItem.addEventListener(MouseEvent.CLICK, selectionHandler);        
          break; 
        } 

        case "Multiple Choice (Single Selection)": 
        { 
         for (i=0; i<answerArray.length; i++) { 
          var myOptionButton1:RadioButton = new RadioButton(); 
          myOptionButton1.label = answerArray.getItemAt(i).Answer_Choice; 
          if (answerArray.getItemAt(i).Corect_Flag == "1") { 
           myOptionButton1.value = 1; 
          } else { 
           myOptionButton1.value = 0; 
          }       
          answerItem.addChild(myOptionButton1);       
         } 
         break; 
        } 

        case "Multiple Choice (Multiple Selection)": 
        { 
         for (i=0; i<answerArray.length; i++) { 
          var myCheckBox:CheckBox = new CheckBox(); 
          myCheckBox.label = answerArray.getItemAt(i).Answer_Choice;    
          answerItem.addChild(myCheckBox);        
         } 
         break; 
        } 
       } 

       answerForm.x = 380; 
       answerForm.y = 200; 
      } 

      private function selectionHandler(event:MouseEvent):void { 
       Alert.show(event.currentTarget.toString()); 
      } 

      private function resultHandler(event:ResultEvent):void { 
       questionArray = event.result as ArrayCollection; 

       txt1Questions.htmlText = questionArray.getItemAt(currentQuestionCounter).Question_Text; 
       questionType = questionArray.getItemAt(currentQuestionCounter).Question_Type; 
       btnNext.enabled = true; 
       CFCertService.returnAnswers(questionArray.getItemAt(currentQuestionCounter).Question_ID); 
      } 

      private function buttonEventHandler():void { 
       CFCertService.returnQuestions(); 
       btnStartExam.enabled = false; 
      } 

      private function btnPrevEventHandler():void { 
       currentQuestionCounter--; 
       if (currentQuestionCounter == 0) { 
        btnPrev.enabled = false; 
       } 
       if (currentQuestionCounter < questionArray.length) { 
        btnNext.enabled = true; 
       } 
       txt1Questions.htmlText = questionArray.getItemAt(currentQuestionCounter).Question_Text; 
       questionType = questionArray.getItemAt(currentQuestionCounter).Question_Type; 
       CFCertService.returnAnswers(questionArray.getItemAt(currentQuestionCounter).Question_ID); 

      } 

      private function answerReturnHandler(questionIndex:int):void { 
      } 

      private function btnNextEventHandler():void { 
       currentQuestionCounter++; 

       if (currentQuestionCounter > 0) { 
        btnPrev.enabled = true; 
       } 
       if (currentQuestionCounter >= (questionArray.length - 1)) { 
        btnNext.enabled = false; 
       } 
       txt1Questions.htmlText = questionArray.getItemAt(currentQuestionCounter).Question_Text; 
       questionType = questionArray.getItemAt(currentQuestionCounter).Question_Type; 
       CFCertService.returnAnswers(questionArray.getItemAt(currentQuestionCounter).Question_ID); 

      } 
     ]]> 
    </fx:Script> 

    <mx:Text id="txt1Questions" x="129" y="124"/> 
    <s:Button id="btnStartExam" label="Start Exam" click="buttonEventHandler()" x="370" y="54"/> 

    <mx:Form id="answerForm"/> 
    <s:Button x="129" y="436" label="Previous" id="btnPrev" click="btnPrevEventHandler()" enabled="false"/> 
    <s:Button x="642" y="436" label="Next" id="btnNext" click="btnNextEventHandler()" enabled="false"/> 

</s:Application> 
+2

コードは常にコードとしてフォーマットする必要があります。それ以外の場合は、XMLタグはまったく表示されません。 {}ボタンを使用するか、4つのスペースをインデントします。また、プログラム全体を貼り付けるだけで、答えが得られない可能性があります。あなたの質問を、問題に関連するコードの行に絞ってください。あなたが求めていることを理解するためにソフトウェアを再作成する必要はありません。 – weltraumpirat

+0

コードサンプルアイコンをクリックしてコードを貼り付けました。代わりに他のアイコンをクリックする必要がありますか?そして、プログラム全体を貼り付ける限り、それは遅く、私は考えていませんでした。申し訳ありません。 –

答えて

1

あなたのコードに問題があることcurrentTarget参照あなたはラジオボタンのFormItemにしていない追加されたイベントリスナーには、追加UIComponentです。

二つのオプション

  1. あなたはFormItemのにイベントリスナーを追加し続けたい場合は、実際のアイテムへの参照を取得するためにtargetの代わりcurrentTargetを使うべきではなくUIComponentですよりも、クリックされましたその上にリスナーと一緒に。ただし、LabelItem、RichTextなどの他のアイテムをFormItemに追加すると、これらのアイテムがクリックされたときにイベントリスナーをトリガーすることにも注意してください。

  2. もう1つのオプションは、各ラジオボタンにイベントリスナー(すべてはselectionHandlerを使用できます)を追加し、次にcurrentTargetが正常に動作するようにすることです。

また、あなただけの単一選択できるよう、これらの質問のためRadioButtonGroupを使用する場合があります。次に、RadioButtonGroupのEvent.CHANGEを使用してselectionHandlerをトリガーするだけで済みます。

追加のリソース

週連続でのFlexからvideo on event bubblingをチェックしてください。

+0

ありがとうございました。あなたのアドバイスごとに、RadioButtonGroupとEvent.Changeを使用してイベントハンドラをトリガーしています。物事はよく見えている! –

関連する問題