Перебирать вопросы викторины не удается - PullRequest
0 голосов
/ 25 июля 2011

Отредактировано - Я ранее разместил более раннюю версию своего кода, правильный код теперь ниже

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

IndexOutOfRangeException was unhandled
There is no row at position 5

Моя структура таблицы выглядит следующим образом:

Номер вопроса | Вопрос | Ответ 1 | Ответ 2 | Ответ 3 | Ответ 4 | Правильный ответ

Вот мой код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using System.Data.SqlClient;

namespace WindowsFormsApplication1
{
public partial class QuizQuestions : Form
{
    public WindowsAnalysisQuiz()
    {
        InitializeComponent();
    }
    //int questionNumber;
    String correctAnswer;
    private void WindowsAnalysisQuiz_Load(object sender, EventArgs e)
    {
        //declare connection string using windows security
        string cnString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\Hanna\\Desktop\\QuizQuestions.accdb";

        //declare Connection, command and other related objects
        OleDbConnection conGet = new OleDbConnection(cnString);
        OleDbCommand cmdGet = new OleDbCommand();

        //try
        //{
        //open connection
        conGet.Open();
        //String correctAnswer;

        cmdGet.CommandType = CommandType.Text;
        cmdGet.Connection = conGet;

        cmdGet.CommandText = "SELECT * FROM QuizQuestions ORDER BY rnd()"; 

        OleDbDataReader reader = cmdGet.ExecuteReader();

        reader.Read();
        label1.Text = reader["Question"].ToString();
        radioButton1.Text = reader["Answer 1"].ToString(); 
        radioButton2.Text = reader["Answer 2"].ToString();
        radioButton3.Text = reader["Answer 3"].ToString();
        radioButton4.Text = reader["Answer 4"].ToString();
        correctAnswer = reader["Correct Answer"].ToString();
        //questionNumber = 0;

        conGet.Close();

    }

    private void btnNextQuestion_Click(object sender, EventArgs e)
    {

        String cnString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\Hannah\\Desktop\\QuizQuestions.accdb";
        int questionNumber = 0;
        //declare Connection, command and other related objects
        OleDbConnection conGet = new OleDbConnection(cnString);
        OleDbCommand cmdGet = new OleDbCommand();

        //try
        {
            //open connection
            conGet.Open();

            cmdGet.CommandType = CommandType.Text;
            cmdGet.Connection = conGet;

            cmdGet.CommandText = "SELECT * FROM QuizQuestions ORDER BY rnd()"; // select all columns in all rows

            OleDbDataReader reader = cmdGet.ExecuteReader();
            reader.Read();

            String chosenAnswer = "";
            //int chosenCorrectly = 0;
            if (radioButton1.Checked)
            {
                chosenAnswer = reader["Answer 1"].ToString();
            }
            else if (radioButton2.Checked)
            {
                chosenAnswer = reader["Answer 2"].ToString();
            }
            else if (radioButton3.Checked)
            {
                chosenAnswer = reader["Answer 3"].ToString();
            }
            else
            {
                chosenAnswer = reader["Answer 4"].ToString();
            }

            if (chosenAnswer == reader["Correct Answer"].ToString())
            {
                labelQuestion.Text = table.Rows[questionNumber]["Question"].ToString();
                //and show possible answers:
                radioButton1.Text = table.Rows[questionNumber]["Answer 1"].ToString();
                radioButton2.Text = table.Rows[questionNumber]["Answer 2"].ToString();
                radioButton3.Text = table.Rows[questionNumber]["Answer 3"].ToString();
                radioButton4.Text = table.Rows[questionNumber]["Answer 4"].ToString();
                correctAnswer = table.Rows[questionNumber]["Correct Answer"].ToString();
                questionNumber++; //got to next question! 
            }
            else
            {
                MessageBox.Show("That is not the correct answer");
            }
        }

    }
}

}

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

Ответы [ 4 ]

1 голос
/ 25 июля 2011

Я думаю, что ваше начальное значение для questionNumber должно быть 0, так как строки начинаются с нуля, иначе table.Rows[questionNumber] завершится неудачей для последней строки.

0 голосов
/ 10 июня 2014

Вы должны указать компилятору завершиться, если это последняя строка, т.е. вы должны добавить это ..

if (chosenAnswer == reader["Correct Answer"].ToString() && 
    questionNumber <= tables[your table].rows.count()) 
0 голосов
/ 25 июля 2011

Ваш код в btnGoToNextOne_Click безусловно увеличивает инкремент questionNumber (questionNumber ++) при каждом выборе правильного ответа. Когда последний вопрос выбран правильно, индекс questionNumber выходит за пределы диапазона, так что МОЖЕТ быть проблемой где-то еще в вашем коде.

Другой момент заключается в том, что в Form1_Load вы устанавливаете questionNumber = 1, что предполагает, что в вашей базе данных есть как минимум 2 вопроса. Если вы по какой-то причине не зададите значение QuestionNumber равным 1, его, вероятно, следует установить равным 0 (поскольку индексы в C # начинаются с нуля).

Существует также много желаемого, как вы делаете вещи в этом коде, дублированные строки, объекты OleDbX ... X, которые должны быть обернуты с использованием (OleDbX ... X) {}, чтобы они были расположены должным образом; почему таблица DataTable не является локальной переменной, я не знаю ...

0 голосов
/ 25 июля 2011

Вы должны установить начальное значение questionNumber равным 0, поскольку строки начинаются с нуля. И получить количество вопросов в загрузке страницы и установить для него другую переменную как int questionCount, которую вы можете получить с помощью buttonClick.

inbuttonClick изменить questionNumber ++ с questionNumber = (questionNumber ++% questionCount);

он превратится в начало после завершения вопросов.

надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...