C# 为什么我的disableButtons方法不起作用?

C# 为什么我的disableButtons方法不起作用?,c#,C#,我目前正在为C#做一个学校项目,我正在做Tic-Tac-Toe。 不过我有点小问题 我的代码在构建记分板之前一直工作得很好 我认为记分牌否决了无效按钮。。在我添加记分牌之前,它工作得非常好 有人能看看我的代码,告诉我出了什么问题吗 它应该是这样工作的: 播放,如果有赢家,禁用按钮。请帮帮我 编辑:我不知道为什么我的命名空间在这个文本字段中 namespace Tic_Tac_Toe { public partial class Form1 : Form { boo

我目前正在为C#做一个学校项目,我正在做Tic-Tac-Toe。 不过我有点小问题

我的代码在构建记分板之前一直工作得很好

我认为记分牌否决了无效按钮。。在我添加记分牌之前,它工作得非常好

有人能看看我的代码,告诉我出了什么问题吗

它应该是这样工作的:

播放,如果有赢家,禁用按钮。请帮帮我

编辑:我不知道为什么我的命名空间在这个文本字段中

namespace Tic_Tac_Toe
{
    public partial class Form1 : Form
    {
        bool turn = true; //true = x en false = o
        int turn_count = 0;
        static String player1, player2;

        public Form1()
        {
            InitializeComponent();
        }

        public static void setPlayerName(String n1, String n2)
        {
            player1 = n1;
            player2 = n2;
        }

        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Gemaakt door Luca Fraser", "About");
        }

        private void button_click(object sender, EventArgs e)
        {
            Button b = (Button)sender;
            if (turn)
                b.Text = "X";
            else
                b.Text = "O";

            turn = !turn;
            b.Enabled = false;
            turn_count++;
            checkForWinner();

            if (turn_count % 2 == 0)
            {
                lblTurn.Text = player1 + " is aan de beurt";
            }
            else
            {
                lblTurn.Text = player2 + " is aan de beurt";
            }
        }

        private void checkForWinner()
        {
            bool thereIsWinner = false;

            //Horizontaal checken
            if((btnA1.Text == btnA2.Text) && (btnA2.Text == btnA3.Text) && (!btnA1.Enabled))
                thereIsWinner = true;
            else  if((btnB1.Text == btnB2.Text) && (btnB2.Text == btnB3.Text) && (!btnB1.Enabled))
                thereIsWinner = true;
            else if((btnC1.Text == btnC2.Text) && (btnC2.Text == btnC3.Text) && (!btnC1.Enabled))
                thereIsWinner = true;

            //Verticaal checken
            if ((btnA1.Text == btnB1.Text) && (btnB1.Text == btnC1.Text) && (!btnA1.Enabled))
                thereIsWinner = true;
            else if ((btnA2.Text == btnB2.Text) && (btnB2.Text == btnC2.Text) && (!btnA2.Enabled))
                thereIsWinner = true;
            else if ((btnA3.Text == btnB3.Text) && (btnB3.Text == btnC3.Text) && (!btnA3.Enabled))
                thereIsWinner = true;

            //Diagonaal checken
            if ((btnA1.Text == btnB2.Text) && (btnB2.Text == btnC3.Text) && (!btnA1.Enabled))
                thereIsWinner = true;
            else if ((btnA3.Text == btnB2.Text) && (btnB2.Text == btnC1.Text) && (!btnC1.Enabled))
                thereIsWinner = true;


            if (thereIsWinner)
            {
                disableButtons();

                String winner = "";
                if (turn)
                {
                    winner = player2;
                    lblO.Text = (Int32.Parse(lblO.Text) + 1).ToString();
                }
                else
                {
                    winner = player1;
                    lblX.Text = (Int32.Parse(lblX.Text) + 1).ToString();
                }
                MessageBox.Show(winner + " wins!");
            }
            else
            {
                if (turn_count == 9)
                {
                    lblDraw.Text = (Int32.Parse(lblDraw.Text) + 1).ToString();
                    MessageBox.Show("It's a draw!");
                }
            }

        }

        private void disableButtons()
        {
            try
            {
                foreach (Control c in Controls)
                {
                    Button b = (Button)c;
                    b.Enabled = false;
                }
            }
            catch { }
        }

        private void newGameToolStripMenuItem_Click(object sender, EventArgs e)
        {
            turn = true;
            turn_count = 0;

                foreach (Control c in Controls)
                {
                    try
            {
                        Button b = (Button)c;
                        b.Enabled = true;
                        b.Text = "";
                }
                    catch { }
            }

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Form2 formtwo = new Form2();
            formtwo.ShowDialog();
            lblXcount.Text = player1;
            lblOcount.Text = player2;
            lblTurn.Text = player1 + " is aan de beurt";
        }

        private void mouse_enter(object sender, EventArgs e)
        {
            Button b = (Button)sender;
            if (b.Enabled)
            {
                if (turn)
                {
                    b.Text = "X";
                }
                else
                    b.Text = "O";
            }
        }

        private void mouse_leave(object sender, EventArgs e)  
        {
             Button b = (Button)sender;
             if (b.Enabled)
            {
                b.Text = "";
            }

        }

        private void resetWinCountToolStripMenuItem_Click(object sender, EventArgs e)
        {
            lblO.Text = "0";
            lblX.Text = "0";
            lblDraw.Text = "0";
        }

        private void lblOcount_Click(object sender, EventArgs e)
        {

        }

        private void lblOcount_TextChanged(object sender, EventArgs e)
        {

        }
        }
    }
在这里:

当您在不是按钮的控件上迭代时,会出现异常,循环结束

您可以尝试以下方法:

    foreach (Control c in Controls)
    {
        Button b = c as Button;
        if(b != null)
            b.Enabled = false;
    }
您需要检查控件是否为按钮,否则将引发异常


这是一个极好的例子,说明了为什么接受异常是一个坏主意。如果您报告或记录了异常,问题就会很明显。

如果失败并引发异常,您现有的代码将尝试将每个控件解析为
按钮。你抓住它,什么也没发生

尝试此代码并仅获取要禁用的
按钮
s:

foreach (Button btn in this.Controls.OfType<Button>())
{
    btn.Enabled = false;
}
foreach(此.Controls.OfType()中的按钮btn)
{
btn.Enabled=false;
}

建议:在开发过程中注释
catch
块代码,因为在异常发生的时间和地点很容易调试。

或者,您可以添加Linq:Controls.OfType()而不处理异常。。
private void disableButtons()
{
    try
    {

        foreach (Control c in Controls)
        {

            Button b = c as Button;
            if(b != null)
                b.Enabled = false;
        }
    }
    catch (Exception e) 
    { 
        Console.Writeline(e.ToString());
    }
} 
foreach (Button btn in this.Controls.OfType<Button>())
{
    btn.Enabled = false;
}