我正在使用 Windows 窗体和 C# 进行测验,但它一直显示相同的问题

Posted

技术标签:

【中文标题】我正在使用 Windows 窗体和 C# 进行测验,但它一直显示相同的问题【英文标题】:Im making a quiz using windows forms and C# but it keeps displaying the same question 【发布时间】:2020-09-17 12:22:38 【问题描述】:

它从 .txt 文件中读取问题/答案/主题等,并将其存储在一个名为“questionArray”的数组中,该数组由逗号分割成另一个名为“splitDetails”的数组。 if 语句从列表中选择特定难度级别和主题的问题,并创建一个 MultipleChoice 类型的新问题“newQ”,该问题具有 QuestionText、Choice1、Choice2 等属性,并将其添加到名为“allQuestions”的列表中。 populateTextboxes() 从“allQuestions”列表中选择一个随机问题并将其设置为类型为 MultipleChoice 的对象“currentQ”,然后将其从列表中删除,使其不再显示。


if (File.Exists("MultipleChoice questions.txt")) //checking file exists

   string[] questionArray = File.ReadAllLines("MultipleChoice questions.txt"); //create array of all questions 

   foreach (string Q in questionArray)
   
        string[] splitDetails = Q.Split(',');  //create new array split by commas
if (splitDetails[6] == Quiz.DifficultyLevel && splitDetails[7] == Quiz.CurrentTopic)
       
            newQ.QuestionText = splitDetails[0]; 
              newQ.Choice1 = splitDetails[1];
              newQ.Choice2 = splitDetails[2];
              newQ.Choice3 = splitDetails[3];
              newQ.Choice4 = splitDetails[4];
              newQ.Answer = splitDetails[5];
              newQ.Difficulty = splitDetails[6];
              newQ.Topic = splitDetails[7];
              newQ.QuestionType = splitDetails[8]; 

              allQuestions.Add(newQ); 

         
      
   
   Else MessageBox.Show("No question file found", "File not found");


//add text to blank question form
public MultipleChoice populateTextboxes() 

  Random myNum = new Random();

  if (allQuestions.Count > 0)
  
    questionCount += 1;

       //select random question from all questions
       int randomNumber = myNum.Next(0, allQuestions.Count);
       currentQ = allQuestions[randomNumber];
       allQuestions.Remove(currentQ);//remove used uestion so it isnt used again
  

  //when the round is over (3 questions asked)
  if (questionCount == 4) 
  
    //open keyboardQuestion
    this.Close();
    KeyboardInput k = new KeyboardInput();
    k.Show();

   

   lblQuestion.Text = currentQ.QuestionText; 
   btnChoice1.Text = currentQ.Choice1;
   btnChoice2.Text = currentQ.Choice2;
   btnChoice3.Text = currentQ.Choice3;
   btnChoice4.Text = currentQ.Choice4;

   return currentQ;


【问题讨论】:

我会在 populateTextboxes() 方法的顶部设置一个断点,并在每次执行时单步执行。应该很容易发现问题。 【参考方案1】:

我敢打赌它总是显示最后一个问题?

如果 newQ 是全局声明的,那么该代码将生成一堆不同的问题,这些问题实际上都由同一个对象组成。 allQuestions.add() 行将继续将相同的对象添加到集合中。您可以在将其添加到集合之前或之后更改其中一个属性,它将在所有问题中发生变化。想象一下 10 个人阅读同一篇报纸文章。你想要的是 1 个人阅读 10 篇不同的文章,真的。

在 foreach() 循环内本地声明 newQ,这将导致在每次迭代期间创建一个具有唯一属性的新对象。

【讨论】:

以上是关于我正在使用 Windows 窗体和 C# 进行测验,但它一直显示相同的问题的主要内容,如果未能解决你的问题,请参考以下文章

使用数据库、C# windows 窗体应用程序存储和检索颜色

在 C# WPF 或 Windows 窗体应用程序中使用 DirectX c++ DLL

在 C# 中对 dataGridView 列进行排序? (Windows 窗体)

在 C# 中使用多线程屏蔽/过滤图像(Windows 窗体应用程序)

为啥我的图片框动画没有按预期工作(C# Windows 窗体应用程序)?

在 C# 中使用不同的父控件对 Windows 窗体单选按钮进行分组