微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C#如何在循环中包含按钮单击事件

如何解决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 举报,一经查实,本站将立刻删除。