C#,表单应用程序。在按钮单击中调用方法

C#,表单应用程序。在按钮单击中调用方法,c#,forms,C#,Forms,我的代码是一个程序,它在单击按钮1时生成一个介于1-4之间的随机数,然后将其传递给GetQuestion,并根据随机数选择一个随机问题。然后,它应该检查textbox1以获取关于答案的输入,并检查GetAnswer函数中的答案是否正确。问题是,我似乎不知道如何将questionNum传递给GetAnswer,而不将其作为参数传递。如果我尝试将其作为参数传递,那么我的按钮2\u单击调用GetAnswer的内容将不起作用,因为方法调用需要一个参数,我不知道如何使其起作用。请帮忙 pu

我的代码是一个程序,它在单击按钮1时生成一个介于1-4之间的随机数,然后将其传递给GetQuestion,并根据随机数选择一个随机问题。然后,它应该检查textbox1以获取关于答案的输入,并检查GetAnswer函数中的答案是否正确。问题是,我似乎不知道如何将questionNum传递给GetAnswer,而不将其作为参数传递。如果我尝试将其作为参数传递,那么我的按钮2\u单击调用GetAnswer的内容将不起作用,因为方法调用需要一个参数,我不知道如何使其起作用。请帮忙

        public struct QuestionAnswer
        {
            public string question;
            public string answer;
        }
        public QuestionAnswer[] answers = new QuestionAnswer[3];

        private int GetQuestion(int questionNum) 
        {
            QuestionAnswer q1;
            q1.question = "What is a salmon?";
            q1.answer = "Fish";

            QuestionAnswer q2;
            q2.question = "How many meters is a kilometer?";
            q2.answer = "1000";

            QuestionAnswer q3;
            q3.question = "How much is 1 + 1?";
            q3.answer = "2";

            answers[0] = q1;
            answers[1] = q2;
            answers[2] = q3;

            label1.Visible = true;

            if (questionNum == 1) 
            {
                label1.Text = q1.question;
            }
            else if (questionNum == 2) 
            {
                label1.Text = q2.question;
            }
            else 
            {
                label1.Text = q3.question;
            }
            return questionNum;    
        }
        private void GetAnswer()
        {
            label2.Visible = true;
            string answer = textBox1.Text;
            
            if (answer == answers[0].answer && questionNum == 1 || answer == answers[1].answer && questionNum == 2 || answer == answers[2].answer && questionNum == 3)
            {
                label2.Text = "Correct!";
            }
            else
            {
                label2.Text = "Wrong!";
            }
        }
        private void button2_Click(object sender, EventArgs e) 
        {
            GetAnswer();
        }

        private void button1_Click(object sender, EventArgs e) 
        {
            label2.Visible = false;
            Random rnd = new Random();
            int questionNum = rnd.Next(1, 4);
            GetQuestion(questionNum);
        }
}

如果不想使用全局变量,可以使用标记属性

    public struct QuestionAnswer
    {
        public string question;
        public string answer;
    }
    private QuestionAnswer[] answers = new QuestionAnswer[3];

    private int GetQuestion(int questionNum)
    {
        QuestionAnswer q1;
        q1.question = "What is a salmon?";
        q1.answer = "Fish";

        QuestionAnswer q2;
        q2.question = "How many meters is a kilometer?";
        q2.answer = "1000";

        QuestionAnswer q3;
        q3.question = "How much is 1 + 1?";
        q3.answer = "2";

        answers[0] = q1;
        answers[1] = q2;
        answers[2] = q3;

        label1.Visible = true;

        if (questionNum == 1)
        {
            label1.Text = q1.question;
        }
        else if (questionNum == 2)
        {
            label1.Text = q2.question;
        }
        else
        {
            label1.Text = q3.question;
        }
        return questionNum;
    }
    private void GetAnswer(int questionNum)
    {
        label2.Visible = true;
        string answer = textBox1.Text;

        if (answer == answers[0].answer && questionNum == 1 || answer == answers[1].answer && questionNum == 2 || answer == answers[2].answer && questionNum == 3)
        {
            label2.Text = "Correct!";
        }
        else
        {
            label2.Text = "Wrong!";
        }
    }
    private void button2_Click(object sender, EventArgs e)
    {
        if(button1.Tag != null && int.TryParse(button1.Tag?.ToString(),out int result))
             GetAnswer((int)button1.Tag);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        label2.Visible = false;
        Random rnd = new Random();
        int questionNum = rnd.Next(1, 4);
        button1.Tag = questionNum;
        GetQuestion(questionNum);
    }

您只需使用一个字段,就像您为
答案所做的那样,来跟踪您当前的问题

现在,我已经对您的代码进行了重构,以了解如何编写此代码

private Random _rnd = new Random();
private int _questionIndex = 0;

public QuestionAnswer[] _answers = new QuestionAnswer[]
{
    new QuestionAnswer() { Question = "What is a salmon?", Answer = "Fish" },
    new QuestionAnswer() { Question = "How many meters is a kilometer?", Answer = "1000" },
    new QuestionAnswer() { Question = "How much is 1 + 1?", Answer = "2" },
};

private void button2_Click(object sender, EventArgs e)
{
    label2.Visible = true;
    string answer = textBox1.Text;
    label2.Text =
        answer == _answers[_questionIndex].Answer
        ? "Correct!"
        : "Wrong!";
}

private void button1_Click(object sender, EventArgs e)
{
    label2.Visible = false;
    label1.Visible = true;
    _questionIndex = _rnd.Next(0, _answers.Length);
    label1.Text = _answers[_questionIndex].Question;
}

用一个全局变量,你能给点建议吗?我尝试使用全局变量,但由于某种原因,每次我使用GetAnswer方法时,它都会生成0。您好!感谢您的时间和帮助,TryParse正在抛出错误,需要1个参数。我还不知道该怎么解决这个问题?对不起!之前有错误,代码已更新。我不认为解析是必需的,如果您在代码中的任何地方都没有设置标记属性,而不是数字,那么您可以删除该条件,嗯。。它给出了一个未处理的异常:对象引用未设置为对象的实例。单击button2之后,我认为这与“GetAnswer((int)button1.Tag);”部分有关,因为摆弄if语句仍然会产生错误。知道这是什么原因吗?嗯,修正了,除了逻辑上有问题外,它不是专门检查正确答案和正确问题,现在任何问题的正确答案都会显示“正确”谢谢,编辑成功了。非常感谢,祝你有一个愉快的一天,在那里是安全的!哦,好的,谢谢你的时间!我也将研究这种方法并找出答案。