【问题标题】:Change background colour of button after multiple buttons are clicked单击多个按钮后更改按钮的背景颜色
【发布时间】:2015-01-26 14:38:16
【问题描述】:

我正在使用 Visual C# 2010

我有一个包含大约 24 个按钮和一个“完成”按钮的 Windows 窗体

目前“完成”按钮是红色的。单击所有其他按钮后,我希望此按钮的颜色变为绿色。

当用户点击按钮 1 -24 那个按钮变为绿色,所以我知道如何改变点击事件的背景。

当每个按钮被点击时,我都有一个布尔值。

这是我目前的代码:

if (button1Clicked && button2Clicked ...)  // I have button3 through button24 as well
{
    finishButton.BackColor = Color.Green;
}

但是,当所有 24 个按钮都被单击时,该按钮仍保持红色。 我已将 button1 的输出发送到调试写入行,并且我知道单击按钮时布尔值从 false 变为 true。 我已经在修饰符选项中公开了完成按钮。

我错过了一步吗?我认为这应该很容易实现。

编辑


public partial class Form2 : Form
{
    public bool button1Clicked = false;
    .... // and other buttons are allocated the same way
}


private void button1_Click(object sender, EventArgs e)
{
    String textForClipboard = String.Format("{0}_S1_{1}", Form1.dateValue, button1.Text);
    Clipboard.SetText(textForClipboard);
    button1.BackColor = Color.Green;
    button1Clicked = true;
    System.Diagnostics.Debug.WriteLine(button1Clicked);
}

编辑


我应该在哪里设置 if 循环? 我目前有这个方法

namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        ....

        public Form2(Form parentForm)
        {
            InitializeComponent();
            mainForm = parentform;
            ....

            if (button1Clicked)
            {
                finishedButton.BackColor = Color.Green;
            }
        }
    }
}

【问题讨论】:

  • 你能不能也显示给button1Clicked赋值的代码?
  • @globetrotter 代码添加
  • 我指的是button1Clicked变成true
  • == 用于检查值,= 用于分配值。试试finishButton.BackColor = Color.Green;
  • 所有按钮的名称(不是它们的文本)button1button24

标签: c# winforms button background-color


【解决方案1】:

首先,确保条件的内部部分随时执行。 例如,您可以弹出一个消息框。 对于第一个较小的测试用例,仅检查 3 个按钮。

对于其他测试,删除整个条件并仅使用颜色变化。这行得通吗? 如果没有,那么你必须先玩这个部分。

如果它有效,那么回到你的状态,那将是泄密者。检查第一个按钮是否单击。然后是两个等等。

通过这种方式,您可以随时轻松找到答案。做一些小任务,找出问题。

勾选条件的调试点,并检查哪个标志为假。鼠标悬停在 button1clicked 上等,都应该是真的

【讨论】:

  • 我已经尝试过这些建议。单击完成按钮时会改变颜色,但单击其他​​按钮时不会改变颜色。
  • 不幸的是,这只是我的问题中的一个输入错误。它只有一个 = 登录我的代码
  • 勾选条件的调试点,并检查哪个标志为假。鼠标悬停在 button1clicked 上等,都应该是真的
【解决方案2】:

这是一个快速的解决方案,但它确实有效。它假定您的 24 个按钮被命名为(不是它们的文本)button1button24

1) 将您的 24 个按钮放在 GroupBox 中(例如 groupBox1

2) 把这个放在partial class Form2 : Form

bool[] allButtons = new bool[24];

private void button_Click(object sender, EventArgs e)
{
    var indexButton = int.Parse((((Button)sender).Name.Substring(6))) - 1;
    allButtons[indexButton] = true;
    allButtonsClicked();
}

private void allButtonsClicked()
{
    const int totalButtons = 23;
    int counter = 0;
    for (int i = 0; i < totalButtons; i++)
    {
        if (allButtons[i])
        {
            counter++;
        }
    }
    if (counter == totalButtons)
    {
        finishButton.BackColor = Color.Green;
    }
}

3) 把这个放在Form2_Load()

foreach(Control ctl in groupBox1.Controls)
    {
        if (ctl is Button)
        {
            ctl.Click += button_Click;
        }
    }

它的作用

Form2 加载时,它会循环遍历groupBox1 中的所有控件,检查它们是否为buttons 并将所有24 个按钮click 事件挂钩到button_click()。这样您就不需要声明 24 次按钮单击,因为每次单击 24 个按钮时都会触发button_click()

然后我们有一个 allButtons bool 数组,它有 24 个位置,最初都设置为 false。每次button_click() 触发时,我们都会提取在给定时间触发button_click() 的按钮名称的“数字”部分(例如,如果在给定时间触发button_click()button1,我们将采用子字符串@ 987654342@ from "button1"),将其转换为 int(因此 "1" 变为 1)并使用它来设置 allButtons[0] = true(数组是从零开始的,因此为什么 1 用于索引 @987654348 @)。当allButtons的24个元素全部变为true(在allButtonsClicked()中签入),我们将finishButton的颜色改为Color.Green

【讨论】:

  • 你,我的朋友,是一位学者,一位绅士。这种方法正是我需要的。谢谢
  • 我真的很喜欢你解释代码的作用。它使代码易于理解并帮助我弄清楚发生了什么。
  • 使用你不理解的代码是没有意义的——一个好的解决方案应该伴随着一个更好的解释!
【解决方案3】:

对环球旅行者的回答进行了小修改。 将allButtonsClicked() 更改为返回bool 而不是void

private bool allButtonsClicked()
{
    const int totalButtons = 23;
    int counter = 0;
    for (int i = 0; i < totalButtons; i++)
    {
        if (allButtons[i])
        {
            counter++;
        }
    }
    if (counter == totalButtons)
    {
        return true;
    }
    return false;
}

所以你可以这样做:

private void button_Click(object sender, EventArgs e)
{
    var indexButton = int.Parse((((Button)sender).Name.Substring(6))) - 1;
    allButtons[indexButton] = true;
    if (allButtonsClicked())
    {
        finishButton.BackColor = Color.Green;
    }
}

这只会使代码在日常语言中更具可读性和可理解性:"Whenever a button is clicked, check if each of the 24 buttons has been clicked at least once. If yes, then change the BackColor of finishButton to Green" 并将您的逻辑集中在一个地方而不是两个地方。

【讨论】:

    猜你喜欢
    • 2022-11-13
    • 1970-01-01
    • 2016-03-31
    • 2014-10-09
    • 2017-08-02
    • 1970-01-01
    • 2021-06-21
    • 2013-06-02
    • 1970-01-01
    相关资源
    最近更新 更多