3

我有一个Windows Form只包含buttons. 最终目标是制作一个我看到的简单逻辑游戏,但现在的问题是我想在New单击按钮时执行不同的操作,但现在它是buttons表单中所有内容的一部分,因此有时会对他执行操作也不应该发生。为了让自己清楚,我有两个屏幕截图:

在此处输入图像描述

所以这就是我想要的样子——我有一个矩阵——3x3(在这种情况下,最后它可以是NxN)。通过单击New,我希望能够做各种事情,其中​​之一就是将N按钮设置为红色。现在发生的事情是有时我的New按钮也会被绘制,因为我会像这样查看按钮:

 foreach (Control c in this.Controls) 
                        {
                            if (c is Button)
                            {
                 ...

因此有时也会New被选中,所以我最终得到了这个:

在此处输入图像描述

我现在在想的只是在我需要时在代码中执行检查并New明确排除我的按钮,但我认为这不是一个好方法,因为我最终可能会在很多地方用代码做这件事我的程序那么在这种情况下正确的解决方案是什么?如果需要一些代码,请询问。

4

3 回答 3

7

不要循环遍历控件,而是将所有矩阵按钮添加到列表中,并将new按钮分开:

private Button[] buttons;
private Button newButton;

现在您可以添加任意数量的按钮:

for (int i = 0; i < 9; i++)
{
    buttons[i] = new Button();
    buttons[i].Text = "Button" + i;
    Controls.Add(buttons[i])
}

最后,您的New按钮将循环播放buttons

private void newButton_Click(object sender, EventArgs e)
{
    foreach (Button b in buttons)
    {
        ...
    }
}
于 2013-01-27T17:50:08.310 回答
7

很可能最简单的解决方案是将 Grid 放在它自己的 Panel ( pnlGrid) 中。将所有按钮放在那里,然后您可以执行以下操作:

foreach (Control ctl in pnlGrid.Controls) { 
    if (ctl is Button) {
        // Do your logic here
    }
}
于 2013-01-27T17:51:01.010 回答
0

您可以从按钮类继承。制作您自己的按钮,使用此控件(将具有与父控件相同的功能)作为集合,并在您遍历控件时检查它。

您也可以为此浇注使用 Tag 属性,但我认为继承会更清晰,为您的代码添加语义含义。

于 2013-01-27T17:49:49.073 回答