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

C# Windows窗体-如何从整个集合中排除按钮,c#,winforms,visual-studio-2010,C#,Winforms,Visual Studio 2010,我有一个Windows窗体,它只包含按钮。最后的目标是制作一个我看过的简单逻辑游戏,但现在的问题是,当我的New按钮被点击时,我想执行不同的操作,但现在它是表单中所有按钮的一部分,所以有时也会对他执行一个不应该发生的操作。为了清楚起见,我有两个截图: 这就是我想要的-我有一个矩阵-3x3(在这种情况下,最后它可以是NxN)。通过单击New我希望能够做各种事情,其中之一就是将N按钮涂成红色。现在发生的情况是,有时我的新建按钮也会被涂上颜色,因为我对按钮进行了如下操作: foreach (Con

我有一个
Windows窗体
,它只包含
按钮
。最后的目标是制作一个我看过的简单逻辑游戏,但现在的问题是,当我的
New
按钮被点击时,我想执行不同的操作,但现在它是表单中所有
按钮的一部分,所以有时也会对他执行一个不应该发生的操作。为了清楚起见,我有两个截图:

这就是我想要的-我有一个矩阵-3x3(在这种情况下,最后它可以是
NxN
)。通过单击
New
我希望能够做各种事情,其中之一就是将
N
按钮涂成红色。现在发生的情况是,有时我的<代码>新建按钮也会被涂上颜色,因为我对按钮进行了如下操作:

 foreach (Control c in this.Controls) 
                        {
                            if (c is Button)
                            {
                 ...
因此,有时
New
也会被选中,因此我最终得出以下结论:


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

您可以从button类继承。制作自己的按钮,对集合使用此控件(其功能与父控件相同),并在迭代控件时检查它


您也可以将Tag属性用于此pourpose,但我认为inherit将更加清晰,为代码添加语义含义。

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

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])
}

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

foreach (Control ctl in pnlGrid.Controls) { 
    if (ctl is Button) {
        // Do your logic here
    }
}

听起来是最简单的一刻,这也将使事情变得更容易,当你想删除他们。你只需清除面板上的所有控件,就不必担心新按钮会被移除。是的,我认为你的建议最接近我需要的全部功能,非常感谢。我会接受的。如果你对网格中按钮的行为有任何特定的逻辑,它甚至可以作为一个完全独立的用户控件。您可以在构造函数中输入要创建的按钮数量,这样您就可以将逻辑与具有新按钮的控件分开。谢谢。我会先试试自己,然后再问是否有问题:)你的按钮的文本是否与其他按钮的文本不同?如果是的话,你能不能:if(ctl是按钮){if(ctl.text!=“新建)…?@Andris这在技术上是可行的,但这是你能做的最不优雅的解决方案。有很多其他方法可以做到这一点,这将使这个过程也能够用于其他情况。在这里不要自大,但在我看来,这是比krillgar更好的方法。不需要不必要的面板,它都在一个列表中。Y您还可以比面板更容易地编辑列表(例如,
foreach
loop更简单)你仍然可以通过简单地删除列表来删除所有按钮。但是使用最适合你的方法:)@Mahi你可能会因为获得比公认答案更多的选票而获得徽章:-)是的,事实上我更喜欢你的决定。但是出于我的确切需要,
Krillgar的
answer效果最好。这就是选择他的原因,但是哟虽然我只是一个初学者,但你的想法要优雅得多。我很欣赏一个好主意:)我非常怀疑能否获得徽章。^^然后使用他的解决方案,我只是说我的意见。希望你能让程序运行:)
foreach (Control ctl in pnlGrid.Controls) { 
    if (ctl is Button) {
        // Do your logic here
    }
}