我有一个以随机顺序从数据库中选择的脚本。
脚本是自动检查的模拟。我想要的是,如果已经选择了一个问题,则不再提取。
我该怎么做?另外,如果没有选择3 checkboxes
中的任何一个,当出现消息框时,它会选择另一个问题。 Select()
使用数据库中的值初始化标签,我在Load表单中使用它。
以下是我迄今为止尝试过的代码:
private void select()
{
string dataA = "SELECT * FROM questions order by rand()";
MySqlCommand cmd = new MySqlCommand(dataA, index.connect);
cmd.CommandType = CommandType.Text;
using (index.connect)
{
index.connect.Open();
MySqlDataReader rdr = cmd.ExecuteReader();
try
{
if (rdr.Read())
{
label2.Text = rdr["question"].ToString();
label2.AutoSize = true;
label2.UseCompatibleTextRendering = true;
label3.Text = rdr["answer1"].ToString();
label4.Text = rdr["answer2"].ToString();
label5.Text = rdr["answer3"].ToString();
option1 = checkBox1.Checked;
option2 = checkBox2.Checked;
option3 = checkBox3.Checked;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
index.connect.Close();
}
}
}
private void button1_Click(object sender, EventArgs e)
// in cazul in care raspunzi la o intrebare,
//iar aceasta ramane, orice a-i raspunde, pune la incorect
{
string dataA = "SELECT * FROM questions order by rand()";
MySqlCommand cmd = new MySqlCommand(dataA, index.connect);
cmd.CommandType = CommandType.Text;
using (index.connect)
{
index.connect.Open();
MySqlDataReader rdr = cmd.ExecuteReader();
if (rdr.Read())
{
label2.Text = rdr["question"].ToString();
label3.Text = rdr["answer1"].ToString();
label4.Text = rdr["answer2"].ToString();
label5.Text = rdr["answer3"].ToString();
option1 = checkBox1.Checked;
option2 = checkBox2.Checked;
option3 = checkBox3.Checked;
if (checkBox1.Checked == false &&
checkBox2.Checked == false &&
checkBox3.Checked == false)
{
MessageBox.Show("Bifati minim o casuta!");
//imi selecteaza alta intrebare
return;
}
else
{
if ((option1.ToString() == rdr["option1"].ToString()) &&
(option2.ToString() == rdr["option2"].ToString()) &&
(option3.ToString() == rdr["option3"].ToString()))
{
corect++;
label10.Text = corect.ToString();
checkBox1.Checked = false;
checkBox2.Checked = false;
checkBox3.Checked = false;
}
else
{
incorect++;
label12.Text = incorect.ToString();
checkBox1.Checked = false;
checkBox2.Checked = false;
checkBox3.Checked = false;
}
}
}
}
答案 0 :(得分:1)
您需要将已选择的问题排除在退还给您之外。
为此,您需要将方法返回的每个问题的ID存储在一个集合中,并使用该集合排除下一个选择的问题。
避免在数据库中使用标志,因为仅当只有一个应用程序实例在运行时才会起作用。如果有多个实例,则每个实例将提供不同的问题,并且应仅排除其收到的问题。
举例说明:
public class Question
{
public int Id {get; set;}
public string Text {get; set;}
public Answer[] Answers {get; set;}
}
public class QuestionSelector
{
private readonly List<int> _previousQuestionIds = new List<int>();
public Question NextQuestion()
{
var query = "select top 1 * from Questions ";
if(ids.Any())
{
var ids = String.Join(",", _previousQuestionIds.Select(id=>id.ToString()));
query += " where id not in (" + ids + ") ";
}
query += " order by rand()";
var question = ParseQuestion(query);
_previousQuestionIds.Add(question.Id);
return question;
}
private Question ParseQuestion(string query)
{
// query the database and convert the data from the returned row
}
}
上面的类只是在加载表单时创建它的一个实例,并调用NextQuestion()
方法来加载下一个问题。它将以一个空的id集合开始,这意味着在第一次调用时它不会排除任何问题,但每次调用NextQuestion()
方法时,它都会将返回的问题的id添加到列表中,并且下一次打电话的问题将被排除在外。