-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
namespace GeographyQuizWinForms
{
public partial class Form1 : Form
{
private QuestionManager manager = new QuestionManager();
private List tempOptions = new List(); // Lưu tạm đáp án khi nhập MCQ
public Form1()
{
InitializeComponent();
AIQuestionBank.LoadFromFile();
lblFeedback.Text = "";
PopulateAIList();
}
private void Form1_Load(object sender, EventArgs e)
{
SetPlaceholder(txtQuestion, "Enter your question");
SetPlaceholder(txtAccepted, "Comma-separated answers for open-ended");
}
private void SetPlaceholder(TextBox txt, string placeholder)
{
txt.Text = placeholder;
txt.ForeColor = Color.Gray;
txt.GotFocus += (s, e) =>
{
if (txt.Text == placeholder) { txt.Text = ""; txt.ForeColor = Color.Black; }
};
txt.LostFocus += (s, e) =>
{
if (string.IsNullOrWhiteSpace(txt.Text)) { txt.Text = placeholder; txt.ForeColor = Color.Gray; }
};
}
private void PopulateAIList()
{
questionListBox.DataSource = null;
var list = AIQuestionBank.Questions
.Select((line, index) =>
{
var q = manager.ConvertAIToQuestion(line);
return q != null ? $"{index + 1}. {q.QuestionText}" : $"{index + 1}. [Invalid]";
}).ToList();
questionListBox.DataSource = list;
}
// ==== Quản lý đáp án MCQ động ====
private void btnAddOption_Click(object sender, EventArgs e)
{
string opt = txtNewOption.Text.Trim();
if (!string.IsNullOrEmpty(opt))
{
tempOptions.Add(opt);
lstOptions.Items.Add(opt);
txtNewOption.Clear();
UpdateCorrectCombo();
}
}
private void btnRemoveOption_Click(object sender, EventArgs e)
{
int idx = lstOptions.SelectedIndex;
if (idx >= 0)
{
tempOptions.RemoveAt(idx);
lstOptions.Items.RemoveAt(idx);
UpdateCorrectCombo();
}
}
private void btnEditOption_Click(object sender, EventArgs e)
{
int idx = lstOptions.SelectedIndex;
if (idx < 0) return;
string oldValue = lstOptions.Items[idx].ToString();
string newValue = Microsoft.VisualBasic.Interaction.InputBox("Edit option:", "Edit Option", oldValue);
if (!string.IsNullOrWhiteSpace(newValue))
{
lstOptions.Items[idx] = newValue;
tempOptions[idx] = newValue;
UpdateCorrectCombo();
}
}
private void UpdateCorrectCombo()
{
cmbCorrect.Items.Clear();
for (int i = 0; i < tempOptions.Count; i++)
cmbCorrect.Items.Add($"Option {i + 1}: {tempOptions[i]}");
}
// ==== Thêm câu hỏi ====
private void btnAdd_Click(object sender, EventArgs e)
{
string type = cmbType.SelectedItem?.ToString() ?? "";
string questionText = txtQuestion.Text.Trim();
if (string.IsNullOrWhiteSpace(type) || string.IsNullOrWhiteSpace(questionText))
{
lblFeedback.Text = "❌ Please select type and enter question text.";
lblFeedback.ForeColor = Color.Red;
return;
}
if (type == "Multiple Choice")
{
if (tempOptions.Count < 2 || cmbCorrect.SelectedIndex < 0)
{
lblFeedback.Text = "❌ Please add at least 2 options and select correct one.";
lblFeedback.ForeColor = Color.Red;
return;
}
manager.AddQuestionFromUI("mcq", questionText, tempOptions.ToArray(), cmbCorrect.SelectedIndex, null, null);
}
else if (type == "True/False")
{
if (!rTrue.Checked && !rFalse.Checked)
{
lblFeedback.Text = "❌ Please select True or False.";
lblFeedback.ForeColor = Color.Red;
return;
}
manager.AddQuestionFromUI("tf", questionText, null, 0, null, rTrue.Checked);
}
else if (type == "Open Ended")
{
if (string.IsNullOrWhiteSpace(txtAccepted.Text))
{
lblFeedback.Text = "❌ Please enter accepted answers.";
lblFeedback.ForeColor = Color.Red;
return;
}
manager.AddQuestionFromUI("open", questionText, null, 0, txtAccepted.Text.Split(',').Select(a => a.Trim()).ToArray(), null);
}
lblFeedback.Text = "✅ Added successfully.";
lblFeedback.ForeColor = Color.Green;
PopulateAIList();
ClearTempOptions();
}
// ==== Sửa câu hỏi ====
private void btnEdit_Click(object sender, EventArgs e)
{
int idx = questionListBox.SelectedIndex;
if (idx < 0)
{
lblFeedback.Text = "Please select a question to edit.";
lblFeedback.ForeColor = Color.Red;
return;
}
string type = cmbType.SelectedItem?.ToString() ?? "";
string questionText = txtQuestion.Text.Trim();
if (string.IsNullOrWhiteSpace(type) || string.IsNullOrWhiteSpace(questionText))
{
lblFeedback.Text = "❌ Please select type and enter question text.";
lblFeedback.ForeColor = Color.Red;
return;
}
string formatted = "";
if (type == "Multiple Choice")
{
if (tempOptions.Count < 2 || cmbCorrect.SelectedIndex < 0)
{
lblFeedback.Text = "❌ Please add at least 2 options and select correct one.";
lblFeedback.ForeColor = Color.Red;
return;
}
formatted = manager.FormatAsAIEntry(new MultipleChoiceQuestion
{
QuestionText = questionText,
Options = tempOptions.ToArray(),
CorrectOption = cmbCorrect.SelectedIndex
});
}
else if (type == "True/False")
{
if (!rTrue.Checked && !rFalse.Checked)
{
lblFeedback.Text = "❌ Please select True or False.";
lblFeedback.ForeColor = Color.Red;
return;
}
formatted = manager.FormatAsAIEntry(new TrueFalseQuestion
{
QuestionText = questionText,
IsTrue = rTrue.Checked
});
}
else if (type == "Open Ended")
{
if (string.IsNullOrWhiteSpace(txtAccepted.Text))
{
lblFeedback.Text = "❌ Please enter accepted answers.";
lblFeedback.ForeColor = Color.Red;
return;
}
formatted = manager.FormatAsAIEntry(new OpenEndedQuestion
{
QuestionText = questionText,
AcceptedAnswers = txtAccepted.Text.Split(',').Select(a => a.Trim()).ToList()
});
}
AIQuestionBank.Questions[idx] = formatted;
lblFeedback.Text = "✅ Question updated successfully.";
lblFeedback.ForeColor = Color.Green;
PopulateAIList();
ClearTempOptions();
}
// ==== Xóa câu hỏi ====
private void btnDelete_Click(object sender, EventArgs e)
{
int idx = questionListBox.SelectedIndex;
if (idx < 0)
{
lblFeedback.Text = "Please select a question to delete.";
lblFeedback.ForeColor = Color.Red;
return;
}
AIQuestionBank.Questions.RemoveAt(idx);
lblFeedback.Text = "Deleted successfully.";
lblFeedback.ForeColor = Color.Green;
PopulateAIList();
}
private void ClearTempOptions()
{
tempOptions.Clear();
lstOptions.Items.Clear();
cmbCorrect.Items.Clear();
cmbCorrect.SelectedIndex = -1;
}
// ==== Chơi Quiz ====
private void btnStartQuiz_Click(object sender, EventArgs e)
{
string targetType = rbMCQ.Checked ? "mcq" : rbTrueFalse.Checked ? "tf" : "open";
manager.ClearSummary();
manager.StartQuiz(targetType, 5);
if (manager.GetTotalQuestions() == 0)
{
lblAnswerFeedback.ForeColor = Color.Red;
lblAnswerFeedback.Text = "❌ No questions available.";
return;
}
ShowQuestion(manager.GetCurrentQuestion());
lblYourAnswer.Text = "Your Answer: \nCorrect Answer: ";
lblScoreOutside.Text = $"Score: {manager.GetScore()} / {manager.GetTotalQuestions()}";
lblScore.Text = "";
tabControl1.SelectedTab = tabQuiz;
btnStartQuiz.Enabled = false;
}
private void btnNext_Click(object sender, EventArgs e)
{
Question currentQuestion = manager.GetCurrentQuestion();
if (currentQuestion == null) return;
string userAnswer = GetUserAnswer();
bool isCorrect = manager.SubmitAnswer(userAnswer);
manager.SaveAnswerSummary(currentQuestion, userAnswer, isCorrect);
lblAnswerFeedback.ForeColor = isCorrect ? Color.Green : Color.Red;
lblAnswerFeedback.Text = isCorrect ? "✅ Correct!" : "❌ Incorrect!";
lblYourAnswer.Text = $"Your Answer: {userAnswer}\nCorrect Answer: {currentQuestion.GetCorrectAnswer()}";
lblScoreOutside.Text = $"Score: {manager.GetScore()} / {manager.GetTotalQuestions()}";
if (manager.HasNextQuestion())
ShowQuestion(manager.GetCurrentQuestion());
else
{
lblAnswerFeedback.ForeColor = Color.Blue;
lblAnswerFeedback.Text = "🎉 Quiz finished!";
btnStartQuiz.Enabled = true;
lstSummary.Items.Clear();
foreach (var s in manager.Summary)
{
lstSummary.Items.Add($"Q: {s.Question}");
lstSummary.Items.Add($"Your Answer: {s.YourAnswer}");
lstSummary.Items.Add($"Correct: {s.CorrectAnswer}");
lstSummary.Items.Add($"Result: {(s.IsCorrect ? "Correct" : "Incorrect")}");
lstSummary.Items.Add("-----------------------------------");
}
}
}
private string GetUserAnswer()
{
foreach (RadioButton rb in panelOptions.Controls.OfType<RadioButton>())
if (rb.Checked) return rb.Text;
return txtAnswer_Quiz.Visible ? txtAnswer_Quiz.Text.Trim() : "";
}
private void ShowQuestion(Question q)
{
lblQuestion_Quiz.Text = q.QuestionText;
panelOptions.Controls.Clear();
if (q is MultipleChoiceQuestion mcq)
{
int y = 10;
foreach (var opt in mcq.Options)
{
RadioButton rb = new RadioButton()
{
Text = opt,
Location = new Point(10, y),
AutoSize = true
};
panelOptions.Controls.Add(rb);
y += 30;
}
txtAnswer_Quiz.Visible = false;
}
else if (q is TrueFalseQuestion)
{
string[] options = { "True", "False" };
int y = 10;
foreach (var opt in options)
{
RadioButton rb = new RadioButton()
{
Text = opt,
Location = new Point(10, y),
AutoSize = true
};
panelOptions.Controls.Add(rb);
y += 30;
}
txtAnswer_Quiz.Visible = false;
}
else if (q is OpenEndedQuestion)
{
txtAnswer_Quiz.Visible = true;
}
lblAnswerFeedback.Text = "";
}
private void cmbType_SelectedIndexChanged(object sender, EventArgs e)
{
grpMCQ.Enabled = grpTrueFalse.Enabled = grpOpen.Enabled = false;
if (cmbType.SelectedItem?.ToString() == "Multiple Choice") grpMCQ.Enabled = true;
else if (cmbType.SelectedItem?.ToString() == "True/False") grpTrueFalse.Enabled = true;
else if (cmbType.SelectedItem?.ToString() == "Open Ended") grpOpen.Enabled = true;
}
private void questionListBox_SelectedIndexChanged(object sender, EventArgs e)
{
int idx = questionListBox.SelectedIndex;
if (idx < 0) return;
string raw = AIQuestionBank.Questions[idx];
var q = manager.ConvertAIToQuestion(raw);
if (q == null) return;
// Reset UI
tempOptions.Clear();
lstOptions.Items.Clear();
cmbCorrect.Items.Clear();
cmbCorrect.SelectedIndex = -1;
txtAccepted.Clear();
rTrue.Checked = false;
rFalse.Checked = false;
txtQuestion.Text = q.QuestionText;
if (q is MultipleChoiceQuestion mcq)
{
cmbType.SelectedItem = "Multiple Choice";
for (int i = 0; i < mcq.Options.Length; i++)
{
tempOptions.Add(mcq.Options[i]);
lstOptions.Items.Add(mcq.Options[i]);
cmbCorrect.Items.Add($"Option {i + 1}: {mcq.Options[i]}");
}
if (mcq.CorrectOption >= 0 && mcq.CorrectOption < mcq.Options.Length)
cmbCorrect.SelectedIndex = mcq.CorrectOption;
}
else if (q is TrueFalseQuestion tf)
{
cmbType.SelectedItem = "True/False";
if (tf.IsTrue) rTrue.Checked = true;
else rFalse.Checked = true;
}
else if (q is OpenEndedQuestion open)
{
cmbType.SelectedItem = "Open Ended";
txtAccepted.Text = string.Join(", ", open.AcceptedAnswers);
}
}
private void lblYourAnswer_Click(object sender, EventArgs e) { }
private void rbTrueFalse_CheckedChanged(object sender, EventArgs e)
{
}
}
}
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels