2016-04-01 5 views
0

私は選択問題の質問に問題があります。私が次と戻るをクリックすると、データベースとは異なる質問は表示されません。ラジオボタンとラベルは、異なる質問や回答を表示するように変更されません。これは混乱している場合はごめんなさい。データベースからデータを取得する多肢選択式のクイズ - 質問を繰り返す問題

コードが

あなたの元のコードでOK
Option Strict On 
Imports System.Data.OleDb 
Public Class Form1 
Dim ConnectString As String = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
    " Data Source= C:\Users\Sales\Documents\Visual Studio 2010\Normalised Database.accdb" 

Dim dr As OleDbDataReader 
Dim cm As New OleDbCommand 
Dim cn As New OleDbConnection 
Dim provider As String 
Dim dataFile As String 
Dim no As Integer 
' Dim q(no) As String 
Dim quesnum As Integer = 1 
Dim answer As String 
Dim selected As String 
Dim score As Integer = 0 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

    no = CInt(InputBox("Input the number of questions you want. You can choose from 1 to 10.")) 
    QuesNo.Hide() 
    QuesLabel.Hide() 
    Label3.Hide() 
    RadioButton1.Hide() 
    RadioButton2.Hide() 
    RadioButton3.Hide() 
    RadioButton4.Hide() 
    NextBtn.Hide() 
    BackBtn.Hide() 
    BackBtn.Hide() 
    SaveBtn.Hide() 
    ReturnBtn.Hide() 

    For i = 1 To no 
     question() 
     mark() 

    Next 

    'End 
End Sub 

Private Sub question() 

    cn.ConnectionString = ConnectString 
    cn.Open() 

    ' quesnum = 0 
    ' quesnum = quesnum + 1 
    QuesNo.Text = "Question " & quesnum & " of " & no 

    cm.CommandText = "SELECT Question, Answer1, Answer2, Answer3, CorrectAnswer FROM Question" 
    cm.Connection = cn 

    dr = cm.ExecuteReader 

    Dim answerList As New List(Of String) 

    If dr.HasRows Then 
     dr.Read() 
     QuesLabel.Text = CStr(dr.Item("Question")) 

     answerList.Add(CStr(dr.Item("Answer1"))) 
     answerList.Add(CStr(dr.Item("Answer2"))) 
     answerList.Add(CStr(dr.Item("Answer3"))) 
     answerList.Add(CStr(dr.Item("CorrectAnswer"))) 
     answerList = RandomizeListOrder(answerList) 
     RadioButton1.Text = answerList(0) 
     RadioButton2.Text = answerlist(1) 
     RadioButton3.Text = answerList(2) 
     RadioButton4.Text = answerlist(3) 
     dr.Close() 
    End If 
    cn.Close() 

End Sub 

Private Sub mark() 
    If RadioButton1.Checked = True Then selected = RadioButton1.Text 
    If RadioButton2.Checked = True Then selected = RadioButton2.Text 
    If RadioButton3.Checked = True Then selected = RadioButton3.Text 
    If RadioButton4.Checked = True Then selected = RadioButton4.Text 


    cn.ConnectionString = ConnectString 
    cn.Open() 
    cm.CommandText = "SELECT CorrectAnswer FROM Question" 
    cm.Connection = cn 
    dr = cm.ExecuteReader 
    If dr.HasRows Then 
     dr.Read() 
     answer = CStr(dr.Item("CorrectAnswer")) 
     dr.Close() 

    End If 
    cn.Close() 

    If selected = answer Then 
     score = score + 1 
    End If 

    ' question() 

    Label3.Text = "score is " & score 

End Sub 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NextBtn.Click 

    For i = 1 To no 
     question() 

     mark() 

    Next 
    quesnum = quesnum + 1 
End Sub 

Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StartBtn.Click 

    QuesNo.Show() 
    QuesLabel.Show() 
    Label3.Show() 
    RadioButton1.Show() 
    RadioButton2.Show() 
    RadioButton3.Show() 
    RadioButton4.Show() 
    NextBtn.Show() 
    BackBtn.Show() 
    SaveBtn.Show() 
    ReturnBtn.Show() 
    StartBtn.Hide() 

End Sub 

