2017-01-15 7 views
0

私は運転免許証テストを作成しています。ユーザは回答を入力し、次に格付け試験が表示されるように第2のフォームをロードする。私はstrExamAnswer()と呼ばれるユーザーの回答を保持するために配列を使用しています。strCorrectAnswerArray()というテスト回答を保持する配列もあります。私は2つを一緒にチェックして、ユーザーが正解を入力したかどうかを確認するループを作成しました。ループデータを追加して、ラベルに「正解」または「間違っている」を挿入します。私はstrResults()と呼ばれる配列を作成して、ループが循環するたびに各ラベルを埋めようとしました。私は20種類のIF THENステートメントでこれをやりたいとは思わない。出力ラベルを入力し、テスト回答と一致する各出力ラベルに変更するにはどうすればよいですか?私は両方のフォームのスクリーンショットを添付しています。 GradedExamフォームは、ユーザーの回答に応じて「正解」または「間違った」という単語を入力する必要があります。ラベル出力に配列を取り込む方法

Drivers License Exam Form Graded Exam Form - Trying to populate the Results column

'Option Strict ON 
Option Strict On 

Public Class DriverLicenseExam 


    Dim strCorrectAnswerArray() As String = {"B", "D", "A", "A", "C", "A", "B", "A", "C", "D", "B", "C", "D", "A", "D", "C", "C", "B", "D", "A"} 'Array to hold answer inputs 
    Dim strExamAnswer(19) As String 'Array to hold user input answer 
    Dim strResults() As String 'Array to fill output labels with "Correct" or "Incorrect" 

Private Sub Get_Answer() 'Fill strExamArray with user's test answers 
    strExamAnswer(0) = UCase(Me.txtAns1.Text) 
    strExamAnswer(1) = UCase(Me.txtAns2.Text) 
    strExamAnswer(2) = UCase(Me.txtAns3.Text) 
    strExamAnswer(3) = UCase(Me.txtAns4.Text) 
    strExamAnswer(4) = UCase(Me.txtAns5.Text) 
    strExamAnswer(5) = UCase(Me.txtAns6.Text) 
    strExamAnswer(6) = UCase(Me.txtAns7.Text) 
    strExamAnswer(7) = UCase(Me.txtAns8.Text) 
    strExamAnswer(8) = UCase(Me.txtAns9.Text) 
    strExamAnswer(9) = UCase(Me.txtAns10.Text) 
    strExamAnswer(10) = UCase(Me.txtAns11.Text) 
    strExamAnswer(11) = UCase(Me.txtAns12.Text) 
    strExamAnswer(12) = UCase(Me.txtAns13.Text) 
    strExamAnswer(13) = UCase(Me.txtAns14.Text) 
    strExamAnswer(14) = UCase(Me.txtAns15.Text) 
    strExamAnswer(15) = UCase(Me.txtAns16.Text) 
    strExamAnswer(16) = UCase(Me.txtAns17.Text) 
    strExamAnswer(17) = UCase(Me.txtAns18.Text) 
    strExamAnswer(18) = UCase(Me.txtAns19.Text) 
    strExamAnswer(19) = UCase(Me.txtAns20.Text) 

End Sub 

Private Sub Display_Answer() 'Fill strResult 
    Dim frmGradedExam As New GradedExam 

    frmGradedExam.lblResult1.Text = strResults(0) 
    frmGradedExam.lblResult2.Text = strResults(1) 
    frmGradedExam.lblResult3.Text = strResults(2) 
    frmGradedExam.lblResult4.Text = strResults(3) 
    frmGradedExam.lblResult5.Text = strResults(4) 
    frmGradedExam.lblResult6.Text = strResults(5) 
    frmGradedExam.lblResult7.Text = strResults(6) 
    frmGradedExam.lblResult8.Text = strResults(7) 
    frmGradedExam.lblResult9.Text = strResults(8) 
    frmGradedExam.lblResult10.Text = strResults(9) 
    frmGradedExam.lblResult11.Text = strResults(10) 
    frmGradedExam.lblResult12.Text = strResults(11) 
    frmGradedExam.lblResult13.Text = strResults(12) 
    frmGradedExam.lblResult14.Text = strResults(13) 
    frmGradedExam.lblResult15.Text = strResults(14) 
    frmGradedExam.lblResult16.Text = strResults(15) 
    frmGradedExam.lblResult17.Text = strResults(16) 
    frmGradedExam.lblResult18.Text = strResults(17) 
    frmGradedExam.lblResult19.Text = strResults(18) 
    frmGradedExam.lblResult20.Text = strResults(19) 

