Как мне ввести свою программу в vb.net чтобы перейти к следующему вопросу после того, как пользователь ответит на вопрос с множественным выбором?

#vb.net

Вопрос:

Я пытаюсь создать программу пересмотра с множественным выбором, но у меня возникли некоторые проблемы с тем, как заставить мою программу генерировать другой вопрос, который я сохранил в базе данных, после того как пользователь ответит на первый сгенерированный вопрос? Может кто-нибудь показать мне пример кода или что-то в этом роде, пожалуйста?

  Imports System.Data.OleDb Public Class QUI  'Define all the variables which are meant to be in use'  Dim ConnectString As String = ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=projectdatabase.accdb")  Dim DataReader As OleDbDataReader  Dim cmd As New OleDbCommand  Dim connection As New OleDbConnection  Dim noofq As Integer  Dim q(noofq) As String  Dim questionnum As Integer  'Asks the user to input a number to d  Private Sub QUI_Load(sender As Object, e As EventArgs) Handles MyBase.Load   'Asks the user to input a number to decide how many questions they want to answer'  noofq = InputBox("Input the number of questions you want. You can choose from 1 to 10.")  'A counter starting from one to the number of questions the user has inputted'  For i = 1 To noofq   Next  'Open the connection to the database'  connection.ConnectionString = ConnectString  connection.Open()  'Sets the question number to one'  questionnum = 1  Label1.Text = "Question " amp; questionnum amp; " of " amp; noofq  'Retrieves the question and answers from the database'  cmd.CommandText = "SELECT question, Answer1, Answer2, Answer3 FROM 1Questions"  cmd.Connection = connection   DataReader = cmd.ExecuteReader  'Assigns the values from the database to each of the labels and buttons'  If DataReader.HasRows Then  DataReader.Read()  Lblquestion.Text = DataReader.Item("Question")  RadioButtonA1.Text = DataReader.Item("Answer1")  RadioButtonA2.Text = DataReader.Item("Answer2")  RadioButtonA3.Text = DataReader.Item("Answer3")    DataReader.Close()  End If  connection.Close()   End Sub   Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btnCheck.Click  If RadioButtonA1.Checked And questionnum = 1 Then  MsgBox("Correct Answer")  Else  MsgBox("Incorrect Answer")  End If  End Sub End Class  

Ответ №1:

В таблице вопросов, если вы добавите столбец, представляющий код вопроса, вы сможете генерировать случайные числа для выбора из вопросов. Также можно добавить такие функции, как не повторять один и тот же вопрос. То есть, если я хорошо понял ваш вопрос

Комментарии:

1. Привет, Фараг, спасибо за ваше предложение, вы предлагаете мне указать идентификатор каждого вопроса и сгенерировать случайный вопрос с помощью этого? Также после того, как пользователь ответит на вопрос, как бы я мог создать другой вопрос?

2. да, это то, что я имею в виду, вам нужно сгенерировать n случайных чисел — необходимое количество вопросов — и сохранить их, например, в списке целых чисел, затем выполнить цикл по этому списку и изменить свой Quary, чтобы он был похож cmd.CommandText = "SELECT question, Answer1, Answer2, Answer3 FROM 1Questions where QsId = '"amp; qlist(i) amp;"'" , и вы можете использовать end sub, когда пользователь выбирает неправильное значение.

3. Хорошо, я понимаю, спасибо

Ответ №2:

Очевидно, вы не последовали моему совету и включили опцию Строгий. Пожалуйста, сделайте это сейчас.

Вот как должна выглядеть ваша таблица базы данных. Столбец QuestionID должен быть с автоматическим номером CorrectAnswer , и столбец должен содержать название переключателя, который будет содержать правильный ответ.

введите описание изображения здесь

Ваша главная проблема заключается в том, что вы извлекли все данные из таблицы 1 вопросов, но прочитали только первую запись. Вам придется снова подключиться к базе данных, чтобы получить еще один вопрос. Это плохая идея.

Мы извлекем все необходимые вам данные и поместим их в DataTable таблицу, которая похожа на таблицу в памяти. Для запуска объекты базы данных будут объявлены и размещены в блоках использования. Это необходимо, чтобы Dispose были вызваны их методы. Вы не объявляете эти объекты вне метода, в котором они используются. Вы можете передать строку подключения непосредственно конструктору Connection и передать CommandText и Connection непосредственно конструктору Command .

Я изменил строку sql, чтобы включить в нее первичный ключ таблицы. Мне пришлось угадать название поля, чтобы изменить его на настоящее имя. Я также добавил поле для правильного ответа. Это, возможно, потребуется добавить в таблицу. Последняя часть строки sql содержит Order By предложение, которое будет возвращать случайные вопросы при каждом ее запуске.

Важным моментом здесь является то, что соединение с базой данных закрыто и удалено. Все данные, которые нам нужны для викторины, есть в DataTable .

Я использовал a BindingSource , чтобы мы могли отображать данные и легко перемещаться по вопросам.

 Private ConStr As String = ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=projectdatabase.accdb") Private intNumOfQuestions As Integer Private questionnum As Integer Private BndScr As BindingSource  Private Sub QUI_Load(sender As Object, e As EventArgs) Handles MyBase.Load  Dim strnoofq = InputBox("Input the number of questions you want. You can choose from 1 to 10.")  If Integer.TryParse(strnoofq, intNumOfQuestions) AndAlso intNumOfQuestions gt; 0 AndAlso intNumOfQuestions lt; 11 Then  Dim dt As New DataTable  Using cn As New OleDbConnection(ConStr),  cmd As New OleDbCommand($"SELECT Top {intNumOfQuestions} QuestionID, Question, Answer1, Answer2, Answer3, CorrectAnswer   FROM 1Questions   ORDER BY Rnd(-Timer()*[QuestionID])", cn)  cn.Open()  Using reader = cmd.ExecuteReader  dt.Load(reader)  End Using  End Using  questionnum = 1  Label1.Text = $"Question {questionnum} of {strnoofq}"  BndScr = New BindingSource()  BndScr.DataSource = dt  Lblquestion.DataBindings.Add("Text", BndScr, "Question")  Lblquestion.DataBindings.Add("Tag", BndScr, "CorrectAnswer")  RadioButtonA1.DataBindings.Add("Text", BndScr, "Answer1")  RadioButtonA2.DataBindings.Add("Text", BndScr, "Answer2")  RadioButtonA3.DataBindings.Add("Text", BndScr, "Answer3")  Else  MessageBox.Show("Please enter valid number Of questions.")  End If End Sub  Private Sub btnNext_Click(sender As Object, e As EventArgs) Handles btnNext.Click  If GetSelectedRadioButton(Me).Name = Lblquestion.Tag.ToString Then  'Correct Answer  Else  'Wrong Answer  End If  If intNumOfQuestions = questionnum Then  'End of quiz  Else  BndScr.MoveNext()  questionnum  = 1  End If End Sub  Public Function GetSelectedRadioButton(Container As Control) As RadioButton  Dim rb = Container.Controls.OfType(Of RadioButton)().FirstOrDefault(Function(r) r.Checked = True)  Return rb End Function  

От вас зависит, как вести счет.