C# WinForm按钮在1-2次使用后停止工作

C# WinForm按钮在1-2次使用后停止工作,c#,.net,C#,.net,我有一个程序,通过命名一个国家(从列表中)来测试用户,并要求用户输入其首都。如果他们得到正确答案,则显示正确答案的计数器,并向其添加+1。如果它是错误的,同样的事情去,但不正确的计数器。我完成了它的代码,但是每当我使用Check-Answer按钮时,它就不再验证文本框中的输入,并且计数器(正确或不正确)都没有任何变化。如果第一个是正确的,第二个是错误的,则1表示正确,1表示不正确。此后,“检查答案”按钮下的代码不再执行。如果我得到2对或2错,它只计算第一个1,然后停止工作 { // Decla

我有一个程序,通过命名一个国家(从列表中)来测试用户,并要求用户输入其首都。如果他们得到正确答案,则显示正确答案的计数器,并向其添加+1。如果它是错误的,同样的事情去,但不正确的计数器。我完成了它的代码,但是每当我使用Check-Answer按钮时,它就不再验证文本框中的输入,并且计数器(正确或不正确)都没有任何变化。如果第一个是正确的,第二个是错误的,则1表示正确,1表示不正确。此后,“检查答案”按钮下的代码不再执行。如果我得到2对或2错,它只计算第一个1,然后停止工作