End Sub 

Private Sub btnSubmit_Click(sender As Object, e As EventArgs) Handles btnSubmit.Click 
    Dim frmGradedExam As New GradedExam 


    Call Get_Answer() 

    For i = 0 To strExamAnswer.Length 
      If strExamAnswer(i) = strCorrectAnswerArray(i) Then 

       strResults(i) = "Correct" 
      Else 
       strResults(i) = "Incorrect" 
      End If 

     Next 

独自の配列に各ラベルを入れてみました。これはまだ機能していません。プログラムは動作しますが、GradeExamフォームが読み込まれると、ラベルには表示されません。各ラベルはフォーム上でまだ空白です。

Dim frmGradedExam As New GradedExam 
Dim strCorrectAnswerArray() As String = {"B", "D", "A", "A", "C", "A", "B", "A", "C", "D", "B", "C", "D", "A", "D", "C", "C", "B", "D", "A"} 'Array to hold answer inputs 
Dim strExamAnswer(19) As String 'Array to hold user input answer 
Dim strResults() As String = {frmGradedExam.lblResult1.Text, frmGradedExam.lblResult2.Text, frmGradedExam.lblResult3.Text, frmGradedExam.lblResult4.Text, 
    frmGradedExam.lblResult5.Text, frmGradedExam.lblResult6.Text, frmGradedExam.lblResult7.Text, frmGradedExam.lblResult8.Text, 
    frmGradedExam.lblResult9.Text, frmGradedExam.lblResult10.Text, frmGradedExam.lblResult11.Text, frmGradedExam.lblResult12.Text, 
    frmGradedExam.lblResult13.Text, frmGradedExam.lblResult14.Text, frmGradedExam.lblResult15.Text, frmGradedExam.lblResult16.Text, 
    frmGradedExam.lblResult17.Text, frmGradedExam.lblResult18.Text, frmGradedExam.lblResult19.Text, frmGradedExam.lblResult20.Text} 
+0

をOOP時代に1が一つの場所で一緒にできるだけQ、および正しい答えを格納するためのクラスを検討するのではなくかもしれませんここにさまざまな配列で。 – Plutonix

+1

私は@Plutonixに同意しますが、尋ねられた質問に答えるには、 'Label'コントロールを配列に入れて、複数の配列の同じインデックスの要素にアクセスするために' For'ループを使います。あなたのループカウンタが 'i'ならば、そのインデックスのある配列の答えにアクセスし、別の配列の同じインデックスの正しい答えと比較し、同じインデックスに' Label'の 'Text'をセットすることができます3番目の配列に格納します。 – jmcilhinney

+0

答えを保持している2つの配列とユーザーの入力が正常に動作しています。私の問題は、各ループ(lblResult1、lblResult2、ect ..)に "正しい"か "不正な"配列の各位置をチェックするように各lableを取得する方法です。ForループがstrExamAnswer(0)をstrCorrectAnswerArray(0) strExamAnswer(1)とstrCorrectAnswer(1)をチェックするときにlblResult1のラベルに "correct"または "Incorrect"を表示してからループサイクルをlblResult2にする必要があります。 –

答えて

1

私は文字列の配列と ラベル配列の違いを理解していないごめんなさい。ラベル配列を作成する構文は何ですか?あなたの宣言で

LabelからStringからの変更、および.Textを削除します。

だから、これを変更します。これに

