如何解决C#如何在循环中包含按钮单击事件
我正尝试使用xamarin构建测验应用。
我遇到一个问题,当我按下按钮(当我回答问题时)时,循环不会返回。
基本上,我有一个测验应用程序,当我回答这个问题时,MysqL读取器必须再次运行,并且应该给我表的第二条记录,而在另一个答案上,我应该给我显示表的第三条记录。
这是我的代码。
for (int soruid = 1; soruid < sorusayisi; soruid++)
{
con.open();
MysqLCommand sorualıcıx = new MysqLCommand("SELECT * FROM " + Testler.testno + " WHERE soruid= " + sorusayaci + " ",con);
MysqLDataReader oku = sorualıcıx.ExecuteReader();
while (oku.Read())
{
Random rastgele = new Random();
int rndm = rastgele.Next(5);
if (rndm < 2)
{
a.Text = oku.GetString("cevap");
soru.Text = oku.GetString("soru");
b.Text = oku.GetString("yanliscevap1");
c.Text = oku.GetString("yanliscevap2");
d.Text = oku.GetString("yanliscevap3");
correctanswer = true;
cevapa = true;
cevapb = false;
cevapc = false;
cevapd = false;
}
else if (rndm == 2)
{
b.Text = oku.GetString("cevap");
soru.Text = oku.GetString("soru");
a.Text = oku.GetString("yanliscevap1");
c.Text = oku.GetString("yanliscevap2");
d.Text = oku.GetString("yanliscevap3");
cevapb = true;
cevapa = false;
cevapc = false;
cevapd = false;
}
......
a.Clicked += A_Clicked;
b.Clicked += B_Clicked;
c.Clicked += C_Clicked;
d.Clicked += D_Clicked;
void D_Clicked(object sender,EventArgs e)
{
if (cevapd == true)
{
sorusayaci++;
d.BackgroundColor = Color.Green;
a.IsEnabled = false;
b.IsEnabled = false;
c.IsEnabled = false;
}
else if (cevapa == true)
{
sorusayaci++;
a.BackgroundColor = Color.Green;
d.BackgroundColor = Color.Red;
b.IsEnabled = false;
c.IsEnabled = false;
}
else if (cevapb == true)
{
sorusayaci++;
b.BackgroundColor = Color.Green;
d.BackgroundColor = Color.Red;
a.IsEnabled = false;
c.IsEnabled = false;
}
else
{
sorusayaci++;
c.BackgroundColor = Color.Green;
d.BackgroundColor = Color.Red;
a.IsEnabled = false;
b.IsEnabled = false;
}
}
void C_Clicked(object sender,EventArgs e)
{
if (cevapc == true)
{
sorusayaci++;
c.BackgroundColor = Color.Green;
a.IsEnabled = false;
b.IsEnabled = false;
d.IsEnabled = false;
}
else if (cevapa == true)
{
sorusayaci++;
a.BackgroundColor = Color.Green;
c.BackgroundColor = Color.Red;
b.IsEnabled = false;
d.IsEnabled = false;
}
else if (cevapb == true)
{
sorusayaci++;
b.BackgroundColor = Color.Green;
c.BackgroundColor = Color.Red;
a.IsEnabled = false;
d.IsEnabled = false;
}
else
{
sorusayaci++;
d.BackgroundColor = Color.Green;
c.BackgroundColor = Color.Red;
a.IsEnabled = false;
b.IsEnabled = false;
}
}
for循环的括号位于代码的结尾。
解决方法
我想这里的目标是创建一个状态机。即用户单击的每个按钮都将进入一个新状态,其他按钮则需要单击。
一种模式是让async/await构建状态机。这可能更易于阅读,因为它允许您以一种相当直接的方式编写方法,即类似这样的方法:
struct stat
要执行此操作,您需要一个任务,该任务在用户按下按钮或执行其他操作时完成。可以使用以下方法完成此操作:
for each question
show question
await users answer
if( answer is correct )
continue
else
show error
break
只需将MyClass替换为按钮或要在事件上侦听的任何类。请注意,只有在事件触发时才会删除事件处理程序,因此,如果它从不触发,则可能导致事件处理程序泄漏。您还可以使用Task.WhenAny或WhenAll处理多个事件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。