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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions