【问题标题】:Change button color when clicked (multiple clicks/colors)单击时更改按钮颜色(多次单击/颜色)
【发布时间】:2012-12-06 15:55:21
【问题描述】:

我正在尝试制作一组​​ 8x8 按钮,到目前为止它可以工作。 现在我偶然发现了一个问题。 我希望按钮的颜色(背景颜色)在单击时发生变化。并在再次点击时更改为不同的颜色。

这是我目前的代码:

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        Button[,] btn = new Button[8,8];

        public Form1()
        {
            InitializeComponent();

            for (int x = 0; x < btn.GetLength(0); x++)
            {
                for (int y = 0; y < btn.GetLength(1); y++)
                {
                    btn[x,y] = new Button();
                    btn[x,y].SetBounds(40 * x, 40 * y, 40, 40);
                    btn[x,y].Click += new EventHandler(this.btnEvent_click);
                    Controls.Add(btn[x, y]);
                    btn[x,y].BackColor = Color.Black;
                }
            }

            /* 
            btn.Click += new EventHandler(this.btnEvent_click);
            btn[x,y].Text = Convert.ToString(x+","+y);
            Controls.Add(btn);
            btn[x,y].Click += new EventHandler(this.btnEvent_click);
            */
        }

        private void form1_load(object sender, EventArgs e)
        {

        }

        void btnEvent_click(object sender, EventArgs e)
        {
           (Control)sender).BackColor = Color.Red;
        }
    }
}

到目前为止,我只能将颜色更改为红色,并且我已经尝试了多个 if 和 for 语句来第二次更改颜色。

谁能帮帮我?

【问题讨论】:

  • 你能展示一下这些 if/for 语句的代码吗?

标签: c# button colors


【解决方案1】:

你试过类似的东西吗?

    void btnEvent_click(object sender, EventArgs e)
    { 
       if ((Control)sender).BackColor != Color.Red)
           (Control)sender).BackColor = Color.Red;
       else 
           (Control)sender).BackColor = Color.Green;
    }

【讨论】:

    【解决方案2】:

    试试看……它的工作原理……

    button1点击事件内部:

    Random randomGen = new Random();
    KnownColor[] names = (KnownColor[])Enum.GetValues(typeof(KnownColor));
    KnownColor randomColorName = names[randomGen.Next(names.Length)];
    Color randomColor = Color.FromKnownColor(randomColorName);
    button1.BackColor = randomColor;
    

    【讨论】:

      【解决方案3】:

      您总是可以创建一个继承按钮类的类,然后为其添加一个计数器,例如它被点击的频率,然后在每次点击时增加它,然后根据该点击更改颜色

      【讨论】:

        【解决方案4】:

        您可以使用 Color.FromArgb(int) 方法和 Random 类。见下文:

        Random rnd = new Random();
        
        //Alpha set allways 255
        Color.FromArgb(255, rnd.Next(255), rnd.Next(255), rnd.Next(255));
        
        //Or Completly random
        Color.FromArgb(rnd.Next());
        

        【讨论】:

          【解决方案5】:

          如果你想在一组固定的颜色中“循环”,你可以尝试这样的事情:

          void btnEvent_click(object sender, EventArgs e)
          {
              var button = (Button)sender;
              switch(button.BackColor)
              {
                  case Color.Black: { button.BackColor= Color.Red;} break;
                  case Color.Red: { button.BackColor= Color.Blue;} break;
                  case Color.Blue: { button.BackColor= Color.Green;} break;
                  // and so on ... don't forget the default clause, just in case
                  default: { button.BackColor= Color.Black;} break;
              }
          }
          

          【讨论】:

            【解决方案6】:

            您可以创建一个新类,继承自 Button 并在内部处理颜色变化,如下所示:

            class TwoColorButton : Button
            {
                private int stateCounter = 0;
                private Color[] states = new Color[] { Color.Black, Color.Red };
            
                public TwoColorButton()
                    : base()
                {
                    this.BackColor = states[stateCounter];
                    this.Click += this.clickHandler;
                }
            
                protected void clickHandler(object sender, EventArgs e)
                {
                    stateCounter = stateCounter == 0 ? 1 : 0;
                    this.BackColor = states[stateCounter];
                }
            }
            

            【讨论】:

              【解决方案7】:

              您好,您可以临时使用以下解决方案:

              void btnEvent_click(object sender, EventArgs e)
              {
                  Control ctrl = ((Control)sender);
                  switch (ctrl.BackColor.Name)
                  {
                      case "Red":
                          ctrl.BackColor = Color.Yellow;
                          break;
                      case "Black":
                          ctrl.BackColor = Color.White;
                          break;
                      case "White":
                          ctrl.BackColor = Color.Red;
                          break;
                      case "Yellow":
                          ctrl.BackColor = Color.Purple;
                          break;
                      default:
                          ctrl.BackColor = Color.Red;
                          break;
                  }
              }
              

              我知道也可以有更好的解决方案,但同时你可以使用这个...你也可以根据需要在 switch 语句中添加更多颜色

              【讨论】:

              • 谢谢,成功了!你知道我怎么能喜欢点击一些按钮并改变颜色吗?然后它会记住按钮的颜色(如保存文件)我需要它来配置我的 led 立方体
              • 对不起,我没看懂你的问题,能不能详细解释一下
              • 好吧,如果我运行程序并单击一些按钮(所以其中一些是绿色的,其他的是红色的)。我需要“保存”该布局。
              • 嘿,有人在thisartical 中回答了这个问题
              猜你喜欢
              • 2021-07-07
              • 1970-01-01
              • 2014-01-10
              • 1970-01-01
              • 2016-09-08
              • 1970-01-01
              • 2018-02-08
              • 2021-07-21
              • 2014-10-09
              相关资源
              最近更新 更多