将不同的东西组合在一起,以便用最少的代码一次性激活/停用它们

时间:2017-06-10 03:39:15

标签: c#

我对C#了解不多,所以如果我的问题在其他地方得到解答,我会提前道歉。我不知道要搜索什么。

我在Windows窗体中制作了一个tic tac toe游戏。我把它设置成这样:每个单元格有2个按钮(x和o)和两个标签(X和O)。单击其中一个按钮会将相应标签的visible属性更改为true,同时禁用(enable = false)选择相反的按钮。总共有9个细胞。我还有一个菜单按钮(重置),单击该按钮将启用所有按钮并隐藏所有标签,以便可以重新播放游戏。

我正在寻找一种方法来重置我想要的所有项目,而无需为每个项目单独输入代码。有没有办法将这些项目组合在一起,以便用最少的代码一次性解决这些问题?

源代码不完整,因为我还在编写程序。我已经发布了三个单元格的代码。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Tick_Tack_Toe
{
    public partial class Form1 : Form
    {   
        public Form1()
        {
            InitializeComponent();
        }

        private void xButton1_Click(object sender, EventArgs e)
        {
            xLabel1.Visible = true;
            oButton1.Enabled = false;
        }

        private void oButton1_Click(object sender, EventArgs e)
        {
            oLabel1.Visible = true;
            xButton1.Enabled = false;
        }

        private void xButton2_Click(object sender, EventArgs e)
        {
            xLabel2.Visible = true;
            oButton2.Enabled = false;
        }

        private void oButton2_Click(object sender, EventArgs e)
        {
            oLabel2.Visible = true;
            xButton2.Enabled = false;
        }
        private void resetToolStripMenuItem_Click(object sender,
        EventArgs e)
        {
            xButton1.Enabled = true;
            oButton1.Enabled = true;
            xButton2.Enabled = true;
            oButton2.Enabled = true;
            xButton3.Enabled = true;
            oButton3.Enabled = true;
            xLabel1.Visible = false;
            oLabel1.Visible = false;
            xLabel2.Visible = false;
            oLabel2.Visible = false;
            xLabel3.Visible = false;
            oLabel3.Visible = false;
        }
    }
}   

4 个答案:

答案 0 :(得分:2)

您可以这样做的一种方法是循环控件集合。由于您似乎对控件的命名有一个标准,因此您可以先将集合缩小到只有名称以' o'或者' x'。然后,您可以查看控件的类型,如果它是标签,您可以隐藏它,如果它是一个按钮,您可以启用它:

private void ResetControls()
{
    foreach (Control control in this.Controls)
    {
        // Only look at controls whose names begin with 'o' or 'x'
        if (control.Name.StartsWith("o") ||control.Name.StartsWith("x"))
        {
            // Hide it if it's a label
            if(control.GetType() == typeof(Label))
            {
                control.Visible = false;
            }
            // Enable it if it's a button
            else if (control.GetType() == typeof(Button))
            {
                control.Enabled = true;
            }
        }
    }
}

你提到你所有的按钮和标签都在他们自己的面板控件中,它有自己的控件集合。因此,您可以修改上面的代码,首先搜索面板控件,然后在面板控件的控件集中搜索按钮和标签:

private void ResetControls()
{
    foreach (Control control in this.Controls)
    {
        if (control is Panel)
        {
            var panel = control as Panel;
            foreach (Control panelControl in panel.Controls)
            {
                // Only look at controls whose names begin with 'o' or 'x'
                if (panelControl.Name.StartsWith("o") || panelControl.Name.StartsWith("x"))
                {
                    // Hide it if it's a label
                    if (panelControl is Label)
                    {
                        panelControl.Visible = false;
                    }
                    // Enable it if it's a button
                    else if (panelControl is Button)
                    {
                        panelControl.Enabled = true;
                    }
                }
            }
        }                
    }
}

请注意,这只是一种可行的解决方案,但肯定不是最好的。通常,控件将在运行时创建,添加到某种类型的集合(通常是一个名为GameBoard的数组或类似的类型),并通过代码放在表单上。他们的点击事件都将连接到同一个方法,这将根据控件名称或Tag字段中的某些数据执行正确的操作。

答案 1 :(得分:0)

它们在表单的Controls数组中组合在一起。这是一个如何循环使用它们的简单示例:

private void doReset()
{
    foreach (Control c in this.Controls)
    {
        if (c.GetType() == typeof(Button))
        {
            c.Enabled = true;
        }
        else if (c.GetType() == typeof(Label))
        {
            c.Visible = false;
        }
    }
}

如果您愿意,可以在那里为特定控件执行更智能的逻辑。如果通过方法获取标签,则为每个按钮添加标签,或者如果要通过该方法获取,则以某种方式命名每个按钮。

答案 2 :(得分:-3)

让我们尝试一下这个想法:

List<Button> buttons = new List<Button>();
List<Label> labels = new List<Label>();

buttons.Add(xButton1)
buttons.Add(oButton1)
buttons.Add(xButton2)
buttons.Add(oButton2)
...

labels.Add(xLabel1)
labels.Add(oLabel1)
labels.Add(xLabel2)
labels.Add(oLabel2)
...

foreach(var ctr in buttons)
{
     ctr.Enabled = true;
}

foreach(var ctr in labels)
{
     ctr.Enabled = true;
}

答案 3 :(得分:-3)

这就是我经常这样做的方式。如果在click事件中为每个按钮指定不同的文本值,则可以根据文本值执行不同的操作。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Tick_Tack_Toe
{
    public partial class Form1 : Form
    {   
        public Form1()
        {
            InitializeComponent();

            MyButton.buttons = new List<MyButton>() { 
                new MyButton() { button = xButton1, label = xLabel1},
                new MyButton() { button = xButton2, label = xLabel2},
                new MyButton() { button = xButton3, label = xLabel3},
                new MyButton() { button = oButton1, label = oLabel1},
                new MyButton() { button = oButton2, label = oLabel2},
                new MyButton() { button = oButton3, label = oLabel3}
            };

            foreach (MyButton button in MyButton.buttons)
            {
                button.button.Click += new EventHandler(Button_Click);
            }

        }

        private void Button_Click(object sender, EventArgs e)
        {
            MyButton button = sender as MyButton;

            button.label.Visible = true;
            button.button.Enabled = false;

            switch (button.button.Text)
            {
                case "X":
                    //enter your code here
                    break;
                case "Y":
                    //enter your code here
                    break;
            }
        }

        private void resetToolStripMenuItem_Click(object sender,
        EventArgs e)
        {
            foreach (MyButton button in MyButton.buttons)
            {
                button.button.Enabled = true;
                button.label.Visible = false;
            }
        }
    }
    public class MyButton
    {
        public static List<MyButton> buttons { get; set; }
        public Button button { get; set; }
        public Label label { get; set; }
    }
}