我正在使用 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 窗体应用程序)