Private Function RandomizeListOrder(ByVal answers As List(Of String)) As List(Of String) 

    Dim answer2 As Integer 
    Dim rnd As New Random 
    'loop though each item in the list 
    For answer1 As Integer = 0 To answers.Count - 1 
     'pick a random answer 
     answer2 = rnd.Next(0, answers.Count - 1) 
     'If answer1 and answer2 are the same then skip the rest of the code 
     'in the loop and go onto the next question 
     If answer1 = answer2 Then 
      Continue For 
     End If 
     'swap the questions over 
     Dim temp As String 
     temp = answers(answer1) 
     answers(answer1) = answers(answer2) 
     answers(answer2) = temp 
    Next 
    'return the list of answers 
    Return answers 

End Function 

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BackBtn.Click 

End Sub 
End Class 
+0

次と戻るボタンを使用すると、質問の前後に進むことができます。また、問題サブの周りの2つのループの目的は何ですか?彼らが質問を通してループするのであれば、質問を通過するコードは本当に書き直す必要があります。 –

+0

'次をクリックすると、データベースとは異なる質問は表示されません。 ' - これは問題ではありません。それはタスクです。あなたは自分で時間を費やし、調査し、私たちがあなたを助けるための具体的な技術的な詳細を提供する必要があります。 – Neolisk

+0

また、あなたのSELECTクエリを変更する必要があるかもしれません - 私のプロファイルのアドレスに質問データベースを私にメールすることができますか? –

答えて

1

を下回っている、question()プロシージャに渡される疑い番号はありませんでした。だから、私はそれが存在していてはいけないと、この

If quesnum < no Then 
     quesnum += 1 
End If 
よう markの手順に書き込まれているはずのように私はForm_Loadプロシージャの外の質問ループを削除宣言に...

Private Sub question(quesnum As Integer) 

を変更しました今ではdepen特定の質問を取得するように、私は

cm.CommandText = "SELECT CorrectAnswer FROM Question WHERE QuestionNo = " & quesnum.ToString 

にごquestion手順であなたのクエリコマンドを変更した

変数quesnumを参照してください。

また、mark手順でも、クエリがデータベースから正しい答えを取得したときに、同じ種類の処理を実行しました。

最後に、BackNextボタンのクリックにIf文を追加して、ユーザーが質問の開始または終了を超えられないことを確認しました。

かなりそれだ

OK、しかし問題

  • すべての質問が

  • どのような質問であるかを追跡しているに答えてきたとき、あなたはどのように検出うとしているのカップルはまだ確かにあります答えた? - 現時点では、ユーザーは 質問1に回答し、質問2に進み、質問1に戻ってもう一度答えて、別のポイントをスコアに追加することができます。

  • 最後に、ユーザーがデータベース内の質問の数よりも大きな数字を入力しないようにチェックを追加する必要があります。

楽しんでください - これがすべて役立ちますように。以下は完全なコードです

Imports System.Data.OleDb 
Public Class Form1 
    Dim ConnectString As String = "Provider=Microsoft.ACE.OLEDB.12.0;" & " Data Source= C:\Users\Sales\Documents\Visual Studio 2010\Normalised Database.accdb" 
    Dim dr As OleDbDataReader 
    Dim cm As New OleDbCommand 
    Dim cn As New OleDbConnection 
    Dim provider As String 
    Dim dataFile As String 
    Dim no As Integer 
    Dim q(no) As String 
    Dim quesnum As Integer 
    Dim answer As String 
    Dim selected As String 
    Dim score As Integer 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     no = CInt(InputBox("Input the number of questions you want. You can choose from 1 to 10.")) 
     Label1.Hide() 
     Label2.Hide() 
     Label3.Hide() 
     RadioButton1.Hide() 
     RadioButton2.Hide() 
     RadioButton3.Hide() 
     RadioButton4.Hide() 
     Button1.Hide() 
     Button2.Hide() 
     Button2.Hide() 
     Button3.Hide() 
     Button4.Hide() 
    End Sub 

    Private Sub question(quesnum As Integer) 
     cn.ConnectionString = ConnectString 
     cn.Open() 
     Label1.Text = "Question " & quesnum & " of " & no 
     'your query now selects a specific question number with the addition of WHERE QuestionNo = " & quesnum.ToSring 
     cm.CommandText = "SELECT Question, Answer1, Answer2, Answer3, CorrectAnswer FROM Question WHERE QuestionNo = " & quesnum.ToString 
     cm.Connection = cn 
     dr = cm.ExecuteReader 
     Dim answerList As New List(Of String) 
     If dr.HasRows Then 
      dr.Read() 
      Label2.Text = dr.Item("Question").ToString 
      answerList.Add(dr.Item("Answer1").ToString) 
      answerList.Add(dr.Item("Answer2").ToString) 
      answerList.Add(dr.Item("Answer3").ToString) 
      answerList.Add(dr.Item("CorrectAnswer").ToString) 
      answerList = RandomizeListOrder(answerList) 
      RadioButton1.Text = answerList(0) 
      RadioButton2.Text = answerList(1) 
      RadioButton3.Text = answerList(2) 
      RadioButton4.Text = answerList(3) 
      dr.Close() 
     End If 
     cn.Close() 
    End Sub 

    Private Sub mark() 
     'See the function below 
     selected = CheckedRadioButtonText() 
     cn.ConnectionString = ConnectString 
     cn.Open() 
     'same again here for selecting the correct answer from the correct question 
     cm.CommandText = "SELECT CorrectAnswer FROM Question WHERE QuestionNo = " & quesnum.ToString 
     cm.Connection = cn 
     dr = cm.ExecuteReader 
     If dr.HasRows Then 
      dr.Read() 
      answer = dr.Item("CorrectAnswer").ToString 
      dr.Close() 
     End If 
     cn.Close() 
     'Here is where the point where quesnum is incremented to get ready to load 
     'The next question after the current one has been marked 
     If selected = answer Then score = score + 1 
     MsgBox("score is " & score) 
    End Sub 

    'This function checks all the radio buttons to see which one is checked 
    ' and returns the text of that RadioButton 
    Private Function CheckedRadioButtonText() As String 
     If RadioButton1.Checked Then 
      Return RadioButton1.Text 
     ElseIf RadioButton2.Checked Then 
      Return RadioButton2.Text 
     ElseIf RadioButton3.Checked Then 
      Return RadioButton3.Text 
     Else 
      Return RadioButton4.Text 
     End If 
    End Function 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     mark() 
     'move to next question 
     If quesnum < no Then 
      quesnum += 1 
     End If 
     question(quesnum) 
    End Sub 

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 
    'Move to previous question 
    If quesnum > 1 Then 
     quesnum -= 1 
    End If 
    question(quesnum) 
End Sub 

    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click 
     Label1.Show() 
     Label2.Show() 
     Label3.Show() 
     RadioButton1.Show() 
     RadioButton2.Show() 
     RadioButton3.Show() 
     RadioButton4.Show() 
     Button1.Show() 
     Button2.Show() 
     Button3.Show() 
     Button4.Show() 
     Button5.Hide() 
     'Set the first question from here. 
     quesnum = 1 
     question(quesnum) 
    End Sub 

    Private Function RandomizeListOrder(answers As List(Of String)) As List(Of String) 
     Dim answer2 As Integer 
     Dim rnd As New Random 
     'loop though each item in the list 
     For answer1 As Integer = 0 To answers.Count - 1 
      'pick a random answer 
      answer2 = rnd.Next(0, answers.Count - 1) 
      'If answer1 and answer2 are the same then skip the rest of the code 
      'in the loop and go onto the next question 
      If answer1 = answer2 Then 
       Continue For 
      End If 
      'swap the questions over 
      Dim temp As String 
      temp = answers(answer1) 
      answers(answer1) = answers(answer2) 
      answers(answer2) = temp 
     Next 
     'return the list of answers 
     Return answers 
    End Function 

End Class 
+0

私のマシンでそれを実行し、それは完全に動作します、ありがとう!今も問題を解決するつもりです – Sohs

+0

華麗です!喜んで助けてください。回答トラッキングでブール値の配列を作成し、そこにいくつの質問があるかを知っているときにRedimを使用してサイズを変更するのが最適かもしれません。質問が正しいとマークされている場合は、quesnumをtrueに設定して同じ配列要素を設定し、配列内のいくつの要素が真であるかのスコアを取得します。 –

+0

私は配列を作成するつもりがあると思います。おそらく別の質問を作成したり、ここで助けを求めるかもしれませんが、私はそれを行っていきます。そして、入力がデータベースよりも大きい問題については、入力がデータベースよりも小さい場合を除いて、プログラムが続行されないループを使用しました。また、それぞれのテストで注文が異なるように質問をシャッフルすることも可能だと思いますか? – Sohs

関連する問題