Dim strResults() As String = {frmGradedExam.lblResult1.Text, frmGradedExam.lblResult2.Text, frmGradedExam.lblResult3.Text, frmGradedExam.lblResult4.Text, 
    frmGradedExam.lblResult5.Text, frmGradedExam.lblResult6.Text, frmGradedExam.lblResult7.Text, frmGradedExam.lblResult8.Text, 
    frmGradedExam.lblResult9.Text, frmGradedExam.lblResult10.Text, frmGradedExam.lblResult11.Text, frmGradedExam.lblResult12.Text, 
    frmGradedExam.lblResult13.Text, frmGradedExam.lblResult14.Text, frmGradedExam.lblResult15.Text, frmGradedExam.lblResult16.Text, 
    frmGradedExam.lblResult17.Text, frmGradedExam.lblResult18.Text, frmGradedExam.lblResult19.Text, frmGradedExam.lblResult20.Text} 

を:私もlblResultsstrResultsから名前を変更し

Dim lblResults() As Label = {frmGradedExam.lblResult1, frmGradedExam.lblResult2, frmGradedExam.lblResult3, frmGradedExam.lblResult4, 
    frmGradedExam.lblResult5, frmGradedExam.lblResult6, frmGradedExam.lblResult7, frmGradedExam.lblResult8, 
    frmGradedExam.lblResult9, frmGradedExam.lblResult10, frmGradedExam.lblResult11, frmGradedExam.lblResult12, 
    frmGradedExam.lblResult13, frmGradedExam.lblResult14, frmGradedExam.lblResult15, frmGradedExam.lblResult16, 
    frmGradedExam.lblResult17, frmGradedExam.lblResult18, frmGradedExam.lblResult19, frmGradedExam.lblResult20} 

注意を!

 If strExamAnswer(i) = strCorrectAnswerArray(i) Then 
      lblResults(i).Text = "Correct" 
     Else 
      lblResults(i).Text = "Incorrect" 
     End If 
+0

'strResults'がどこに宣言されているかを調べると、フォームレベルのvarなので、そこで初期化することはできません。まだ作成されていません。 – Plutonix

+0

このソリューションは、 "正しい"または "不正な"テキスト値を各frmGradedExam.lblResultに入れますが、ロード時にフォームに表示されません。 –

+1

Gotcha ...配列を宣言しますが、Load()イベントで実際の値を指定します。しかし、私はあなたが 'Dim frmGradedExam As New GradedExam'をコード全体に盛り込んでいるので、** Form Reference **の問題もここにあると思います。ほとんどの場合、表示されていないフォームを更新している可能性があります。 –

0

私は本当にあなたのアプローチに同意しないが、ここであなたがあなたの元の試みを使用してそれを行うことができる方法である:

最後に、ラベルを設定するために、あなたのコードでは、.Textプロパティにアクセスします。 btnSubmit_Click()では、 "frmGradedExam"というGradedExamのインスタンスを作成した後、Display_Answer()サブに渡して、作成したばかりのインスタンスで作業しています。必要に応じてだから我々は、フォームのインスタンスを作成し、それを周りに渡す:

Public Class DriverLicenseExam 

    Dim strCorrectAnswerArray() As String = {"B", "D", "A", "A", "C", "A", "B", "A", "C", "D", "B", "C", "D", "A", "D", "C", "C", "B", "D", "A"} 'Array to hold answer inputs 
    Dim strExamAnswer(19) As String 'Array to hold user input answer 
    Dim strResults(19) As String 'Array to fill output labels with "Correct" or "Incorrect" 

    Private Sub btnSubmit_Click(sender As Object, e As EventArgs) Handles btnSubmit.Click 
     Dim frmGradedExam As New GradedExam 

     Dim lblResults() As Label = {frmGradedExam.lblResult1, frmGradedExam.lblResult2, frmGradedExam.lblResult3, frmGradedExam.lblResult4, 
      frmGradedExam.lblResult5, frmGradedExam.lblResult6, frmGradedExam.lblResult7, frmGradedExam.lblResult8, 
      frmGradedExam.lblResult9, frmGradedExam.lblResult10, frmGradedExam.lblResult11, frmGradedExam.lblResult12, 
      frmGradedExam.lblResult13, frmGradedExam.lblResult14, frmGradedExam.lblResult15, frmGradedExam.lblResult16, 
      frmGradedExam.lblResult17, frmGradedExam.lblResult18, frmGradedExam.lblResult19, frmGradedExam.lblResult20} 

     Call Get_Answer() 

     For i = 0 To strExamAnswer.GetUpperBound(0) 
      If strExamAnswer(i) = strCorrectAnswerArray(i) Then 
       strResults(i) = "Correct" 
      Else 
       strResults(i) = "Incorrect" 
      End If 
     Next 

     Display_Answer(frmGradedExam) ' pass the instance of GradedExam we created in this sub to Display_Answer() 
     frmGradedExam.Show() 
    End Sub 

    Private Sub Get_Answer() 'Fill strExamArray with user's test answers 
     strExamAnswer(0) = UCase(Me.txtAns1.Text) 
     strExamAnswer(1) = UCase(Me.txtAns2.Text) 
     strExamAnswer(2) = UCase(Me.txtAns3.Text) 
     strExamAnswer(3) = UCase(Me.txtAns4.Text) 
     strExamAnswer(4) = UCase(Me.txtAns5.Text) 
     strExamAnswer(5) = UCase(Me.txtAns6.Text) 
     strExamAnswer(6) = UCase(Me.txtAns7.Text) 
     strExamAnswer(7) = UCase(Me.txtAns8.Text) 
     strExamAnswer(8) = UCase(Me.txtAns9.Text) 
     strExamAnswer(9) = UCase(Me.txtAns10.Text) 
     strExamAnswer(10) = UCase(Me.txtAns11.Text) 
     strExamAnswer(11) = UCase(Me.txtAns12.Text) 
     strExamAnswer(12) = UCase(Me.txtAns13.Text) 
     strExamAnswer(13) = UCase(Me.txtAns14.Text) 
     strExamAnswer(14) = UCase(Me.txtAns15.Text) 
     strExamAnswer(15) = UCase(Me.txtAns16.Text) 
     strExamAnswer(16) = UCase(Me.txtAns17.Text) 
     strExamAnswer(17) = UCase(Me.txtAns18.Text) 
     strExamAnswer(18) = UCase(Me.txtAns19.Text) 
     strExamAnswer(19) = UCase(Me.txtAns20.Text) 
    End Sub 

    Private Sub Display_Answer(ByVal frmGradedExam As GradedExam) 
     ' do NOT create another instance of GradedExam in here! 
     frmGradedExam.lblResult1.Text = strResults(0) 
     frmGradedExam.lblResult2.Text = strResults(1) 
     frmGradedExam.lblResult3.Text = strResults(2) 
     frmGradedExam.lblResult4.Text = strResults(3) 
     frmGradedExam.lblResult5.Text = strResults(4) 
     frmGradedExam.lblResult6.Text = strResults(5) 
     frmGradedExam.lblResult7.Text = strResults(6) 
     frmGradedExam.lblResult8.Text = strResults(7) 
     frmGradedExam.lblResult9.Text = strResults(8) 
     frmGradedExam.lblResult10.Text = strResults(9) 
     frmGradedExam.lblResult11.Text = strResults(10) 
     frmGradedExam.lblResult12.Text = strResults(11) 
     frmGradedExam.lblResult13.Text = strResults(12) 
     frmGradedExam.lblResult14.Text = strResults(13) 
     frmGradedExam.lblResult15.Text = strResults(14) 
     frmGradedExam.lblResult16.Text = strResults(15) 
     frmGradedExam.lblResult17.Text = strResults(16) 
     frmGradedExam.lblResult18.Text = strResults(17) 
     frmGradedExam.lblResult19.Text = strResults(18) 
     frmGradedExam.lblResult20.Text = strResults(19) 
    End Sub 

End Class 
関連する問題