Windows窗体 - 如何从整个集中排除按钮

Ler*_*ica 3 c# visual-studio-2010 winforms

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

在此输入图像描述

所以这就是我想要它的方式 - 我有一个矩阵 - 3x3(在这种情况下,最后它可以NxN).通过点击New我希望能够做各种各样的事情,其中​​一个是使N按钮变成红色.现在发生的事情有时我的New按钮也会被绘制,因为我按下这样的按钮:

 foreach (Control c in this.Controls) 
                        {
                            if (c is Button)
                            {
                 ...
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

小智 7

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

private Button[] buttons;
private Button newButton;
Run Code Online (Sandbox Code Playgroud)

现在您可以根据需要添加任意数量的按钮:

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

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

private void newButton_Click(object sender, EventArgs e)
{
    foreach (Button b in buttons)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)


kri*_*gar 7

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

foreach (Control ctl in pnlGrid.Controls) { 
    if (ctl is Button) {
        // Do your logic here
    }
}
Run Code Online (Sandbox Code Playgroud)