Skip to content

form1.css #7

@tranlongcbvn112-sketch

Description

@tranlongcbvn112-sketch

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)
    {

    }
}

}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions