如何在将答案从数据集随机分配给按钮文本属性时获得测验的正确答案



我正在写一个测验,我使用4个按钮的文本属性来显示多选答案。1个是正确的,另外3个是错误的。

答案来自我的数据集,然后将答案随机分配给按钮文本属性,当用户选择一个答案时,它会移动到下一个问题,并按照应该的方式做同样的事情。

但我似乎不明白的是,既然我是随机分配答案的,我该如何跟踪所选的答案?这是代码。。。

Label1.Text = ds.Tables[0].Rows[myNum]["Question"].ToString();
string[] array = new string[4] {
ds.Tables[0].Rows[myNum]["CorrectAnswer"].ToString(),
ds.Tables[0].Rows[myNum]["WrongAnswer1"].ToString(),
ds.Tables[0].Rows[myNum]["WrongAnswer2"].ToString(), 
ds.Tables[0].Rows[myNum]["WrongAnswer3"].ToString(),
};

// randomize the ordering of the items
System.Random rnd = new System.Random();
array = array.OrderBy(x => rnd.Next()).ToArray();
// each time you run this, the correct answer will be in a different place:
btn1.Text = array[0];
btn2.Text = array[1];
btn3.Text = array[2];
btn4.Text = array[3];

myNum = myNum + 1;
if (myNum == numOfRows)
Response.Redirect("~/Results.aspx");

我试过这个。。。

ds.Tables[0].Rows[myNum]["CorrectAnswer"].ToString() + "1",
ds.Tables[0].Rows[myNum]["WrongAnswer1"].ToString() + "0",
ds.Tables[0].Rows[myNum]["WrongAnswer2"].ToString() + "0", 
ds.Tables[0].Rows[myNum]["WrongAnswer3"].ToString() + "0",

不出所料,它根本不起作用,但我尝试了任何方法。

有什么想法吗?

感谢

当您打乱数组时,您将无法跟踪正确的解决方案。这不是你想要的。您应该始终能够从代码中判断哪个按钮将被分配正确答案。这并不意味着你应该知道这个按钮有哪个id,而是应该知道它是如何分配的。

例如,您可以做的一件事是打乱按钮对象的数组,并始终将正确答案分配给该数组中的第一个索引。

因此,您创建了一个按钮对象数组,对其进行混洗。您将correctAnswerClick处理程序和答案字符串分配给该数组中的第一个索引(0)。将falseClick和错误答案分配给索引1、2和3。通过这种方式,您总是知道正确的按钮具有正确的事件处理程序。

下面的代码是你想在Winforms中实现的(我在VS.Net atm中没有安装ASP),但我认为它应该很容易翻译成ASP.Net。

button1到button4在您的情况下被命名为btn1到btn4。

public partial class Form1 : Form
{
private void Form1_Load(object sender, EventArgs e)
{
var btnns = new List<Button>();
btnns.Add(button1);
btnns.Add(button2);
btnns.Add(button3);
btnns.Add(button4);
//Shuffle the list
Shuffle<Button>(ref btnns);
//Add an event handler for success to your first button
btnns[0].Click += successClick;
btnns[0].Text = "Correct";
for (int i = 1; i < btnns.Count; i++)
{
btnns[i].Click += failedClick;
btnns[i].Text = "Wrong " + i;
}

}
private void failedClick(object sender, EventArgs e)
{
//Add a true value to the viewstate list
AddAnswer(true);
} 
private void successClick(object sender, EventArgs e)
{
//Yay, it's correct
AddAnswer(false);
}
public void AddAnswer(bool correctornot)
{
//I am not 100% sure about the code below (not tested), but it should give you an idea
if (Session["listOfAnswers"] != null)
{
var currentList = (List<bool>) Session["listOfAnswers"];
currentList.Add(correctornot);
Session["listOfAnswers"] = currentlist;
}
else
{
var currentlist = new List<bool>();
currentlist.Add(correctornot);
Session["listOfAnswers"] = currentlist;
}
}
public void Shuffle<T>(ref List<T> list)
{
Random rng = new Random();
int n = list.Count;
while (n > 1)
{
n--;
int k = rng.Next(n + 1);
T value = list[k];
list[k] = list[n];
list[n] = value;
}
}
}

答案取自这里:随机化列表<T>

相关内容

最新更新