Диплом: Автоматизация процесса ведения информационной базы о должностях и вакансиях с указанием требований к уровню знаний и навыков кандидатов для ПАО Тостелеком

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
117
/// <summary>
/// Показать вопрос
/// </summary>
private void ShowCurrentQuestion()
{
// Номер вопроса
int __number_ = _CurrentQuestion == null ? 0 : _CurrentQuestion.Number;
// Предподготовка элементов
_QuestionText = "";
dgvData.Rows.Clear();
// Блокировка элементов в зависимости от выбранного вопроса
txtQuestionText.Enabled = _Questions.Count > 0;
dgvData.Enabled = _Questions.Count > 0;
tsbtnDeleteQuestion.Enabled = __number_ > 0;
tsbtnFirstQuestion.Enabled = _Questions.Count > 0;
tsbtnPreviousQuestion.Enabled = __number_ > 1;
tsbtnNextQuestion.Enabled = __number_ < _Questions.Count;
tsbtnLastQuestion.Enabled = __number_ < _Questions.Count;
tstrbtnAddAnswer.Enabled = _CurrentQuestion != null;
tstrbtnDeleteAnswer.Enabled = _CurrentQuestion != null;
// Если выбран вопрос
if (__number_ > 0)
{
// Текст вопроса
_QuestionText = _CurrentQuestion.Text;
tstrlblCurrentQuestion.Text = $"Вопрос № {__number_} из
{_Questions.Count}";
// Варианты ответа
foreach (Entities.Answer a in _CurrentQuestion.Answers)
{
dgvData.Rows.Add(new object[] { tstrlblAnswerIcon.Image, a.Text,
a.Score, a.IsTrue });
}
// Информация по тесту
_QMaxScore = _CurrentQuestion.MaxScore;
_TMaxScore = _MaxScoresForTest;
}
else
{
// Информация по тесту
_QMaxScore = 0;
_TMaxScore = 0;
}
}
/// <summary>
/// Сохранение данных текущего вопроса
/// </summary>
/// <returns>Результат проверки</returns>
private bool SaveCurrentQuestion()
{
// Проверка текущего вопроса
if (_CurrentQuestion == null)
return false;
else if (!CheckQuestion())
return false;
else
{
// Сохраняем данные вопроса
_CurrentQuestion.Edit(QuestionAnswers, _QuestionText);
// Сохранили
return true;
}
}
118
/// <summary>
/// Проверка корректности ввода данных вопроса
/// </summary>
/// <returns>Результат проверки</returns>
private bool CheckQuestion()
{
// Временные данные
int score = 0;
bool true_answer_exists = false;
// Не заполнен текст вопроса
if (txtQuestionText.Text.Trim() == string.Empty)
{
MessageBox.Show("Не заполнен текст вопроса!", "Действие невозможно",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return false;
}
// Не указаны варианты ответа
if (dgvData.Rows.Count < 2)
{
MessageBox.Show("Должно быть, как минимум, два варианта ответа",
"Действие невозможно",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return false;
}
// Некорректные данные вариантов ответа
foreach (DataGridViewRow dgvr in dgvData.Rows)
{
// Не заполнен вариант ответа
if (Convert.ToString(dgvr.Cells[1].Value) == string.Empty)
{
MessageBox.Show("Варианты ответа не могут быть пустыми!", "Действие
невозможно",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return false;
}
// Некорректное значение балла за ответ
if (!Int32.TryParse(Convert.ToString(dgvr.Cells[2].Value), out score))
{
MessageBox.Show("Указан некорректный балл, как минимум, за один из
вариантов ответа!", "Действие невозможно",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return false;
}
// Нулевой балл за правильный ответ
if (Convert.ToBoolean(dgvr.Cells[3].Value) == true)
{
true_answer_exists = true;
if (score <= 0)
{
MessageBox.Show("За верный ответ не может быть назначен
отрицательный или нулевой балл!", "Действие невозможно",
MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
return false;
}
}
}
// Не указан правильный ответ
if (!true_answer_exists)
{
MessageBox.Show("Должен быть указан хотя бы одни верный вариант ответа на
вопрос!", "Действие невозможно",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
119
return false;
}
// Все проверки пройдены
return true;
}
/// -----------------------------------------------------
/// ДОСТУП К СВОЙСТВАМ ОБЪЕКТОВ ИНТЕРФЕЙСА
/// -----------------------------------------------------
#region "Properties"
/// <summary>
/// Наименование
/// </summary>
public string _Name { get { return txtName.Text.Trim(); } set { txtName.Text =
value; } }
/// <summary>
/// Текст вопроса
/// </summary>
public string _QuestionText { get { return txtQuestionText.Text.Trim(); } set {
txtQuestionText.Text = value; } }
/// <summary>
/// Ограничение по времени
/// </summary>
public int _TimeLimit { get { return Convert.ToInt32(nudTmeLimit.Value); } set {
nudTmeLimit.Value = value; } }
/// <summary>
/// Проходной балл
/// </summary>
public int _PassScore { get { return Convert.ToInt32(nudPassScore.Value); } set {
nudPassScore.Value = value; } }
/// <summary>
/// Вопросы теста
/// </summary>
public List<Entities.Question> _Questions { get; set; }
/// <summary>
/// Максимальное количество баллов за текущий вопрос
/// </summary>
private int _QMaxScore { set { lblMaxScoreOfCurrentQuestion.Text =
value.ToString(); } }
/// <summary>
/// Максимальное количество баллов за тест
/// </summary>
private int _TMaxScore
{
set
{
lblMaxScoreOfTest.Text = value.ToString();
nudPassScore.Maximum = value;
}
}
/// <summary>
/// Рассчитать максимальный балл за тест
/// </summary>
private int _MaxScoresForTest
{
get
{
int t_max_scores = 0;
foreach (Entities.Question q in _Questions)
{
t_max_scores += q.MaxScore;
}
return t_max_scores;
120
}
}
/// <summary>
/// Варианты ответа текущего вопроса
/// </summary>
private List<Entities.Answer> QuestionAnswers
{
get
{
int a_num = 1;
List<Entities.Answer> la = new List<Entities.Answer>();
foreach (DataGridViewRow dgvr in dgvData.Rows)
{
la.Add(new Entities.Answer(
_test.ID,
_CurrentQuestion.Number,
a_num++,
Convert.ToString(dgvr.Cells[1].Value),
Convert.ToInt32(dgvr.Cells[2].Value),
Convert.ToBoolean(dgvr.Cells[3].Value)
));
}
return la;
}
}
#endregion
/// -----------------------------------------------------
/// -----------------------------------------------------
/// ОБРАБОТКА КОМАНД ПОЛЬЗОВАТЕЛЯ : ВОПРОСЫ
/// -----------------------------------------------------
#region "CommandsQuestions"
/// <summary>
/// К первому
/// </summary>
/// <param name="sender">Объект, вызвавший событие</param>
/// <param name="e">Параметры события</param>
private void tsbtnFirstQuestion_Click(object sender, EventArgs e)
{
// Сохранение текущего вопроса
if (!SaveCurrentQuestion()) return;
// Переход к первому
_CurrentQuestion = _Questions.Count > 0 ? _Questions[0] : null;
// Показать вопрос
ShowCurrentQuestion();
}
/// <summary>
/// К предыдущему
/// </summary>
/// <param name="sender">Объект, вызвавший событие</param>
/// <param name="e">Параметры события</param>
private void tsbtnPreviousQuestion_Click(object sender, EventArgs e)
{
// Сохранение текущего вопроса
if (!SaveCurrentQuestion()) return;
// Переход к предыдущему
if (_CurrentQuestion != null)
{
if (_CurrentQuestion.Number > 1)
_CurrentQuestion = _Questions[_CurrentQuestion.Number - 2];
else
return;
}
121
else
_CurrentQuestion = null;
// Показать вопрос
ShowCurrentQuestion();
}
/// <summary>
/// К следующему
///
/// <param name="sender">Объект, вызвавший событие</param>
/// <param name="e">Параметры события</param>
private void tsbtnNextQuestion_Click(object sender, EventArgs e)
{
// Сохранение текущего вопроса
if (!SaveCurrentQuestion()) return;
// Переход к следующему
if (_CurrentQuestion != null)
{
if (_CurrentQuestion.Number < _Questions.Count)
_CurrentQuestion = _Questions[_CurrentQuestion.Number];
else
return;
}
else
_CurrentQuestion = null;
// Показать вопрос
ShowCurrentQuestion();
}
/// <summary>
/// К последнему
///
/// <param name="sender">Объект, вызвавший событие</param>
/// <param name="e">Параметры события</param>
private void tsbtnLastQuestion_Click(object sender, EventArgs e)
{
// Сохранение текущего вопроса
if (!SaveCurrentQuestion()) return;
// Переход к последнему
_CurrentQuestion = _Questions.Count > 0 ? _Questions[_Questions.Count - 1] :
null;
// Показать вопрос
ShowCurrentQuestion();
}
/// <summary>
/// Добавить вопрос
/// </summary>
/// <param name="sender">Объект, вызвавший событие</param>
/// <param name="e">Параметры события</param>
private void tsbtnAddQuestion_Click(object sender, EventArgs e)
{
// Сохранение текущего вопроса
if (!SaveCurrentQuestion() && _Questions.Count > 0) return;
// Добавление нового вопроса в конец
_Questions.Add(new Entities.Question(_test.ID, _Questions.Count + 1,
new List<Entities.Answer>(), "текст вопроса"));
// Переход к последнему
_CurrentQuestion = _Questions[_Questions.Count - 1];
// Показать вопрос
ShowCurrentQuestion();
}
/// <summary>
/// Удалить вопрос
/// </summary>
/// <param name="sender">Объект, вызвавший событие</param>
/// <param name="e">Параметры события</param>
122
private void tsbtnDeleteQuestion_Click(object sender, EventArgs e)
{
if (_CurrentQuestion != null)
{
// Номер удаляемого вопроса
int n = _CurrentQuestion.Number;
// Подтверждение удаления пользователем
if (MessageBox.Show("Подтверждаете удаление этого вопроса?", "Удалить
вопрос ?",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) ==
DialogResult.Yes)
{
// Удаление вопроса
_Questions.Remove(_CurrentQuestion);
// Новое количество вопросов
int qc = _Questions.Count;
// Перенумеровка вопросов (чтобы были по порядку)
if (qc > 0)
for (int i = 0; i < qc; i++)
_Questions[i].ReAssignNumber(i + 1);
// Переход к следующему за удаленным вопросу (если есть)
if (n <= qc)
_CurrentQuestion = _Questions[n - 1];
// Переход к предыдущемы перед удаленным вопросу (если есть)
else if (n > 1)
_CurrentQuestion = _Questions[n - 2];
// Иначе - вопросов не осталось
else
_CurrentQuestion = null;
// Показать вопрос
ShowCurrentQuestion();
}
}
}
#endregion
/// -----------------------------------------------------
/// -----------------------------------------------------
/// ОБРАБОТКА КОМАНД ПОЛЬЗОВАТЕЛЯ : ОТВЕТЫ
/// -----------------------------------------------------
#region "CommandsAnswers"
/// <summary>
/// Добавить вариант ответа
/// </summary>
/// <param name="sender">Объект, вызвавший событие</param>
/// <param name="e">Параметры события</param>
private void tstrbtnAddAnswer_Click(object sender, EventArgs e)
{
// Количество вариантов ответа на текущий вопрос
int q_cnt = dgvData.Rows.Count;
// Создание нового варианта ответа
Entities.Answer na = new Entities.Answer(_test.ID, _CurrentQuestion.Number,
q_cnt + 1);
// Добавление варианта ответа в вопрос
_CurrentQuestion.Answers.Add(na);
// Добавление варианта ответа в таблицу
dgvData.Rows.Add(new object[] { tstrlblAnswerIcon.Image, na.Text, na.Score,
na.IsTrue });
}
/// <summary>
/// Удалить вариант ответа
/// </summary>
/// <param name="sender">Объект, вызвавший событие</param>
123
/// <param name="e">Параметры события</param>
private void tstrbtnDeleteAnswer_Click(object sender, EventArgs e)
{
if (dgvData.SelectedRows.Count > 0)
{
// Удаление строки из таблицы ответов
dgvData.Rows.Remove(dgvData.SelectedRows[0]);
// Сохраняем данные вопроса
_CurrentQuestion.Edit(QuestionAnswers, _QuestionText);
// Информация по тесту
_QMaxScore = _CurrentQuestion.MaxScore;
_TMaxScore = _MaxScoresForTest;
}
}
/// <summary>
/// Редактирование варианта ответа
/// </summary>
/// <param name="sender">Объект, вызвавший событие</param>
/// <param name="e">Параметры события</param>
private void dgvData_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
// Если редактировалась колонка "Балл"
if (e.ColumnIndex == 2)
{
// Корректировка значения (при необходимости)
int val = 0;
Int32.TryParse(Convert.ToString(dgvData[e.ColumnIndex,
e.RowIndex].Value), out val);
dgvData[e.ColumnIndex, e.RowIndex].Value = val;
// Сохраняем данные вопроса
_CurrentQuestion.Edit(QuestionAnswers, _QuestionText);
// Информация по тесту
_QMaxScore = _CurrentQuestion.MaxScore;
_TMaxScore = _MaxScoresForTest;
}
}
/// <summary>
/// Применение данных при выборе правильного варианта ответа
/// </summary>
/// <param name="sender">Объект, вызвавший событие</param>
/// <param name="e">Параметры события</param>
private void dgvData_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
// Колонка выбора варианта ответа
if (e.ColumnIndex == 3)
{
dgvData.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
}
#endregion
/// -----------------------------------------------------
/// ОБРАБОТКА КОМАНД ПОЛЬЗОВАТЕЛЯ : МЕНЮ ДИАЛОГА
/// -----------------------------------------------------
#region "CommandsDialog"
/// <summary>
/// Сохранить тест в БД
/// </summary>
/// <param name="sender">Объект, вызвавший событие</param>
/// <param name="e">Параметры события</param>
private void tsbtnSaveTest_Click(object sender, EventArgs e)
{
// Не указаны вопросы
124
if (_Questions.Count < 1)
{
MessageBox.Show("В тесте не создано ни одного вопроса!", "Действие
невозможно",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
// Не заполнено название теста
if (txtQuestionText.Text.Trim() == string.Empty)
{
MessageBox.Show("Не заполнено название теста!", "Действие невозможно",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
// Сохранение текущего вопроса
if (!SaveCurrentQuestion()) return;
// Закрыть и подтвердить диалог
DialogResult = DialogResult.OK;
Close();
}
/// <summary>
/// Восстановить исходный тест
/// </summary>
/// <param name="sender">Объект, вызвавший событие</param>
/// <param name="e">Параметры события</param>
private void tsbtnRestoreTest_Click(object sender, EventArgs e)
{
// Реинициализация теста
_test = new Entities.Test(_test.ID);
// Подготовка конструктора тестов
InitTestConstructor();
}
/// <summary>
/// Отмена диалога
/// </summary>
/// <param name="sender">Объект, вызвавший событие</param>
/// <param name="e">Параметры события</param>
private void tsbtnCancel_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
Close();
}
#endregion
}
}
Программный код глобального модуля тестирования
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Collections.Generic;
namespace VPRT
{
/// <summary>
/// Диалог конструктора теста
/// </summary>
public partial class TestingForm : Form
{
/// <summary>
/// Экземпляр теста
125
/// </summary>
Entities.Test _test = null;
/// <summary>
/// Экземпляр теста
/// </summary>
Entities.Post TesterPost = null;
/// <summary>
/// Имя тестируемого
/// </summary>
string TesterName = null;
/// <summary>
/// Телефон тестируемого
/// </summary>
string TesterPhone = null;
/// <summary>
/// Конструктор
/// </summary>
/// <param name="__name_">Имя тестируемого</param>
/// <param name="__phone_">Телефон тестируемого</param>
/// <param name="__post_">Должность, на которую тестировался</param>
public TestingForm(string __name_, string __phone_, Entities.Post __post_ = null)
{
// Создание и инициализация компонентов
InitializeComponent();
// Соотнесение начальных значений
_test = __post_?.Posttest;
TesterPost = __post_;
TesterName = __name_;
TesterPhone = __phone_;
// Установка начальных параметров
_Name = _test.Name;
_TimeElapsed = _test.TimeLimit * 60;
tstrpbrTestProgressBar.Maximum = _test.Questions.Count;
lblStudentData.Text = $"Тестируется: {TesterName}; ({TesterPhone})";
// Заголовок окна
Text = $"[Тестирование] : {TesterName} -> /{_test.Name}/";
// Создание словаря ответов
Answers = new Dictionary<int, string>();
// Активировать таймер
tmrTimerTest.Enabled = true;
// Перейти к первому вопросу
ShowQuestion(1);
}
/// <summary>
/// Текущий вопрос
/// </summary>
Entities.Question _CurrentQuestion;
/// <summary>
/// Количество секунд до завершения теста
/// </summary>
private int _timeElapsed = 0;
/// <summary>
/// Показать вопрос
/// </summary>
/// <param name="__number_">Номер вопроса</param>
private void ShowQuestion(int __number_)
{
// Строка статуса теста
_QuestionNumber = __number_;
126
// Текущий вопрос теста
_CurrentQuestion = _test.Questions[__number_ - 1];
// Вывод вопроса
_QuestionText = _CurrentQuestion.Text;
// Вывод вариантов ответа
dgvAnswers.Rows.Clear();
foreach (Entities.Answer a in _CurrentQuestion.Answers)
{
dgvAnswers.Rows.Add(new object[] { picAnswerIcon.Image, a.Number, false,
a.Text, a.Score, a.IsTrue });
}
}
/// <summary>
/// Таймер тестирования
/// </summary>
/// <param name="sender">Объект, вызвавший событие</param>
/// <param name="e">Параметры события</param>
private void tmrTimerTest_Tick(object sender, EventArgs e)
{
// Обновление даты и времени
tstrlblDateTime.Text = DateTime.Now.ToLongDateString() + " " +
DateTime.Now.ToLongTimeString();
// Обновление таймера
_TimeElapsed--;
// Если время вышло
if (_TimeElapsed <= 0)
{
// Остановить таймер
tmrTimerTest.Enabled = false;
// Сообщение пользователю
MessageBox.Show("К сожалению, отведенное время на тестирование истекло!
Тест будет завершен." + Environment.NewLine +
"________________________________" + Environment.NewLine +
"Нажмите \"OK\", чтобы просмотреть свой результат.",
"Время вышло", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
// Сохранение результатов тестирования
SaveTestResults(true);
}
}
/// -----------------------------------------------------
/// ДОСТУП К СВОЙСТВАМ ОБЪЕКТОВ ИНТЕРФЕЙСА
/// -----------------------------------------------------
#region "Properties"
/// <summary>
/// Наименование теста
/// </summary>
private string _Name { set { lblTestName.Text = $"Название теста: {value}"; } }
/// <summary>
/// Текст вопроса
/// </summary>
private string _QuestionText { set { lblQuestionText.Text = value; } }
/// <summary>
/// Номер вопроса
/// </summary>
private int _QuestionNumber { set { tstrlblCurrentQuestion.Text = $"Вопрос №
{value} из {_test.Questions.Count}"; } }
/// <summary>
/// Ограничение по времени
/// </summary>
private int _TimeElapsed

Смотрите также:

"Автоматизация обработки заявок ООО "Проектно-Строительная Компания"
"Автоматизация процесса аттестации персонала для ООО "Нэт Бай Нэт Холдинг"
"Анализ интернет-активности конкурентов ( на примере конкурентов "Газпром нефть")
"Бухгалтерский учёт и аудит расчётов с подотчётними лицами в организации на примере ООО "ЛОЦ 10""
«Психологическое сопровождение персонала в организации на примере ООО «Крокус»
Cовершенствование деловой оценки персонала в организации (на примере ООО "Даймонд кейтеринг развитие")
IPO - инструмент финансирования деятельности организации. На примере ПАО «Нефтяная компания «Лукойл»
PR как средство продвижения организации (на примере ПАО "Тамбовский завод "Комсомолец им. Н.С. Артемова")
PR-коммуникации в сфере общественного питания (на примере кафе-кондитерской «Cream Cheese»)
SMM как средство повышения эффективности работы учреждений социокультурной сферы (на примере Малого театра)