Как заблокировать контролы при помощи переключателей Winforms C#
У меня есть форма, на которой расположено множество гиперссылок с переходом на другую форму с теорией, где при нажатии на кнопку открывается тест.
На форме теста есть три вкладки TabControl.
Также у меня есть переключатели типа bool AnsweredQuestion1, AnsweredQuestion2 и AnsweredQuestion3 (Таких еще несколько, поскольку вопросов больше и номера переключателей соответственно равны номерам вопросов), которые становятся true или false в зависимости от того, правильно ли были введены ответы на эти вопросы. Я решил сделать такую логику, что если пользователь отвечает на вопрос правильно, то при повторной загрузке формы с тестом по выбранному разделу данный вопрос помечается решенным, баллы за него засчитываются один раз и он может пролистать дальше к тому вопросу, который был решен неправильно, чтобы до конца пройти выбранный раздел.
Однако поскольку форма одна и на нее грузятся разные вопросы с ответами из базы данных, он при полном прохождении одного из разделов помечает пройденными и все остальные разделы
Хотел бы спросить, есть ли какие-либо варианты решения с самими переключателями, чтобы не менять ничего в базе и на форме, поскольку времени остается мало...
Вижу, что дело в условии, но как его лучше поменять, чтобы блокировать контролы к разным разделам не могу придумать...
private void TestForm_Load(object sender, EventArgs e)
{
label4.Visible = false;
label5.Visible = false;
label6.Visible = false;
switch (Test.Theme_ID)
{
case 1:
if (Test.AnsweredQuestion1 == true || Test.AnsweredQuestion4 == true || Test.AnsweredQuestion7 == true)
{
radioButton1.Enabled = false;
radioButton2.Enabled = false;
radioButton3.Enabled = false;
radioButton4.Enabled = false;
label4.Visible = true;
}
break;
case 2:
if (Test.AnsweredQuestion2 == true || Test.AnsweredQuestion5 == true || Test.AnsweredQuestion8 == true)
{
textBox1.Enabled = false;
label5.Visible = true;
}
break;
case 3:
if (Test.AnsweredQuestion3 == true || Test.AnsweredQuestion6 == true || Test.AnsweredQuestion9 == true)
{
radioButton5.Enabled = false;
radioButton6.Enabled = false;
radioButton7.Enabled = false;
radioButton8.Enabled = false;
label6.Visible = true;
}
break;
}
Text = $"Вопросы к теме: {User.header}";
GetData();
Output_Data();
}
Пример кнопки "далее" для считывания вариантов ответа на первой странице TabControl:
private void RBnext_Click(object sender, EventArgs e)
{
checkCancel = false;
if (Test.AnsweredQuestion1 == true || Test.AnsweredQuestion4 == true || Test.AnsweredQuestion7 == true)
{
tabControl1.SelectTab("tabPage2");
}
else
{
if (!radioButton1.Checked && !radioButton2.Checked && !radioButton3.Checked && !radioButton4.Checked)
MessageBox.Show("Вы не выбрали вариант ответа!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
else
{
GetAnswers();
switch (Test.Theme_ID)
{
case 1:
if ((radioButton1.Checked && radioButton1.Text == Test.Answer1) ||
(radioButton2.Checked && radioButton2.Text == Test.Answer1) ||
(radioButton3.Checked && radioButton3.Text == Test.Answer1) ||
(radioButton4.Checked && radioButton4.Text == Test.Answer1))
{
if (Test.AnsweredQuestion1 == false)
{
MessageBox.Show("Верно!");
User.Progress += 11.11;
tabControl1.SelectTab("tabPage2");
Test.AnsweredQuestion1 = true;
}
}
else
{
MessageBox.Show("Неверно...");
tabControl1.SelectTab("tabPage2");
Test.AnsweredQuestion1 = false;
}
break;
case 2:
if ((radioButton1.Checked && radioButton1.Text == Test.Answer4) ||
(radioButton2.Checked && radioButton2.Text == Test.Answer4) ||
(radioButton3.Checked && radioButton3.Text == Test.Answer4) ||
(radioButton4.Checked && radioButton4.Text == Test.Answer4))
{
if (Test.AnsweredQuestion4 == false)
{
MessageBox.Show("Верно!");
User.Progress += 11.11;
tabControl1.SelectTab("tabPage2");
Test.AnsweredQuestion4 = true;
}
}
else
{
MessageBox.Show("Неверно...");
tabControl1.SelectTab("tabPage2");
Test.AnsweredQuestion4 = false;
}
break;
case 3:
if ((radioButton1.Checked && radioButton1.Text == Test.Answer7) ||
(radioButton2.Checked && radioButton2.Text == Test.Answer7) ||
(radioButton3.Checked && radioButton3.Text == Test.Answer7) ||
(radioButton4.Checked && radioButton4.Text == Test.Answer7))
{
if (Test.AnsweredQuestion7 == false)
{
MessageBox.Show("Верно!");
User.Progress += 11.11;
tabControl1.SelectTab("tabPage2");
Test.AnsweredQuestion7 = true;
}
}
else
{
MessageBox.Show("Неверно...");
tabControl1.SelectTab("tabPage2");
Test.AnsweredQuestion7 = false;
}
break;
}
}
}
}
Для остальных двух вкладок код аналогичный, просто используются другие переключатели с другими номерами под номер вопроса.