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

C# 如何在将答案从数据集随机分配到按钮文本属性时获得测验的正确答案,c#,asp.net,webforms,C#,Asp.net,Webforms,我正在写一个测验,我使用4个按钮文本属性来显示多项选择题答案。1是正确的,其他3个是错误的 答案来自我的数据集,然后随机将答案分配给按钮文本属性,当用户选择答案时,它会转到下一个问题,并按照它应该做的做相同的事情 但我似乎不明白的是,既然我是随机分配答案的,我该如何跟踪选择的答案?这是代码 Label1.Text = ds.Tables[0].Rows[myNum]["Question"].ToString(); string[] array = new string[4] { ds.T

我正在写一个测验,我使用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)。您将
错误单击和错误答案分配给索引1、2和3。这样,您总是知道正确的按钮具有正确的事件处理程序

下面的代码是您希望在Winforms中实现的(我没有在VS.NETATM中安装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;
        }
    }
}
公共部分类表单1:表单
{
私有void Form1\u加载(对象发送方、事件参数e)
{
var btnns=新列表();
添加(按钮1);
添加(按钮2);
添加(按钮3);
添加(按钮4);
//洗牌
洗牌(参考btnns);
//将成功事件处理程序添加到第一个按钮
btnns[0]。单击+=成功单击;
btnns[0]。Text=“正确”;
对于(int i=1;i1)
{
n--;
int k=下一个(n+1);
T值=列表[k];
列表[k]=列表[n];
列表[n]=值;
}
}
}

答案如下:

我想我明白你的意思,是不是。。。只需将答案分配给任何一个按钮,比如说第一个按钮,然后将其他答案分配给其余3个按钮,将它们放入一个数组,然后随机分配按钮数组?如果我错了,那么我已经迷路了。你有一个例子吗?我知道这听起来很奇怪,但我很少使用数组。其实没那么难。您有您的btn1、btn2、btn3和btn4。将它们添加到数组或列表中。var btnList=新列表();btnList.Add(btn1)。。等等。然后你将这个列表(这个站点上有很多解决方案)洗牌。您只需将处理程序分配给此列表的第一个索引,然后是btnList[0]。btn.Click+=新事件处理程序(correctAnswerClick);和btnList[0].Text=“正确的ANWR应该出现在这里”;对于列表的其余部分,你也可以对另一个处理程序执行同样的操作。我将尝试一下,然后我会发回它对我的作用。谢谢你,我迷路了。当我使用..btnList=btnList.OrderBy(x=>rnd.Next())时,我支持创建列表并将按钮添加到列表中;我遇到了一个错误,无法将Ienumberable转换为Generic(我试图修改我已经拥有的rnd,但看起来我错了),我在这里搜索了随机列表,但这对我帮助不大(因为我不理解它,一直与洗牌算法相关)。但是谢谢你的指导,我只是不知道如何做你所说的,我真的应该回到基础上来。你可以在你的视图状态中跟踪你的问题。假设您有一个用户将填写的10个问题的列表。然后创建一个长度为10的数组(或列表),并将其保存在ViewState中。当用户单击按钮(回答问题)时,您可以在事件处理程序(成功和失败)中调用一个函数,将布尔值转换为函数saveAnswer(bool correctornot)。然后将该值添加到viewstate中的列表中。代码见答案。(我的头顶,所以不确定它是否会工作)