Программа-тест. Реализовать выбор файла с вопросами, используя CheckBox
Я пишу программу тестер. Суть программы в следующем, она считывает вопросы и варианты ответов из xml файла и выводит их на экран, пользователь отвечает на вопросы и в конце программа дает окончательный подсчет правильных ответов.
Программа написана, единственный не понятный момент: файл теста описан в коде программы:
Код:
fpath = Application.StartupPath + "\\";
fname = "eco.xml";
fname = "eco.xml";
При выборе checkBox1 - 1 вариант, при выборе 2-го чекбокса - 2ой вариант и т.д.
Код программы:
Код:
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;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
string fpath; // путь к файлу теста
string fname; // файл теста
// XmlReader обеспечивает чтение данных xml-файла
System.Xml.XmlReader xmlReader;
string qw; // вопрос
// варианты ответа
string[] answ = new string[4];
int right; // правильный ответ (номер)
int otv; // выбранный ответ (номер)
int aq; // общее количество вопросов
int n; // количество правильных ответов
int nv; // общее количество вопросов
int mode; // состояние программы:
// 0 - начало работы;
// 1 - тестирование;
// 2 - завершение работы
// конструктор формы
// (см. также Program.cs )
public Form1(string[] args){
InitializeComponent();
radioButton1.Visible = false;
radioButton2.Visible = false;
radioButton3.Visible = false;
radioButton4.Visible = false;
// имя файла теста должно быть указано
// в качестве парамета команды запуска программы
if (args.Length == 0)
{
// указано только имя файла теста
switch(mode){
case 0: checkBox1.Checked = true;
fpath = Application.StartupPath + "\\";
fname = "eco.xml";
break;
case 1: checkBox2.Checked = true;
fpath = Application.StartupPath + "\\";
fname = "ec.xml";
break;
case 2: this.Close();
break;
}
try
{
// получаем доступ к xml-документу
xmlReader = new System.Xml.XmlTextReader(fpath + fname);
xmlReader.Read();
mode = 0;
n = 0;
// загрузить заголовок теста
this.showHead();
/*загрузить количество вопросов
this.showNumber();*/
// загрузить описание теста
this.showDescription();
}
catch (Exception exc)
{
label1.Text = "Ошибка доступа к файлу " +
fpath + fname;
MessageBox.Show("Ошибка доступа к файлу.\n" +
fpath + fname + "\n",
"Экзаменатор",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
mode = 2;
}
}
else
{
label1.Text =
"Файл теста необходимо указать " +
"в команде запуска программы.\n" +
"Например: 'exam economics.xml' " +
"или 'exam c:\\spb.xml'.";
mode = 2;
}
}
// выводит название (заголовок) теста
private void showHead()
{
// ищем узел <head>
do xmlReader.Read();
while (xmlReader.Name != "head");
// считываем заголовок
xmlReader.Read();
// вывести название теста в заголовок окна
this.Text = xmlReader.Value;
// выходим из узла <head>
xmlReader.Read();
button1.Text = "Начать";
}
//фамилия и группа
private void addText()
{
textBox1.Visible = true;
textBox2.Visible = true;
}
// выводит описание теста
private void showDescription()
{
// ищем узел <description>
do
xmlReader.Read();
while (xmlReader.Name != "description");
// считываем описание теста
xmlReader.Read();
// выводим описание теста
label1.Text = xmlReader.Value;
// выходим из узла <description>
xmlReader.Read();
// ищем узел вопросов <qw>
do
xmlReader.Read();
while (xmlReader.Name != "qw");
// входим внутрь узла
xmlReader.Read();
}
/*private void showNumber()
{
// ищем узел <aq>
do
xmlReader.Read();
while (xmlReader.Name != "aq");
// считываем описание теста
xmlReader.Read();
// выводим описание теста
label2.Text = xmlReader.Value;
// выходим из узла <aq>
xmlReader.Read();
}*/
// читает вопрос из файла теста
private Boolean getQw()
{
// считываем тэг <q>
xmlReader.Read();
textBox1.ReadOnly = true;
textBox2.ReadOnly = true;
button1.Text = "Далее";
/*this.showNumber();*/
if (xmlReader.Name == "q")
{
// здесь прочитан тэг <q>,
// атрибут text которого содержит вопрос, а
// атрибут src - имя файла иллюстрации.
// извлекаем значение атрибутов
qw = xmlReader.GetAttribute("text");
//pic = xmlReader.GetAttribute("src");
//if (!pic.Equals(string.Empty)) pic = fpath + pic;
// входим внутрь узла
xmlReader.Read();
int i = 0;
// считываем данные узла вопроса <q>
while (xmlReader.Name != "q")
{
xmlReader.Read();
// варианты ответа
if (xmlReader.Name == "a")
{
// запоминаем правильный ответ
if (xmlReader.GetAttribute("right") == "yes")
right = i;
// считываем вариант ответа
xmlReader.Read();
if (i < 4) answ[i] = xmlReader.Value;
// выходим из узла <a>
xmlReader.Read();
i++;
}
}
// выходим из узла вопроса <q>
xmlReader.Read();
return true;
}
// если считанный тэг не является
// тэгом вопроса <q>
else
return false;
}
// выводит вопрос и варианты ответа
private void showQw()
{
// выводим вопрос
label1.Text = qw;
/*pic
if (pic.Length != 0)
{
try
{
pictureBox1.Image = new Bitmap(pic);
pictureBox1.Visible = true;
}
catch
{
if(pictureBox1.Visible)
pictureBox1.Visible = false;
label1.Text += "\n\n\nERROR IN FILE CONNECTION" + pic + ".";
}
}*/
// показать варианты ответа
radioButton1.Text = answ[0];
radioButton2.Text = answ[1];
radioButton3.Text = answ[2];
radioButton4.Text = answ[3];
button1.Enabled = false;
checkBox1.Enabled = false;
checkBox2.Enabled = false;
checkBox3.Enabled = false;
checkBox4.Enabled = false;
//Выводим общее кол-во вопросов
label2.Text = "Всего вопросов" + nv.ToString() + ". ";
//выводим номер вопроса
}
// щелчок на кнопке выбора ответа
// функция обрабатывает событие Click
// компонентов radioButton1 - radioButton4
private void radioButton1_Click(object sender, EventArgs e)
{
if ((RadioButton)sender == radioButton1) otv = 0;
if ((RadioButton)sender == radioButton2) otv = 1;
if ((RadioButton)sender == radioButton3) otv = 2;
if ((RadioButton)sender == radioButton4) otv = 3;
button1.Enabled = true;
}
// щелчок на кнопке Ok
private void button1_Click_1(object sender, EventArgs e)
{
switch (mode)
{
case 0: // начало работы программы
radioButton1.Visible = true;
radioButton2.Visible = true;
radioButton3.Visible = true;
radioButton4.Visible = true;
this.getQw();
this.showQw();
mode = 1;
button1.Enabled = false;
break;
case 1:
nv++;
// правильный ли ответ выбран
if (otv == right) n++;
if (this.getQw()) this.showQw();
else
{
// больше вопросов нет
radioButton1.Visible = false;
radioButton2.Visible = false;
radioButton3.Visible = false;
radioButton4.Visible = false;
pictureBox1.Visible = false;
// обработка и вывод результата
this.showLevel();
// следующий щелчок на кнопке Ok
// закроет окно программы
mode = 2;
}
break;
case 2: // завершение работы программы
this.Close(); // закрыть окно
break;
}
}
// выводит оценку
private void showLevel()
{
// ищем узел <levels>
do
xmlReader.Read();
while (xmlReader.Name != "levels");
// входим внутрь узла
xmlReader.Read();
// читаем данные узла
while (xmlReader.Name != "levels")
{
xmlReader.Read();
if (xmlReader.Name == "level")
// n - кол-во правильных ответов,
// проверяем, попадаем ли в категорию
if (n >= System.Convert.ToInt32(
xmlReader.GetAttribute("score")))
break;
}
// выводим оценку
label1.Text =
"Тестирование завершено.\n" + "Студент " + textBox1.Text +
" Вы ответили на: " + nv.ToString() + " вопросов. " +
"И дали: " + n.ToString() + " правильных ответов.\n" +
xmlReader.GetAttribute("text");
button1.Text = "Завершить";
button1.Visible = false;
}
}
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
string fpath; // путь к файлу теста
string fname; // файл теста
// XmlReader обеспечивает чтение данных xml-файла
System.Xml.XmlReader xmlReader;
string qw; // вопрос
// варианты ответа
string[] answ = new string[4];
int right; // правильный ответ (номер)
int otv; // выбранный ответ (номер)
int aq; // общее количество вопросов
int n; // количество правильных ответов
int nv; // общее количество вопросов
int mode; // состояние программы:
// 0 - начало работы;
// 1 - тестирование;
// 2 - завершение работы
// конструктор формы
// (см. также Program.cs )
public Form1(string[] args){
InitializeComponent();
radioButton1.Visible = false;
radioButton2.Visible = false;
radioButton3.Visible = false;
radioButton4.Visible = false;
// имя файла теста должно быть указано
// в качестве парамета команды запуска программы
if (args.Length == 0)
{
// указано только имя файла теста
switch(mode){
case 0: checkBox1.Checked = true;
fpath = Application.StartupPath + "\\";
fname = "eco.xml";
break;
case 1: checkBox2.Checked = true;
fpath = Application.StartupPath + "\\";
fname = "ec.xml";
break;
case 2: this.Close();
break;
}
try
{
// получаем доступ к xml-документу
xmlReader = new System.Xml.XmlTextReader(fpath + fname);
xmlReader.Read();
mode = 0;
n = 0;
// загрузить заголовок теста
this.showHead();
/*загрузить количество вопросов
this.showNumber();*/
// загрузить описание теста
this.showDescription();
}
catch (Exception exc)
{
label1.Text = "Ошибка доступа к файлу " +
fpath + fname;
MessageBox.Show("Ошибка доступа к файлу.\n" +
fpath + fname + "\n",
"Экзаменатор",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
mode = 2;
}
}
else
{
label1.Text =
"Файл теста необходимо указать " +
"в команде запуска программы.\n" +
"Например: 'exam economics.xml' " +
"или 'exam c:\\spb.xml'.";
mode = 2;
}
}
// выводит название (заголовок) теста
private void showHead()
{
// ищем узел <head>
do xmlReader.Read();
while (xmlReader.Name != "head");
// считываем заголовок
xmlReader.Read();
// вывести название теста в заголовок окна
this.Text = xmlReader.Value;
// выходим из узла <head>
xmlReader.Read();
button1.Text = "Начать";
}
//фамилия и группа
private void addText()
{
textBox1.Visible = true;
textBox2.Visible = true;
}
// выводит описание теста
private void showDescription()
{
// ищем узел <description>
do
xmlReader.Read();
while (xmlReader.Name != "description");
// считываем описание теста
xmlReader.Read();
// выводим описание теста
label1.Text = xmlReader.Value;
// выходим из узла <description>
xmlReader.Read();
// ищем узел вопросов <qw>
do
xmlReader.Read();
while (xmlReader.Name != "qw");
// входим внутрь узла
xmlReader.Read();
}
/*private void showNumber()
{
// ищем узел <aq>
do
xmlReader.Read();
while (xmlReader.Name != "aq");
// считываем описание теста
xmlReader.Read();
// выводим описание теста
label2.Text = xmlReader.Value;
// выходим из узла <aq>
xmlReader.Read();
}*/
// читает вопрос из файла теста
private Boolean getQw()
{
// считываем тэг <q>
xmlReader.Read();
textBox1.ReadOnly = true;
textBox2.ReadOnly = true;
button1.Text = "Далее";
/*this.showNumber();*/
if (xmlReader.Name == "q")
{
// здесь прочитан тэг <q>,
// атрибут text которого содержит вопрос, а
// атрибут src - имя файла иллюстрации.
// извлекаем значение атрибутов
qw = xmlReader.GetAttribute("text");
//pic = xmlReader.GetAttribute("src");
//if (!pic.Equals(string.Empty)) pic = fpath + pic;
// входим внутрь узла
xmlReader.Read();
int i = 0;
// считываем данные узла вопроса <q>
while (xmlReader.Name != "q")
{
xmlReader.Read();
// варианты ответа
if (xmlReader.Name == "a")
{
// запоминаем правильный ответ
if (xmlReader.GetAttribute("right") == "yes")
right = i;
// считываем вариант ответа
xmlReader.Read();
if (i < 4) answ[i] = xmlReader.Value;
// выходим из узла <a>
xmlReader.Read();
i++;
}
}
// выходим из узла вопроса <q>
xmlReader.Read();
return true;
}
// если считанный тэг не является
// тэгом вопроса <q>
else
return false;
}
// выводит вопрос и варианты ответа
private void showQw()
{
// выводим вопрос
label1.Text = qw;
/*pic
if (pic.Length != 0)
{
try
{
pictureBox1.Image = new Bitmap(pic);
pictureBox1.Visible = true;
}
catch
{
if(pictureBox1.Visible)
pictureBox1.Visible = false;
label1.Text += "\n\n\nERROR IN FILE CONNECTION" + pic + ".";
}
}*/
// показать варианты ответа
radioButton1.Text = answ[0];
radioButton2.Text = answ[1];
radioButton3.Text = answ[2];
radioButton4.Text = answ[3];
button1.Enabled = false;
checkBox1.Enabled = false;
checkBox2.Enabled = false;
checkBox3.Enabled = false;
checkBox4.Enabled = false;
//Выводим общее кол-во вопросов
label2.Text = "Всего вопросов" + nv.ToString() + ". ";
//выводим номер вопроса
}
// щелчок на кнопке выбора ответа
// функция обрабатывает событие Click
// компонентов radioButton1 - radioButton4
private void radioButton1_Click(object sender, EventArgs e)
{
if ((RadioButton)sender == radioButton1) otv = 0;
if ((RadioButton)sender == radioButton2) otv = 1;
if ((RadioButton)sender == radioButton3) otv = 2;
if ((RadioButton)sender == radioButton4) otv = 3;
button1.Enabled = true;
}
// щелчок на кнопке Ok
private void button1_Click_1(object sender, EventArgs e)
{
switch (mode)
{
case 0: // начало работы программы
radioButton1.Visible = true;
radioButton2.Visible = true;
radioButton3.Visible = true;
radioButton4.Visible = true;
this.getQw();
this.showQw();
mode = 1;
button1.Enabled = false;
break;
case 1:
nv++;
// правильный ли ответ выбран
if (otv == right) n++;
if (this.getQw()) this.showQw();
else
{
// больше вопросов нет
radioButton1.Visible = false;
radioButton2.Visible = false;
radioButton3.Visible = false;
radioButton4.Visible = false;
pictureBox1.Visible = false;
// обработка и вывод результата
this.showLevel();
// следующий щелчок на кнопке Ok
// закроет окно программы
mode = 2;
}
break;
case 2: // завершение работы программы
this.Close(); // закрыть окно
break;
}
}
// выводит оценку
private void showLevel()
{
// ищем узел <levels>
do
xmlReader.Read();
while (xmlReader.Name != "levels");
// входим внутрь узла
xmlReader.Read();
// читаем данные узла
while (xmlReader.Name != "levels")
{
xmlReader.Read();
if (xmlReader.Name == "level")
// n - кол-во правильных ответов,
// проверяем, попадаем ли в категорию
if (n >= System.Convert.ToInt32(
xmlReader.GetAttribute("score")))
break;
}
// выводим оценку
label1.Text =
"Тестирование завершено.\n" + "Студент " + textBox1.Text +
" Вы ответили на: " + nv.ToString() + " вопросов. " +
"И дали: " + n.ToString() + " правильных ответов.\n" +
xmlReader.GetAttribute("text");
button1.Text = "Завершить";
button1.Visible = false;
}
}
}
Что самое интересное, вот тут
Код:
if (args.Length == 0)
В результате mode в конструкторе равен = 0 и выполняеться лишь
Код:
case 0: checkBox1.Checked = true;
fpath = Application.StartupPath + "\\";
fname = "eco.xml";
break;
fpath = Application.StartupPath + "\\";
fname = "eco.xml";
break;
Еще вот что за криво код
Код:
fpath = Application.StartupPath + "\\";
fname = "eco.xml";
xmlReader = new System.Xml.XmlTextReader(fpath + fname);
fname = "eco.xml";
xmlReader = new System.Xml.XmlTextReader(fpath + fname);
Код:
xmlReader = new System.Xml.XmlTextReader(System.IO.Path.Combine(Application.StartupPath, fname));
Код:
int len = args.Length;
if (len == 0)
{
label1.Text =
"Файл теста необходимо указать " +
"в команде запуска программы.\n" +
"Например: 'exam economics.xml' " +
"или 'exam c:\\spb.xml'.";
mode = 2;
}
else
{
switch(args[0])
{
case "eco.xml":
checkBox1.Checked = true;
fname = "eco.xml";
break;
case "ec.xml":
checkBox1.Checked = true;
fname = "ec.xml";
break;
}
}
if (len == 0)
{
label1.Text =
"Файл теста необходимо указать " +
"в команде запуска программы.\n" +
"Например: 'exam economics.xml' " +
"или 'exam c:\\spb.xml'.";
mode = 2;
}
else
{
switch(args[0])
{
case "eco.xml":
checkBox1.Checked = true;
fname = "eco.xml";
break;
case "ec.xml":
checkBox1.Checked = true;
fname = "ec.xml";
break;
}
}
Ниже, как можно обработать ваши чекбокс при клике на событиях это так если по человечески захотите написать
Код:
private void Form1_Load(object sender, EventArgs e)
{
this.checkBox1.CheckedChanged += new EventHandler(this.OnCheckedChanged);
this.checkBox2.CheckedChanged += new EventHandler(this.OnCheckedChanged);
this.checkBox3.CheckedChanged += new EventHandler(this.OnCheckedChanged);
this.checkBox4.CheckedChanged += new EventHandler(this.OnCheckedChanged);
}
private void OnCheckedChanged(object sender, EventArgs e)
{
CheckBox CB = sender as CheckBox;
if (CB.Checked == true)
{
foreach (Control control in this.Controls)
{
if (control is CheckBox)
{
CheckBox noCB = control as CheckBox;
if (control != CB)
{
noCB.Checked = false;
}
}
}
switch (CB.Name)
{
case "checkBox1":
MessageBox.Show("checkBox1");
break;
case "checkBox2":
MessageBox.Show("checkBox2");
break;
case "checkBox3":
MessageBox.Show("checkBox3");
break;
case "checkBox4":
MessageBox.Show("checkBox4");
break;
}
}
}
{
this.checkBox1.CheckedChanged += new EventHandler(this.OnCheckedChanged);
this.checkBox2.CheckedChanged += new EventHandler(this.OnCheckedChanged);
this.checkBox3.CheckedChanged += new EventHandler(this.OnCheckedChanged);
this.checkBox4.CheckedChanged += new EventHandler(this.OnCheckedChanged);
}
private void OnCheckedChanged(object sender, EventArgs e)
{
CheckBox CB = sender as CheckBox;
if (CB.Checked == true)
{
foreach (Control control in this.Controls)
{
if (control is CheckBox)
{
CheckBox noCB = control as CheckBox;
if (control != CB)
{
noCB.Checked = false;
}
}
}
switch (CB.Name)
{
case "checkBox1":
MessageBox.Show("checkBox1");
break;
case "checkBox2":
MessageBox.Show("checkBox2");
break;
case "checkBox3":
MessageBox.Show("checkBox3");
break;
case "checkBox4":
MessageBox.Show("checkBox4");
break;
}
}
}
Цитата: cronya
Если честно у вас такой бред написан, зачем подавать параметр с консоли в WinForm, если пишите для консоли, то и создавайте консольное приложение, а то тут понамешали все подряд.
Что самое интересное, вот тут
Вы проверяете если нечего не передовалась то выполнить ваш свитч
В результате mode в конструкторе равен = 0 и выполняеться лишь
Еще вот что за криво код
надо так
Ну если уже начали то наверно так должно быть
Ниже, как можно обработать ваши чекбокс при клике на событиях это так если по человечески захотите написать
Что самое интересное, вот тут
Код:
if (args.Length == 0)
В результате mode в конструкторе равен = 0 и выполняеться лишь
Код:
case 0: checkBox1.Checked = true;
fpath = Application.StartupPath + "\\";
fname = "eco.xml";
break;
fpath = Application.StartupPath + "\\";
fname = "eco.xml";
break;
Еще вот что за криво код
Код:
fpath = Application.StartupPath + "\\";
fname = "eco.xml";
xmlReader = new System.Xml.XmlTextReader(fpath + fname);
fname = "eco.xml";
xmlReader = new System.Xml.XmlTextReader(fpath + fname);
Код:
xmlReader = new System.Xml.XmlTextReader(System.IO.Path.Combine(Application.StartupPath, fname));
Код:
int len = args.Length;
if (len == 0)
{
label1.Text =
"Файл теста необходимо указать " +
"в команде запуска программы.\n" +
"Например: 'exam economics.xml' " +
"или 'exam c:\\spb.xml'.";
mode = 2;
}
else
{
switch(args[0])
{
case "eco.xml":
checkBox1.Checked = true;
fname = "eco.xml";
break;
case "ec.xml":
checkBox1.Checked = true;
fname = "ec.xml";
break;
}
}
if (len == 0)
{
label1.Text =
"Файл теста необходимо указать " +
"в команде запуска программы.\n" +
"Например: 'exam economics.xml' " +
"или 'exam c:\\spb.xml'.";
mode = 2;
}
else
{
switch(args[0])
{
case "eco.xml":
checkBox1.Checked = true;
fname = "eco.xml";
break;
case "ec.xml":
checkBox1.Checked = true;
fname = "ec.xml";
break;
}
}
Ниже, как можно обработать ваши чекбокс при клике на событиях это так если по человечески захотите написать
Код:
private void Form1_Load(object sender, EventArgs e)
{
this.checkBox1.CheckedChanged += new EventHandler(this.OnCheckedChanged);
this.checkBox2.CheckedChanged += new EventHandler(this.OnCheckedChanged);
this.checkBox3.CheckedChanged += new EventHandler(this.OnCheckedChanged);
this.checkBox4.CheckedChanged += new EventHandler(this.OnCheckedChanged);
}
private void OnCheckedChanged(object sender, EventArgs e)
{
CheckBox CB = sender as CheckBox;
if (CB.Checked == true)
{
foreach (Control control in this.Controls)
{
if (control is CheckBox)
{
CheckBox noCB = control as CheckBox;
if (control != CB)
{
noCB.Checked = false;
}
}
}
switch (CB.Name)
{
case "checkBox1":
MessageBox.Show("checkBox1");
break;
case "checkBox2":
MessageBox.Show("checkBox2");
break;
case "checkBox3":
MessageBox.Show("checkBox3");
break;
case "checkBox4":
MessageBox.Show("checkBox4");
break;
}
}
}
{
this.checkBox1.CheckedChanged += new EventHandler(this.OnCheckedChanged);
this.checkBox2.CheckedChanged += new EventHandler(this.OnCheckedChanged);
this.checkBox3.CheckedChanged += new EventHandler(this.OnCheckedChanged);
this.checkBox4.CheckedChanged += new EventHandler(this.OnCheckedChanged);
}
private void OnCheckedChanged(object sender, EventArgs e)
{
CheckBox CB = sender as CheckBox;
if (CB.Checked == true)
{
foreach (Control control in this.Controls)
{
if (control is CheckBox)
{
CheckBox noCB = control as CheckBox;
if (control != CB)
{
noCB.Checked = false;
}
}
}
switch (CB.Name)
{
case "checkBox1":
MessageBox.Show("checkBox1");
break;
case "checkBox2":
MessageBox.Show("checkBox2");
break;
case "checkBox3":
MessageBox.Show("checkBox3");
break;
case "checkBox4":
MessageBox.Show("checkBox4");
break;
}
}
}
Смысл понял, НО после исправления кода моей программы на предложенный Вами вариант, к сожалению, не происходит считывание вопроса из файла и не запускается программа. Извините за подобную просьбу,не могли бы Вы помочь мне в создании данной программы? Она будет использоваться в учебных целях и в понедельник, к сожалению, необходимо её сдать
капец. этот дебил еще и когото тестировать будет.
чем вас openfiledialog не устраивает? самый простой и здоровый метод в winform))