【问题标题】:Windows Forms - how to exclude button from the whole setWindows 窗体 - 如何从整个集合中排除按钮
【发布时间】:2013-01-27 17:44:51
【问题描述】:

我有一个仅包含 buttonsWindows Form。最终目标是制作一个我看到的简单逻辑游戏,但现在的问题是我想在点击我的New 按钮时执行不同的操作,但现在它是表单中所有buttons 的一部分,所以有时对他也执行了不应该发生的动作。为了清楚起见,我有两个屏幕截图:

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

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

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

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

【问题讨论】:

  • 您的按钮与其他按钮的文本是否不同?如果是这样,您可以: if (ctl is Button) { if (ctl.text != "New) ... ?
  • @Andris 这在技术上是可行的,但却是你能做的最不优雅的解决方案。还有很多其他方法可以做到这一点,从而使该过程也可以在其他情况下使用。

标签: c# winforms visual-studio-2010


【解决方案1】:

很可能最简单的解决方案是将网格放在自己的面板中(pnlGrid)。把所有的按钮都放在那里,然后你就可以改为:

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

【讨论】:

  • 目前听起来最简单
  • 当您想删除它们时,这也会使事情变得容易得多。您只需清除面板中的所有控件,无需担心“新建”按钮会被移除。
  • 是的,我认为您的建议最接近我需要的全部功能,非常感谢。会接受的。
  • 如果您有任何特定于该网格中按钮行为的逻辑,甚至可能值得将其作为一个完全独立的用户控件。您可以在构造函数中获取要创建的按钮数量,这样您就可以将逻辑与具有新按钮的控件分开。
  • 谢谢。我先自己试试看有没有问题再问:)
【解决方案2】:

不要循环遍历控件,而是将所有矩阵按钮添加到列表中,并将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)
    {
        ...
    }
}

【讨论】:

  • 不想在这里自大,但在我看来,这比 krillgar 的方法更好。不需要不必要的面板,一切都在一个列表中。您还可以比面板更容易地编辑列表(例如,foreach 循环要简单得多),您仍然可以通过简单地删除列表来删除所有按钮。但是使用最适合你的方法:)
  • @Mahi 您可能会获得Populist 徽章,因为您获得的点赞数比接受的答案多:-)
  • 是的,事实上我更喜欢你的决定。但是对于我的确切需求Krillgar's 答案效果最好。这就是选择他的原因,但是即使我只是一个初学者,我也会说你的想法要优雅得多。我可以欣赏一个好主意:)
  • 我非常怀疑获得徽章。 ^^ 然后使用他的解决方案,只是说我的意见。希望你能让程序运行起来:)
【解决方案3】:

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

你也可以使用 Tag 属性来做这个浇注,但我认为继承会更清楚,为你的代码添加语义。

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    相关资源
    最近更新 更多