{
//  Declare structure
struct Country
{
    //  Declare strings
    public string countryName;
    public string capital;
}
public partial class Form1 : Form
{
    //  Create List for CourseInfo
    private List<Country> countryList = new List<Country>();

    Country currentCountry;

    public Form1()
    {
        InitializeComponent();
    }

    private void ReadFile()
    {
        try
        {
            //  Call StreamReader to use imported file
            StreamReader inputFile;
            string line;

            Country entry = new Country();

            //  Delimiter to separate values in text file
            char[] delim = { ',' };

            //  Open text file
            inputFile = File.OpenText("countries.txt");

            while (!inputFile.EndOfStream)
            {
                line = inputFile.ReadLine();

                //  Tokenize the strings separated by the delimiter ','
                string[] tokens = line.Split(delim);

                entry.countryName = tokens[0];   //  Tokenized entry for COUNTRY
                entry.capital = tokens[1];       //  Tokenized entry for CAPITAL

                countryList.Add(entry);
            }
        }
        catch (Exception ex)
        {
            //  Shows error message
            MessageBox.Show(ex.Message);
        }
    }


    private void DisplayCountry()
    {
        //  Create random variable
        Random rand = new Random();

        //  Country us randomly chosen from the list
        int countryPosition = rand.Next(countryList.Count);

        //  Selected country
        currentCountry = countryList[countryPosition];

        //  Show selected country in Label
        countryAnswerLabel.Text = currentCountry.countryName;
    }

    private void ExitButton_Click(object sender, EventArgs e)
    {
        //  Closes the form
        this.Close();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        //  Call method to load StreamReader with the file
        ReadFile();
    }

    private void QuizButton_Click(object sender, EventArgs e)
    {
        //  Call method to show random country
        DisplayCountry();
    }

    private void CheckAnswerButton_Click(object sender, EventArgs e)
    {
        //  Declare integer variables for the counters and set to 0
        int correctCounter = 0;
        int incorrectCounter = 0;

        //  If the input is correct, +1 for the correct counter
        if (currentCountry.capital == capitalAnswerTextBox.Text)
        {
            correctCounter++;
            correctLabel.Text = correctCounter.ToString();
        }
        //  If the input is incorrect, +1 for the incorrect counter
        else
        {
            incorrectCounter++;
            incorrectLabel.Text = incorrectCounter.ToString();
        }
    }

    private void NextQuestionButton_Click(object sender, EventArgs e)
    {
        //  Clears input TextBox
        capitalAnswerTextBox.Text = string.Empty;
        DisplayCountry();

    }
}
{
//声明结构
结构国家
{
//声明字符串
公共字符串countryName;
公共资本;
}
公共部分类Form1:Form
{
//为CourseInfo创建列表
私有列表countryList=新列表();
国家当前国家;
公共表格1()
{
初始化组件();
}
私有void ReadFile()
{
尝试
{
//调用StreamReader以使用导入的文件
StreamReader输入文件;
弦线;
国家/地区条目=新国家/地区();
//分隔符,用于分隔文本文件中的值
char[]delim={',};
//打开文本文件
inputFile=File.OpenText(“countries.txt”);
而(!inputFile.EndOfStream)
{
line=inputFile.ReadLine();
//标记由分隔符“,”分隔的字符串
string[]tokens=line.Split(delim);
entry.countryName=tokens[0];//国家/地区的标记化条目
entry.capital=tokens[1];//资本的标记化条目
countryList.Add(条目);
}
}
捕获(例外情况除外)
{
//显示错误消息
MessageBox.Show(例如Message);
}
}
私人国家()
{
//创建随机变量
Random rand=新的Random();
//从名单中随机选择的国家是美国
int countryPosition=rand.Next(countryList.Count);
//选定国家
currentCountry=countryList[countryPosition];
//在标签中显示所选国家/地区
countryAnswerLabel.Text=currentCountry.countryName;
}
私有无效退出按钮单击(对象发送者,事件参数e)
{
//关闭窗体
这个。关闭();
}
私有void Form1\u加载(对象发送方、事件参数e)
{
//调用方法将StreamReader与文件一起加载
ReadFile();
}
私有void QuizButton_单击(对象发送者,事件参数e)
{
//调用方法以显示随机国家/地区
显示国家();
}
私有无效检查应答按钮\单击(对象发送者,事件参数e)
{
//为计数器声明整数变量并设置为0
int校正计数器=0;
int不正确计数器=0;
//如果输入正确,+1表示正确的计数器
if(currentCountry.capital==capitalAnswerTextBox.Text)
{
计数器++;
correctLabel.Text=correctCounter.ToString();
}
//如果输入不正确,+1表示计数器不正确
其他的
{
不正确计数器++;
incorrectLabel.Text=incorrectCounter.ToString();
}
}
私有void NextQuestionButton_单击(对象发送者,事件参数e)
{
//清除输入文本框
capitalAnswerTextBox.Text=string.Empty;
显示国家();
}
}

请注意,每当执行
CheckAnswerButton\u单击
,变量
correctCounter
incorrectCounter
都会初始化为0。因此,每次按下按钮,您都会再次开始从0开始计算答案。因此,您将始终将标签的
文本之一设置为
“1”
。如果标签已经显示了
“1”
,那么它看起来好像“什么都没做”

因此,您应该将
correctCount
incorrectCounter
的声明移动到
CheckAnswerButton\u单击
方法之外:

//  Declare integer variables for the counters and set to 0
int correctCounter = 0;
int incorrectCounter = 0;
private void CheckAnswerButton_Click(object sender, EventArgs e)
{

    //  If the input is correct, +1 for the correct counter
    if (currentCountry.capital == capitalAnswerTextBox.Text)
    {
        correctCounter++;
        correctLabel.Text = correctCounter.ToString();
    }
    //  If the input is incorrect, +1 for the incorrect counter
    else
    {
        incorrectCounter++;
        incorrectLabel.Text = incorrectCounter.ToString();
    }
}

这样,在返回
CheckAnswerButton\u Click
后,它们将保留其值。

您的
int
变量都是本地定义的,因此,无论您单击按钮多少次,它们的值都从零开始。
++
。请参见:。是的,您说得对……我现在明白了。感谢您的快速帮助utton是有效的,只是你的代码中有一个bug。也许标题有误导性。也许更像“按下按钮后的结果不是预期的”会让这篇文章更清晰一些。