我使用asp.net(c#)在visual studio中创建了一个系统,其中的问题来自数据库并显示给用户。
但问题正在重复,我无法弄清楚它有什么问题,而且还有一些问题没有显示出来。
下面是它的相关C#代码
public partial class Computertest : System.Web.UI.Page
{
public static SqlConnection sqlconn;
protected string PostBackStr;
protected void Page_Load(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection();
con.ConnectionString = "Data Source=SHAHBAAZ-PC;Initial Catalog=project;User ID=sa;Password=pass;";
PostBackStr = Page.ClientScript.GetPostBackEventReference(this, "time");
if (IsPostBack)
{
string eventArg = Request["__EVENTARGUMENT"];
if (eventArg == "time")
{
getNextQuestion();
}
}
}
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Visible = false;
txtName.Visible = false;
Button1.Visible = false;
Panel1.Visible = true;
lblName.Text = "Name : " + txtName.Text;
int score = Convert.ToInt32(txtScore.Text);
lblScore.Text = "Score : " + Convert.ToString(score);
Session["counter"] = "1";
Random rnd = new Random();
int i = rnd.Next(1, 6);//Here specify your starting slno of question table and ending no.
//lblQuestion.Text = i.ToString();
getQuestion(i);
}
protected void Button2_Click(object sender, EventArgs e)
{
getNextQuestion();
}
public void getQuestion(int no)
{
SqlConnection con = new SqlConnection();
con.ConnectionString = "Data Source=SHAHBAAZ-PC;Initial Catalog=project;User ID=sa;Password=pass;";
string str = "select * from ComputerQuestion where slNo=" + no + "";
SqlDataAdapter da2 = new SqlDataAdapter(str, con);
DataSet ds2 = new DataSet();
da2.Fill(ds2, "Question");
if (ds2.Tables[0].Rows.Count > 0)
{
DataRow dtr;
int i = 0;
while (i < ds2.Tables[0].Rows.Count)
{
dtr = ds2.Tables[0].Rows[i];
Session["Answer"] = Convert.ToString(Convert.ToInt32(dtr["Correct"].ToString()) - 1);
lblQuestion.Text = "Q." + Session["counter"].ToString() + " " + dtr["Question"].ToString();
RblOption.ClearSelection();
RblOption.Items.Clear();
RblOption.Items.Add(dtr["Option1"].ToString());
RblOption.Items.Add(dtr["Option2"].ToString());
RblOption.Items.Add(dtr["Option3"].ToString());
RblOption.Items.Add(dtr["Option4"].ToString());
i++;
}
}
}
public void getNextQuestion()
{
if (Convert.ToInt32(Session["counter"].ToString()) < 6)//10 is a counter which is used for 10 questions
{
if (RblOption.SelectedIndex >= 0)
{
if (Session["Answer"].ToString() == RblOption.SelectedIndex.ToString())
{
int score = Convert.ToInt32(txtScore.Text) + 1;// 1 for mark for each question
txtScore.Text = score.ToString();
lblScore.Text = "Score : " + Convert.ToString(score);
}
}
Random rnd = new Random();
int i = rnd.Next(1, 5);
//lblQuestion.Text = i.ToString();
getQuestion(i);
Session["counter"] = Convert.ToString(Convert.ToInt32(Session["counter"].ToString()) + 1);
}
else
{
Panel2.Visible = true;
}
}
任何帮助都会受到很多赞赏。
答案 0 :(得分:0)
您遇到的问题是每次都要创建一个新的Random
对象。您应该有一个实例,每次都调用Next
。
这是由于它的实施方式以及从时钟时间开始的种子这一事实。
请参阅Jon Skeets文章,获取有关如何解决问题的详细解释和建议:http://csharpindepth.com/Articles/Chapter12/Random.aspx
您似乎也可能只有6个问题,因此如果您有更多问题可供选择,重复问题的可能性会降低!同样在第二个电话中,您只选择问题1到5,如果第一次没有选择问题,则完全排除问题6。
解决方案:
它目前的工作方式不排除任何已经选择的问题再次被选中,因此我将使用的解决方案是检索所有(或子集)问题,然后将它们混洗。
从那里开始,按照当时的顺序选择它们,这样可以保证每次都能得到一个不同的问题。
答案 1 :(得分:0)
您好,问题在于您的随机功能。 如果你想确保只有在所有问题至少显示一个问题之后才会重复一个问题。
第1步:保留一个长度等于问题数的数组。
第2步:随机提问。
第3步:检查其ID是否存在于Array中。
If not present
add it to arrayand show the questions
else
get next random question repeat the check
步骤3:,然后将项目添加到数组检查
if array full make array empty and add new question ID
重复整个步骤