【问题标题】:switch statement not applying a button tag as expectedswitch 语句未按预期应用按钮标记
【发布时间】:2015-07-30 05:11:15
【问题描述】:

在我的程序中,switch 语句用于分配特定按钮的特定属性,其中一个属性是为用户需要单击以正确回答问题的按钮分配“正确”标签。我遇到的问题是,由于某种原因,当只有带有“正确”标签的按钮应该这样做时,不正确的按钮会显示“你猜对了”消息。

        public void SetButtonContent(string chosenMetal, TextBlock reagentText, TextBlock transMetalText,
        Button opt1, Button opt2, Button opt3, Button opt4, Button opt5, Button opt6, Button opt7, Button opt8)
    {
        string pickedMetal = chosenMetal;
        string pickedReagent = CycleThroughReagents();

        reagentText.Text = pickedReagent;
        transMetalText.Text = pickedMetal;

        BrushConverter bc = new BrushConverter();
        switch (pickedMetal)
        {
            case "Copper": //this is only one out of six cases, but all the cases have relatively the same format.
                opt1.Content = string.Format("{0} \n {1} \n{2}", Cu.hexAqColour, Cu.hexAqFormula, Cu.hexAqState);
                opt1.Background = Brushes.Blue;

                opt2.Content = string.Format("{0} \n {1} \n{2}", Cu.dilNaOHRctColour, Cu.dilNaOHRctFormula, Cu.dilNaOHRctState);
                opt2.Background = Brushes.Blue;

                opt3.Content = string.Format("{0} \n {1}", Cu.excessNaOHColour, Cu.excessNaOHFormula, Cu.excessNahOHState);
                opt3.Background = Brushes.Blue;

                opt4.Content = string.Format("{0} \n {1} \n{2}", Cu.dilNH3RctColour, Cu.dilNH3RctFormula, Cu.dilNH3RctState);
                opt4.Background = Brushes.Blue;

                opt5.Content = string.Format("{0} \n {1} \n{2}", Cu.ExcessNH3Colour, Cu.ExcessNH3Formula, Cu.ExcessNH3State);
                opt5.Background = Brushes.DarkBlue;

                opt6.Content = string.Format("{0} \n {1} \n{2}", Cu.saltRctColour, Cu.saltRctFormula, Cu.saltRctState);

                opt7.Content = string.Format("{0} \n {1} \n{2}", Cu.Na2CO3RctColour, Cu.Na2CO3RctFormula, Cu.Na2CO3RctState);
                opt7.Background = Brushes.Blue;

                opt8.Content = string.Format("{0} \n {1} \n{2}", Cu.ClRctColour, Cu.ClRctFormula, Cu.ClRctState);
                opt8.Background = Brushes.Yellow;

                if (pickedReagent == reagentsList[0])
                    opt1.Tag = "correct";

                if (pickedReagent == reagentsList[1] || pickedReagent == reagentsList[3])
                    opt2.Tag = "correct";
                    opt4.Tag = "correct";

                if (pickedReagent == reagentsList[2] || pickedReagent == reagentsList[5])
                    opt3.Tag = "correct";
                    opt6.Tag = "correct";

                if (pickedReagent == reagentsList[4])
                    opt5.Tag = "correct";

                if (pickedReagent == reagentsList[6])
                    opt7.Tag = "correct";

                else
                    opt8.Tag = "correct";
                break;



            default:
                break;
        }
    }

上面的方法是用来设置按钮内容的,然后下面的方法在我的'MainWindow'代码中来处理每个被点击的按钮。

    public void CheckForCorrect(Button button)
    {
        if ((string)button.Tag == "correct" && amtLeft != 0)
        {
            amtLeft -= 1;
            MessageBox.Show("You guessed correct!");
            _GameControl.SetButtonContent(chosenMetal, ReagentAdded, transMetal, Opt1, Opt2, Opt3, Opt4, Opt5, Opt6, Opt7, Opt8);
            button.IsEnabled = false;
        }

        if ((string)button.Tag != "correct" && amtLeft != 0)
        {
            MessageBox.Show("Oops!");
        }

        if (amtLeft == 0)
        {
            SwitchMetals();
        }


    }

按钮内容首先在“MainWindow()”类中设置,是在程序中执行“SetButtonContent”时的第一个实例。

public MainWindow()
    {
        InitializeComponent();
        chosenMetal = "Copper";
        _GameControl.SetButtonContent(chosenMetal,ReagentAdded, transMetal, Opt1, Opt2, Opt3, Opt4, Opt5, Opt6, Opt7, Opt8);

        Opt1.Click += HandleButtonClicks;
        Opt2.Click += HandleButtonClicks;
        Opt3.Click += HandleButtonClicks;
        Opt4.Click += HandleButtonClicks;
        Opt5.Click += HandleButtonClicks;
        Opt6.Click += HandleButtonClicks;
        Opt7.Click += HandleButtonClicks;
        Opt8.Click += HandleButtonClicks;  
    }

任何帮助和建议将不胜感激,因为我不确定发生这种情况是否会出错。

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    如果 if 语句中有多行代码,则需要用花括号将它们括起来。

    在上面的代码中,opt4 和 opt 6 将始终设置为“正确”,因为它们位于 if 语句之外。

    另外,如果所有的 if 情况都是独占的,你应该要么完全指定它们,要么使用else if。你的代码现在的样子,如果pickedReagent 是除reagentsList[6] 之外的任何东西,那么 opt8 总是设置为“正确”。

    带有这些修复的代码:

    if (pickedReagent == reagentsList[0])
    {
        opt1.Tag = "correct";
    }
    else if (pickedReagent == reagentsList[1] || pickedReagent == reagentsList[3])
    {
        opt2.Tag = "correct";
        opt4.Tag = "correct";
    }
    else if (pickedReagent == reagentsList[2] || pickedReagent == reagentsList[5])
    {
        opt3.Tag = "correct";
        opt6.Tag = "correct";
    }
    else if (pickedReagent == reagentsList[4])
    {
        opt5.Tag = "correct";
    }
    else if (pickedReagent == reagentsList[6])
    {
        opt7.Tag = "correct";
    }
    else 
    {
        opt8.Tag = "correct";
    }
    

    【讨论】:

    • 啊啊啊谢谢!我不敢相信我犯了这样一个基本错误哈哈
    【解决方案2】:
    if (pickedReagent == reagentsList[1] || pickedReagent == reagentsList[3])
                        opt2.Tag = "correct";
                        opt4.Tag = "correct";
    

    如果该语句为真,此语句是否打算同时设置 opt2.Tag 和 opt4.Tag?其写入 opt4.Tag 的方式将始终正确,opt6.Tag 也将正确

    【讨论】:

    • 是的,这应该会发生,因为两个按钮具有相同的内容
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多