Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Программа-тест. Реализовать выбор файла с вопросами, используя CheckBox

87K
13 декабря 2012 года
mchouse
2 / / 13.12.2012
Здравствуйте, Уважаемые Форумчане!
Я пишу программу тестер. Суть программы в следующем, она считывает вопросы и варианты ответов из xml файла и выводит их на экран, пользователь отвечает на вопросы и в конце программа дает окончательный подсчет правильных ответов.
Программа написана, единственный не понятный момент: файл теста описан в коде программы:


 
Код:
fpath = Application.StartupPath + "\\";
                            fname = "eco.xml";
Но так как вариантов теста - 4, необходимо сделать выбор варианта теста с помощью выбора checkBox-a. Я попытался реализовать данную функцию с помощью switch. В итоге ничего не получилось. Подскажите, как мне реализовать функцию выбора варианта:
При выборе 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;
        }
    }
}
392
13 декабря 2012 года
cronya
421 / / 03.01.2009
Если честно у вас такой бред написан, зачем подавать параметр с консоли в WinForm, если пишите для консоли, то и создавайте консольное приложение, а то тут понамешали все подряд.
Что самое интересное, вот тут
 
Код:
if (args.Length == 0)
Вы проверяете если нечего не передовалась то выполнить ваш свитч
В результате mode в конструкторе равен = 0 и выполняеться лишь
 
Код:
case 0: checkBox1.Checked = true;
                            fpath = Application.StartupPath + "\\";
                            fname = "eco.xml";
                            break;

Еще вот что за криво код

 
Код:
fpath = Application.StartupPath + "\\";
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;

                }
            }



Ниже, как можно обработать ваши чекбокс при клике на событиях это так если по человечески захотите написать
Код:
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;
        }
    }
}
87K
15 декабря 2012 года
mchouse
2 / / 13.12.2012
Цитата: cronya
Если честно у вас такой бред написан, зачем подавать параметр с консоли в WinForm, если пишите для консоли, то и создавайте консольное приложение, а то тут понамешали все подряд.
Что самое интересное, вот тут
 
Код:
if (args.Length == 0)
Вы проверяете если нечего не передовалась то выполнить ваш свитч
В результате mode в конструкторе равен = 0 и выполняеться лишь
 
Код:
case 0: checkBox1.Checked = true;
                            fpath = Application.StartupPath + "\\";
                            fname = "eco.xml";
                            break;

Еще вот что за криво код

 
Код:
fpath = Application.StartupPath + "\\";
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;

                }
            }



Ниже, как можно обработать ваши чекбокс при клике на событиях это так если по человечески захотите написать
Код:
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;
        }
    }
}



Смысл понял, НО после исправления кода моей программы на предложенный Вами вариант, к сожалению, не происходит считывание вопроса из файла и не запускается программа. Извините за подобную просьбу,не могли бы Вы помочь мне в создании данной программы? Она будет использоваться в учебных целях и в понедельник, к сожалению, необходимо её сдать

1
16 декабря 2012 года
kot_
7.3K / / 20.01.2000
капец. этот дебил еще и когото тестировать будет.
392
16 декабря 2012 года
cronya
421 / / 03.01.2009
чем вас openfiledialog не устраивает? самый простой и здоровый метод в winform))
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог